GP-2677: Fix and enable tests

This commit is contained in:
Dan 2023-08-04 14:29:45 -04:00 committed by Ryan Kurtz
parent 689064b590
commit 75677b729f
31 changed files with 236 additions and 274 deletions

View File

@ -34,8 +34,6 @@ dependencies {
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-Debugging', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger-gadp', configuration: 'testArtifacts')
pypkgInstall project(path: ':Debugger-rmi-trace', configuration: 'pypkgInstall')
}
tasks.nodepJar {

View File

@ -1,6 +1,5 @@
##VERSION: 2.0
##MODULE IP: JSch License
DEVNOTES.txt||GHIDRA||||END|
Module.manifest||GHIDRA||||END|
data/scripts/fallback_info_proc_mappings.gdb||GHIDRA||||END|
data/scripts/fallback_maintenance_info_sections.gdb||GHIDRA||||END|
@ -8,6 +7,6 @@ data/scripts/getpid-linux-i386.gdb||GHIDRA||||END|
data/scripts/wine32_info_proc_mappings.gdb||GHIDRA||||END|
src/main/py/LICENSE||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/ghidragdb/schema.xml||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidragdb/schema.xml||GHIDRA||||END|
src/main/py/tests/EMPTY||GHIDRA||||END|

View File

@ -34,8 +34,6 @@ dependencies {
testImplementation project(path: ':Framework-AsyncComm', configuration: 'testArtifacts')
testImplementation project(path: ':Framework-Debugging', configuration: 'testArtifacts')
testImplementation project(path: ':Debugger-gadp', configuration: 'testArtifacts')
pypkgInstall project(path: ':Debugger-rmi-trace', configuration: 'pypkgInstall')
}
tasks.nodepJar {

View File

@ -9,5 +9,5 @@ src/llvm-project/lldb/bindings/java/java-typemaps.swig||Apache License 2.0 with
src/llvm-project/lldb/bindings/java/java.swig||Apache License 2.0 with LLVM Exceptions||||END|
src/main/py/LICENSE||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/ghidralldb/schema.xml||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidralldb/schema.xml||GHIDRA||||END|

View File

@ -20,7 +20,9 @@ import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import generic.jar.ResourceFile;
import ghidra.framework.Application;
import ghidra.framework.Platform;
import ghidra.util.Msg;
public class DummyProc implements AutoCloseable {
@ -28,15 +30,34 @@ public class DummyProc implements AutoCloseable {
public final long pid;
public static String which(String cmd) {
// Try the os/<platform>/ directory
try {
return Application.getOSFile(cmd).getAbsolutePath();
}
catch (Exception e) {
// fallback to system
// just try next strategy
}
// Try the build/exe/<cmd>/ and build/exe/<cmd>/<platform>/ directory
for (ResourceFile modRoot : Application.getModuleRootDirectories()) {
ResourceFile exe = new ResourceFile(modRoot, "build/exe/" + cmd + "/" + cmd);
if (exe.exists() && exe.getFile(false).canExecute()) {
return exe.getAbsolutePath();
}
ResourceFile platformExe = new ResourceFile(modRoot,
"build/exe/" + cmd + "/" + Platform.CURRENT_PLATFORM.getDirectoryName() + "/" +
cmd);
if (platformExe.exists() && platformExe.getFile(false).canExecute()) {
return platformExe.getAbsolutePath();
}
}
// Try the current directory
if (new File(cmd).canExecute()) {
return cmd;
}
// Try the system PATH
String line;
try {
boolean isWindows = System.getProperty("os.name").toLowerCase().contains("windows");

View File

@ -78,9 +78,8 @@ ext.addExports([
'java.desktop/sun.java2d=ALL-UNNAMED'
])
// The CI system runs these tests as root and pip complains about using venv
// Disable them for now
/* integrationTest {
dependsOn { project(':Debugger-agent-gdb').installPyPackage }
dependsOn { project(':Debugger-agent-lldb').installPyPackage }
} */
integrationTest {
dependsOn { project(':Debugger-rmi-trace').assemblePyPackage }
dependsOn { project(':Debugger-agent-gdb').assemblePyPackage }
dependsOn { project(':Debugger-agent-lldb').assemblePyPackage }
}

View File

@ -15,7 +15,7 @@
*/
package agent.gdb.rmi;
import static org.hamcrest.Matchers.*;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.*;
import java.io.*;
@ -31,7 +31,6 @@ import java.util.stream.Collectors;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.junit.Before;
import org.junit.BeforeClass;
import ghidra.app.plugin.core.debug.gui.AbstractGhidraHeadedDebuggerGUITest;
import ghidra.app.plugin.core.debug.service.rmi.trace.*;
@ -39,7 +38,7 @@ import ghidra.app.plugin.core.debug.utils.ManagedDomainObject;
import ghidra.app.services.TraceRmiService;
import ghidra.dbg.target.TargetExecutionStateful.TargetExecutionState;
import ghidra.dbg.testutil.DummyProc;
import ghidra.framework.TestApplicationUtils;
import ghidra.framework.*;
import ghidra.framework.main.ApplicationLevelOnlyPlugin;
import ghidra.framework.model.DomainFile;
import ghidra.framework.plugintool.Plugin;
@ -54,6 +53,19 @@ import ghidra.util.Msg;
import ghidra.util.NumericUtilities;
public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebuggerGUITest {
/**
* The tests are touchy about anything being printed on stderr, because that's usually where
* Python stack traces go that otherwise are ignored. Unfortunately, GDB also emits some
* warnings there, and these are more common in containers where permissions and resources are
* more restricted. Thus, we add some commands here to disable the features that commonly cause
* these warnings: Leave ASLR alone, and don't try to display source code.
*/
public static final String PREAMBLE = """
set python print-stack full
python import ghidragdb
set disable-randomization off
set source open off
""";
// Connecting should be the first thing the script does, so use a tight timeout.
protected static final int CONNECT_TIMEOUT_MS = 3000;
protected static final int TIMEOUT_SECONDS = 300;
@ -84,13 +96,24 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg
// @BeforeClass
public static void setupPython() throws Throwable {
new ProcessBuilder("gradle", "Debugger-agent-gdb:installPyPackage")
new ProcessBuilder("gradle", "Debugger-agent-gdb:assemblePyPackage")
.directory(TestApplicationUtils.getInstallationDirectory())
.inheritIO()
.start()
.waitFor();
}
protected void setPythonPath(ProcessBuilder pb) throws IOException {
String sep =
OperatingSystem.CURRENT_OPERATING_SYSTEM == OperatingSystem.WINDOWS ? ";" : ":";
String rmiPyPkg = Application.getModuleSubDirectory("Debugger-rmi-trace",
"build/pypkg/src").getAbsolutePath();
String gdbPyPkg = Application.getModuleSubDirectory("Debugger-agent-gdb",
"build/pypkg/src").getAbsolutePath();
String add = rmiPyPkg + sep + gdbPyPkg;
pb.environment().compute("PYTHONPATH", (k, v) -> v == null ? add : (v + sep + add));
}
protected Path getGdbPath() {
return Paths.get(DummyProc.which("gdb"));
}
@ -147,6 +170,8 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg
@SuppressWarnings("resource") // Do not close stdin
protected ExecInGdb execInGdb(String script) throws IOException {
ProcessBuilder pb = new ProcessBuilder(gdbPath.toString());
setPythonPath(pb);
// If commands come from file, GDB will quit after EOF.
Msg.info(this, "outFile: " + outFile);
Msg.info(this, "errFile: " + errFile);
@ -283,10 +308,9 @@ public abstract class AbstractGdbTraceRmiTest extends AbstractGhidraHeadedDebugg
protected GdbAndHandler startAndConnectGdb() throws Exception {
return startAndConnectGdb(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@SuppressWarnings("resource")

View File

@ -25,7 +25,6 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.junit.Ignore;
import org.junit.Test;
import db.Transaction;
@ -51,7 +50,6 @@ import ghidra.trace.model.target.*;
import ghidra.trace.model.time.TraceSnapshot;
import ghidra.util.Msg;
@Ignore("Cannot install python packages in CI")
public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
//@Test
@ -69,11 +67,10 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
public void testConnectErrorNoArg() throws Exception {
try {
runThrowError("""
set python print-stack full
python import ghidragdb
%s
ghidra trace connect
quit
""");
""".formatted(PREAMBLE));
fail();
}
catch (GdbError e) {
@ -85,35 +82,32 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testConnect() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@Test
public void testDisconnect() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace disconnect
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@Test
public void testStartTraceDefaults() throws Exception {
// Default name and lcsp
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
ghidra trace start
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals("x86:LE:64:default",
@ -126,12 +120,11 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testStartTraceDefaultNoFile() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace start
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
assertThat(mdo.get(), instanceOf(Trace.class));
}
@ -140,15 +133,14 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testStartTraceCustomize() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
set ghidra-language Toy:BE:64:default
set ghidra-compiler default
ghidra trace start myToy
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
DomainFile dfMyToy = env.getProject().getProjectData().getFile("/New Traces/myToy");
assertNotNull(dfMyToy);
try (ManagedDomainObject mdo = new ManagedDomainObject(dfMyToy, false, false, monitor)) {
@ -164,14 +156,13 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
public void testStopTrace() throws Exception {
// TODO: This test assumes gdb and the target file bash are x86-64
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
ghidra trace start
ghidra trace stop
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
DomainFile dfBash = env.getProject().getProjectData().getFile("/New Traces/gdb/bash");
assertNotNull(dfBash);
// TODO: Given the 'quit' command, I'm not sure this assertion is checking anything.
@ -184,10 +175,8 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
String out = runThrowError(addr -> {
refAddr.set(addr);
return """
set python print-stack full
%s
file bash
echo \\n
python import ghidragdb
echo \\n---Import---\\n
ghidra trace info
ghidra trace connect %s
@ -203,7 +192,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---Disconnect---\\n
ghidra trace info
quit
""".formatted(addr);
""".formatted(PREAMBLE, addr);
});
assertEquals("""
@ -230,8 +219,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
public void testLcsp() throws Exception {
// TODO: This test assumes x86-64 on test system
String out = runThrowError("""
set python print-stack full
python import ghidragdb
%s
echo \\n---Import---\\n
ghidra trace lcsp
echo \\n---\\n
@ -245,7 +233,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---Compiler---\\n
ghidra trace lcsp
quit
""");
""".formatted(PREAMBLE));
assertEquals("""
Selected Ghidra language: DATA:LE:64:default
Selected Ghidra compiler: pointer64""",
@ -270,8 +258,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
// For sanity check, verify failing to save drops data
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
ghidra trace start no-save
@ -279,15 +266,14 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace new-snap "Scripted snapshot"
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/no-save")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals(0, tb.trace.getTimeManager().getAllSnapshots().size());
}
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
ghidra trace start save
@ -296,7 +282,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
ghidra trace save
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/save")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals(1, tb.trace.getTimeManager().getAllSnapshots().size());
@ -306,8 +292,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testSnapshot() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
ghidra trace start
@ -315,7 +300,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace new-snap "Scripted snapshot"
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceSnapshot snapshot = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots());
@ -327,8 +312,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutmem() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -342,7 +326,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -358,8 +342,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutmemInferior2() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
add-inferior
inferior 2
@ -375,7 +358,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
AddressSpace ram2 = tb.trace.getBaseAddressFactory().getAddressSpace("ram2");
@ -393,8 +376,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutmemState() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -408,7 +390,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -426,8 +408,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testDelmem() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -442,7 +423,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -462,8 +443,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
.mapToObj(Integer::toString)
.collect(Collectors.joining(",", "{", "}"));
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -476,7 +456,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr, count));
""".formatted(PREAMBLE, addr, count));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -505,8 +485,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
.mapToObj(Integer::toString)
.collect(Collectors.joining(",", "{", "}"));
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -520,7 +499,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr, count));
""".formatted(PREAMBLE, addr, count));
// The spaces will be left over, but the values should be zeroed
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
@ -545,8 +524,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testCreateObj() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace start
ghidra trace tx-start "Create Object"
@ -555,7 +533,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -570,8 +548,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testInsertObj() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace start
ghidra trace tx-start "Create Object"
@ -581,7 +558,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -597,8 +574,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testRemoveObj() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace start
ghidra trace tx-start "Create Object"
@ -608,7 +584,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace remove-obj Test.Objects[1]
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -624,8 +600,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
throws Exception {
String expPrint = DummyProc.which("expPrint");
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file %s
start
@ -638,7 +613,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr, expPrint, extra, gdbExpr, gtype));
""".formatted(PREAMBLE, addr, expPrint, extra, gdbExpr, gtype));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/expPrint")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -781,8 +756,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testRetainValues() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
set language c++
@ -799,7 +773,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -818,8 +792,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testGetObj() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
ghidra trace start
ghidra trace tx-start "Create Object"
@ -831,7 +804,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace get-obj Test.Objects[1]
echo \\n---
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -846,8 +819,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
public void testGetValues() throws Exception {
String expPrint = DummyProc.which("expPrint");
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file %s
set language c++
@ -878,7 +850,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr, expPrint));
""".formatted(PREAMBLE, addr, expPrint));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/expPrint")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals("""
@ -905,8 +877,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testGetValuesRng() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
set language c++
@ -922,7 +893,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
echo \\n---
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals("""
@ -935,8 +906,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testActivateObject() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
set language c++
@ -949,7 +919,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace activate Test.Objects[1]
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
assertSame(mdo.get(), traceManager.getCurrentTrace());
assertEquals("Test.Objects[1]",
@ -960,8 +930,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testDisassemble() throws Exception {
String out = runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
set language c++
@ -975,7 +944,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Not concerned about specifics, so long as disassembly occurs
@ -991,8 +960,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutInferiors() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
add-inferior
ghidra trace start
@ -1000,7 +968,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace put-inferiors
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1015,8 +983,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutAvailable() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
add-inferior
ghidra trace start
@ -1024,7 +991,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace put-available
ghidra trace tx-commit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1039,8 +1006,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutBreakpoints() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1055,7 +1021,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
List<TraceObjectValue> infBreakLocVals = tb.trace.getObjectManager()
@ -1090,8 +1056,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutEnvironment() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1101,7 +1066,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Assumes GDB on Linux amd64
@ -1116,8 +1081,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutRegions() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1127,7 +1091,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1140,8 +1104,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutModules() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1151,7 +1114,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1165,8 +1128,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutThreads() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1176,7 +1138,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1187,8 +1149,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
@Test
public void testPutFrames() throws Exception {
runThrowError(addr -> """
set python print-stack full
python import ghidragdb
%s
ghidra trace connect %s
file bash
start
@ -1200,7 +1161,7 @@ public class GdbCommandsTest extends AbstractGdbTraceRmiTest {
ghidra trace tx-commit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/gdb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics

View File

@ -37,7 +37,6 @@ import ghidra.trace.model.memory.TraceMemorySpace;
import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.time.TraceSnapshot;
@Ignore("Cannot install python packages in CI")
public class GdbHooksTest extends AbstractGdbTraceRmiTest {
private static final long RUN_TIMEOUT_MS = 20000;
private static final long RETRY_MS = 500;

View File

@ -22,7 +22,6 @@ import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.junit.Ignore;
import org.junit.Test;
import db.Transaction;
@ -49,7 +48,6 @@ import ghidra.trace.model.modules.TraceModule;
import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue;
@Ignore("Cannot install python packages in CI")
public class GdbMethodsTest extends AbstractGdbTraceRmiTest {
@Test

View File

@ -36,7 +36,7 @@ import ghidra.app.plugin.core.debug.service.rmi.trace.*;
import ghidra.app.plugin.core.debug.utils.ManagedDomainObject;
import ghidra.app.services.TraceRmiService;
import ghidra.dbg.testutil.DummyProc;
import ghidra.framework.TestApplicationUtils;
import ghidra.framework.*;
import ghidra.framework.main.ApplicationLevelOnlyPlugin;
import ghidra.framework.model.DomainFile;
import ghidra.framework.plugintool.Plugin;
@ -53,6 +53,14 @@ import ghidra.util.Msg;
import ghidra.util.NumericUtilities;
public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebuggerGUITest {
/**
* Some features have to be disabled to avoid permissions issues in the test container. Namely,
* don't try to disable ASLR.
*/
public static final String PREAMBLE = """
script import ghidralldb
settings set target.disable-aslr false
""";
// Connecting should be the first thing the script does, so use a tight timeout.
protected static final int CONNECT_TIMEOUT_MS = 3000;
protected static final int TIMEOUT_SECONDS = 300;
@ -87,18 +95,34 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug
// @BeforeClass
public static void setupPython() throws Throwable {
new ProcessBuilder("gradle", "Debugger-agent-lldb:installPyPackage")
new ProcessBuilder("gradle", "Debugger-agent-lldb:assemblePyPackage")
.directory(TestApplicationUtils.getInstallationDirectory())
.inheritIO()
.start()
.waitFor();
}
protected void setPythonPath(ProcessBuilder pb) throws IOException {
String sep =
OperatingSystem.CURRENT_OPERATING_SYSTEM == OperatingSystem.WINDOWS ? ";" : ":";
String rmiPyPkg = Application.getModuleSubDirectory("Debugger-rmi-trace",
"build/pypkg/src").getAbsolutePath();
String gdbPyPkg = Application.getModuleSubDirectory("Debugger-agent-lldb",
"build/pypkg/src").getAbsolutePath();
String add = rmiPyPkg + sep + gdbPyPkg;
pb.environment().compute("PYTHONPATH", (k, v) -> v == null ? add : (v + sep + add));
}
@Before
public void setupTraceRmi() throws Throwable {
traceRmi = addPlugin(tool, TraceRmiPlugin.class);
lldbPath = Paths.get(DummyProc.which("lldb"));
try {
lldbPath = Paths.get(DummyProc.which("lldb-16"));
}
catch (RuntimeException e) {
lldbPath = Paths.get(DummyProc.which("lldb"));
}
outFile = Files.createTempFile("lldbout", null);
errFile = Files.createTempFile("lldberr", null);
}
@ -146,6 +170,8 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug
@SuppressWarnings("resource") // Do not close stdin
protected ExecInLldb execInLldb(String script) throws IOException {
ProcessBuilder pb = new ProcessBuilder(lldbPath.toString());
setPythonPath(pb);
// If commands come from file, LLDB will quit after EOF.
Msg.info(this, "outFile: " + outFile);
Msg.info(this, "errFile: " + errFile);
@ -257,9 +283,9 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug
protected LldbAndHandler startAndConnectLldb() throws Exception {
return startAndConnectLldb(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@SuppressWarnings("resource")
@ -397,6 +423,7 @@ public abstract class AbstractLldbTraceRmiTest extends AbstractGhidraHeadedDebug
}
protected record Tabular(List<String> headings, List<Row> rows) {
static final Pattern SPACES = Pattern.compile(" *");
static final Pattern WORDS = Pattern.compile("\\w+");

View File

@ -26,7 +26,6 @@ import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import org.junit.Ignore;
import org.junit.Test;
import generic.Unique;
@ -47,7 +46,6 @@ import ghidra.trace.model.target.*;
import ghidra.trace.model.time.TraceSnapshot;
import ghidra.util.Msg;
@Ignore("Cannot install python packages in CI")
public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
//@Test
@ -80,32 +78,32 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testConnect() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@Test
public void testDisconnect() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_disconnect
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
}
@Test
public void testStartTraceDefaults() throws Exception {
// Default name and lcsp
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
ghidra_trace_start
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals("x86:LE:64:default",
@ -118,11 +116,11 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testStartTraceDefaultNoFile() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
assertThat(mdo.get(), instanceOf(Trace.class));
}
@ -132,7 +130,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
public void testStartTraceCustomize() throws Exception {
runThrowError(
addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
script ghidralldb.util.set_convenience_variable('ghidra-language','Toy:BE:64:default')
@ -140,7 +138,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_start myToy
quit
"""
.formatted(addr));
.formatted(PREAMBLE, addr));
DomainFile dfMyToy = env.getProject().getProjectData().getFile("/New Traces/myToy");
assertNotNull(dfMyToy);
try (ManagedDomainObject mdo = new ManagedDomainObject(dfMyToy, false, false, monitor)) {
@ -156,13 +154,13 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
public void testStopTrace() throws Exception {
// TODO: This test assumes lldb and the target file bash are x86-64
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
ghidra_trace_start
ghidra_trace_stop
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
DomainFile dfBash = env.getProject().getProjectData().getFile("/New Traces/lldb/bash");
assertNotNull(dfBash);
// TODO: Given the 'quit' command, I'm not sure this assertion is checking anything.
@ -176,7 +174,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
refAddr.set(addr);
return """
file bash
script import ghidralldb
%s
_mark_ ---Import---
ghidra_trace_info
ghidra_trace_connect %s
@ -192,7 +190,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---Disconnect---
ghidra_trace_info
quit
""".formatted(addr);
""".formatted(PREAMBLE, addr);
});
assertEquals("""
@ -260,7 +258,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
// For sanity check, verify failing to save drops data
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
ghidra_trace_start no-save
@ -268,14 +266,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_new_snap "Scripted snapshot"
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/no-save")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals(0, tb.trace.getTimeManager().getAllSnapshots().size());
}
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
ghidra_trace_start save
@ -284,7 +282,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
ghidra_trace_save
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/save")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals(1, tb.trace.getTimeManager().getAllSnapshots().size());
@ -294,7 +292,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testSnapshot() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
ghidra_trace_start
@ -302,7 +300,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_new_snap "Scripted snapshot"
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceSnapshot snapshot = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots());
@ -314,7 +312,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutmem() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -328,7 +326,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -345,7 +343,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutmemProcess2() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -359,7 +357,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
AddressSpace ram2 = tb.trace.getBaseAddressFactory().getAddressSpace("ram");
@ -378,7 +376,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
public void testPutmemState() throws Exception {
String out = runThrowError(addr -> """
settings set interpreter.echo-commands false
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -392,7 +390,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -414,7 +412,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testDelmem() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -429,7 +427,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -449,7 +447,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
.mapToObj(Integer::toString)
.collect(Collectors.joining(",", "{", "}"));
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -463,7 +461,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr, count));
""".formatted(PREAMBLE, addr, count));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
long snap = Unique.assertOne(tb.trace.getTimeManager().getAllSnapshots()).getKey();
@ -501,7 +499,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
.mapToObj(Integer::toString)
.collect(Collectors.joining(",", "{", "}"));
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -515,7 +513,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr, count));
""".formatted(PREAMBLE, addr, count));
// The spaces will be left over, but the values should be zeroed
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
@ -549,7 +547,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testCreateObj() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
ghidra_trace_txstart "Create Object"
@ -558,7 +556,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -573,7 +571,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testInsertObj() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
ghidra_trace_txstart "Create Object"
@ -583,7 +581,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -599,7 +597,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testRemoveObj() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -612,7 +610,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -627,7 +625,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
protected <T> T runTestSetValue(String extra, String lldbExpr, String gtype)
throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -640,7 +638,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr, extra, lldbExpr, gtype));
""".formatted(PREAMBLE, addr, extra, lldbExpr, gtype));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -782,7 +780,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testRetainValues() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
#set language c++
@ -799,7 +797,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -818,7 +816,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testGetObj() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
ghidra_trace_txstart "Create Object"
@ -830,7 +828,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_get_obj Test.Objects[1]
_mark_ ---")
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
TraceObject object = tb.trace.getObjectManager()
@ -844,7 +842,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testGetValues() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -880,7 +878,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals(
@ -910,7 +908,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testGetValuesRng() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
#set language c++
@ -926,7 +924,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
_mark_ ---")
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
assertEquals("""
@ -947,7 +945,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
//@Test
public void testActivateObject() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
#set language c++
@ -960,7 +958,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_activate Test.Objects[1]
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
assertSame(mdo.get(), traceManager.getCurrentTrace());
assertEquals("Test.Objects[1]",
@ -971,7 +969,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testDisassemble() throws Exception {
String out = runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
#set language c++
@ -985,7 +983,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Not concerned about specifics, so long as disassembly occurs
@ -1001,14 +999,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutProcesses() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
ghidra_trace_txstart "Tx"
ghidra_trace_put_processes
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1023,14 +1021,14 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutAvailable() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
ghidra_trace_start
ghidra_trace_txstart "Tx"
ghidra_trace_put_available
ghidra_trace_txcommit
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/noname")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1045,7 +1043,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutBreakpoints() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1057,7 +1055,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
List<TraceObjectValue> procBreakLocVals = tb.trace.getObjectManager()
@ -1082,7 +1080,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutWatchpoints() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1095,7 +1093,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
List<TraceObjectValue> procWatchLocVals = tb.trace.getObjectManager()
@ -1126,7 +1124,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutEnvironment() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1136,7 +1134,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Assumes LLDB on Linux amd64
@ -1152,7 +1150,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutRegions() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1162,7 +1160,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1175,7 +1173,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutModules() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1185,7 +1183,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1199,7 +1197,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testPutThreads() throws Exception {
runThrowError(addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
file bash
process launch --stop-at-entry
@ -1209,7 +1207,7 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
ghidra_trace_txcommit
kill
quit
""".formatted(addr));
""".formatted(PREAMBLE, addr));
try (ManagedDomainObject mdo = openDomainObject("/New Traces/lldb/bash")) {
tb = new ToyDBTraceBuilder((Trace) mdo.get());
// Would be nice to control / validate the specifics
@ -1252,9 +1250,9 @@ public class LldbCommandsTest extends AbstractLldbTraceRmiTest {
@Test
public void testMinimal() throws Exception {
Function<String, String> scriptSupplier = addr -> """
script import ghidralldb
%s
ghidra_trace_connect %s
""".formatted(addr);
""".formatted(PREAMBLE, addr);
try (LldbAndHandler conn = startAndConnectLldb(scriptSupplier)) {
conn.execute("script print('FINISHED')");
conn.execute("quit");

View File

@ -38,7 +38,6 @@ import ghidra.trace.model.memory.TraceMemorySpace;
import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.time.TraceSnapshot;
@Ignore("Cannot install python packages in CI")
public class LldbHooksTest extends AbstractLldbTraceRmiTest {
private static final long RUN_TIMEOUT_MS = 20000;
private static final long RETRY_MS = 500;

View File

@ -21,7 +21,6 @@ import static org.junit.Assert.*;
import java.util.*;
import org.junit.Ignore;
import org.junit.Test;
import generic.Unique;
@ -43,7 +42,6 @@ import ghidra.trace.model.modules.TraceModule;
import ghidra.trace.model.target.TraceObject;
import ghidra.trace.model.target.TraceObjectValue;
@Ignore("Cannot install python packages in CI")
public class LldbMethodsTest extends AbstractLldbTraceRmiTest {
@Test

View File

@ -13,74 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
configurations {
pypkgInstall
}
task assemblePyPackage(type: Copy) {
from "src/main/py"
into "build/pypkg/"
}
def getGdbPython() {
def out = new ByteArrayOutputStream()
exec {
commandLine "gdb", "--batch"
args "-ex", "python import sys"
args "-ex", "python print(f'python{sys.version_info.major}.{sys.version_info.minor}')"
standardOutput = out
}
return "$out".strip()
}
def getLldbPython() {
def out = new ByteArrayOutputStream()
exec {
commandLine "lldb", "--batch"
args "-ex", "python import sys"
args "-ex", "python print(f'python{sys.version_info.major}.{sys.version_info.minor}')"
standardOutput = out
}
return "$out".strip()
}
task configureBuildPyPackage {
doLast {
def gdbPython = getGdbPython()
buildPyPackage.commandLine gdbPython, "-m", "build"
}
}
task buildPyPackage(type: Exec) {
dependsOn(configureBuildPyPackage)
ext.dist = { file("build/pypkg/dist") }
inputs.files(assemblePyPackage)
outputs.dir(dist)
workingDir { "build/pypkg" }
}
task configureInstallPyPackage {
dependsOn(configurations.pypkgInstall)
doLast {
def gdbPython = getGdbPython()
installPyPackage.commandLine gdbPython, "-m", "pip", "install", "--force-reinstall"
installPyPackage.args configurations.pypkgInstall.filter { f -> !f.name.endsWith(".jar") }
installPyPackage.args file("build/pypkg")
}
}
task installPyPackage(type: Exec) {
dependsOn(configureInstallPyPackage)
inputs.files(assemblePyPackage)
}
task phonyJarPyPackage(type: Jar) {
dependsOn(assemblePyPackage)
}
afterEvaluate {
artifacts {
pypkgInstall file("build/pypkg")
pypkgInstall phonyJarPyPackage
}
commandLine "python", "-m", "build"
}