mirror of
https://github.com/NationalSecurityAgency/ghidra
synced 2024-07-02 16:00:15 +00:00
GP-2677: Fix and enable tests
This commit is contained in:
parent
689064b590
commit
75677b729f
|
@ -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 {
|
||||
|
|
|
@ -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|
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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|
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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 }
|
||||
}
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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+");
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user