Merge remote-tracking branch 'origin/GP-2781_d-millar_lldb_fixes--SQUASHED'

This commit is contained in:
Ryan Kurtz 2022-11-16 02:36:32 -05:00
commit da9e178765
9 changed files with 42 additions and 16 deletions

View file

@ -385,7 +385,7 @@ public interface DebugClient extends DebugClientReentrant {
SBProcess attachProcess(DebugServerId si, int keyType, String key, boolean wait, boolean async);
SBProcess connectRemote(DebugServerId localServer, String key, boolean async);
SBProcess connectRemote(DebugServerId localServer, String key, boolean auto, boolean async);
SBProcess createProcess(DebugServerId si, String fileName);

View file

@ -23,6 +23,7 @@ import SWIG.*;
import agent.lldb.manager.LldbEvent;
import agent.lldb.manager.LldbManager;
import agent.lldb.manager.evt.*;
import agent.lldb.manager.impl.LldbManagerImpl;
import ghidra.util.Msg;
public class DebugClientImpl implements DebugClient {
@ -112,10 +113,14 @@ public class DebugClientImpl implements DebugClient {
}
@Override
public SBProcess connectRemote(DebugServerId si, String key, boolean async) {
public SBProcess connectRemote(DebugServerId si, String key, boolean auto, boolean async) {
SBListener listener = new SBListener();
SBError error = new SBError();
session = createNullSession();
if (!auto) {
((LldbManagerImpl) manager).addSessionIfAbsent(session);
return null;
}
SBProcess process = session.ConnectRemote(listener, key, null, error);
if (!error.Success()) {
Msg.error(this, error.GetType() + " while attaching to " + key);

View file

@ -404,7 +404,7 @@ public interface LldbManager extends AutoCloseable, LldbBreakpointInsertions {
CompletableFuture<?> attach(String url, boolean wait, boolean async);
CompletableFuture<?> connect(String url, boolean async);
CompletableFuture<?> connect(String url, boolean auto, boolean async);
CompletableFuture<?> launch(String fileName, List<String> args);

View file

@ -44,7 +44,9 @@ public class LldbListAvailableProcessesCommand
for (int i = 3; i < lines.length; i++) {
String[] fields = lines[i].split("\\s+");
try {
result.add(new ImmutablePair<String,String>(fields[0], fields[fields.length-1]));
if (fields[0].matches("[0-9]+") && fields[1].matches("[0-9]+")) {
result.add(new ImmutablePair<String,String>(fields[0], fields[fields.length-1]));
}
} catch (Exception e) {
Msg.error(this, e.getMessage());
}

View file

@ -33,15 +33,19 @@ public class LldbRemoteConnectionCommand extends AbstractLldbCommand<Set<SBThrea
private LldbProcessCreatedEvent created = null;
private boolean completed = false;
private String key;
private boolean auto = true;
private boolean async = false;
public LldbRemoteConnectionCommand(LldbManagerImpl manager, String key) {
this(manager, key, false);
this(manager, key, true, false);
}
public LldbRemoteConnectionCommand(LldbManagerImpl manager, String key, boolean async) {
public LldbRemoteConnectionCommand(LldbManagerImpl manager, String key, boolean auto,
boolean async) {
super(manager);
this.key = key;
this.auto = auto;
this.async = async;
}
@Override
@ -74,6 +78,6 @@ public class LldbRemoteConnectionCommand extends AbstractLldbCommand<Set<SBThrea
@Override
public void invoke() {
DebugClient client = manager.getClient();
client.connectRemote(client.getLocalServer(), key, async);
client.connectRemote(client.getLocalServer(), key, auto, async);
}
}

View file

@ -228,12 +228,15 @@ public class LldbManagerImpl implements LldbManager {
if (process.IsValid()) {
DebugProcessInfo info = new DebugProcessInfo(process);
if (!map.containsKey(id)) {
getClient().processEvent(new LldbProcessCreatedEvent(info));
if (!info.state.equals(StateType.eStateUnloaded)) {
getClient().processEvent(new LldbProcessCreatedEvent(info));
map.put(id, process);
}
}
else {
getClient().processEvent(new LldbProcessReplacedEvent(info));
map.put(id, process);
}
map.put(id, process);
}
}
}
@ -268,6 +271,7 @@ public class LldbManagerImpl implements LldbManager {
public void addSessionIfAbsent(SBTarget session) {
synchronized (sessions) {
this.currentSession = eventSession = session;
String id = DebugClient.getId(session);
SBTarget pred = sessions.get(id);
if (!sessions.containsKey(id) || !session.equals(pred)) {
@ -1078,7 +1082,9 @@ public class LldbManagerImpl implements LldbManager {
}
if (status.equals(DebugStatus.GO)) {
waiting = true;
processEvent(new LldbRunningEvent(DebugClient.getId(eventThread)));
if (eventThread != null) {
processEvent(new LldbRunningEvent(DebugClient.getId(eventThread)));
}
return DebugStatus.GO;
}
@ -1471,8 +1477,8 @@ public class LldbManagerImpl implements LldbManager {
}
@Override
public CompletableFuture<?> connect(String url, boolean async) {
return execute(new LldbRemoteConnectionCommand(this, url, async));
public CompletableFuture<?> connect(String url, boolean auto, boolean async) {
return execute(new LldbRemoteConnectionCommand(this, url, auto, async));
}
@Override

View file

@ -91,7 +91,9 @@ public class LldbModelTargetModuleSectionContainerImpl extends LldbModelTargetOb
}
}
}
module.setRange(new AddressRangeImpl(min, max));
if (min != null && max != null) {
module.setRange(new AddressRangeImpl(min, max));
}
}
public SBModule getModule() {

View file

@ -70,8 +70,11 @@ public class LldbModelTargetProcessRemoteConnectorImpl extends LldbModelTargetOb
String.class, "Port", true, "12345", "Port", "port for connection");
map.put("Port", p1);
ParameterDescription<Boolean> p2 = ParameterDescription.create(
Boolean.class, "Auto", false, true, "Auto", "connect automatically");
map.put("Auto", p2);
ParameterDescription<Boolean> p3 = ParameterDescription.create(
Boolean.class, "Async", false, true, "Async", "connect asynchronously");
map.put("Async", p2);
map.put("Async", p3);
return map;
}
@ -84,10 +87,11 @@ public class LldbModelTargetProcessRemoteConnectorImpl extends LldbModelTargetOb
public CompletableFuture<Void> launch(Map<String, ?> args) {
String host = (String) args.get("Host");
String port = (String) args.get("Port");
String url = "connect://"+host+":"+port;
String url = "connect://" + host + ":" + port;
Boolean auto = (Boolean) args.get("Auto");
Boolean async = (Boolean) args.get("Async");
return AsyncUtils.sequence(TypeSpec.VOID).then(seq -> {
getManager().connect(url, async).handle(seq::nextIgnore);
getManager().connect(url, auto, async).handle(seq::nextIgnore);
}).finish().exceptionally((exc) -> {
throw new DebuggerUserException("Launch failed for " + args);
});

View file

@ -73,6 +73,9 @@ public class LldbModelTargetSessionAttributesPlatformImpl extends LldbModelTarge
desc = "unknown";
}
String wdir = platform.GetWorkingDirectory();
if (wdir == null) {
wdir = "unknown";
}
changeAttributes(List.of(), List.of(), Map.of( //
ARCH_ATTRIBUTE_NAME, triple[0], //