mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2026-09-28 17:11:11 -09:00
Debugger Process exception handling
This commit is contained in:
@@ -22,13 +22,24 @@ import java.util.*;
|
|||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.exception.ExceptionUtils;
|
||||||
|
|
||||||
import agent.gdb.gadp.impl.GdbGadpServerImpl;
|
import agent.gdb.gadp.impl.GdbGadpServerImpl;
|
||||||
import ghidra.dbg.agent.AgentWindow;
|
import ghidra.dbg.agent.AgentWindow;
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
public interface GdbGadpServer extends AutoCloseable {
|
public interface GdbGadpServer extends AutoCloseable {
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
new Runner().run(args);
|
try {
|
||||||
|
new Runner().run(args);
|
||||||
|
}
|
||||||
|
catch (Throwable t) {
|
||||||
|
System.err.println(ExceptionUtils.getMessage(t));
|
||||||
|
t.printStackTrace(System.err);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// new Runner().run(args);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GdbGadpServer newInstance(SocketAddress addr) throws IOException {
|
public static GdbGadpServer newInstance(SocketAddress addr) throws IOException {
|
||||||
|
|||||||
@@ -15,18 +15,18 @@
|
|||||||
*/
|
*/
|
||||||
package ghidra.dbg.gadp.server;
|
package ghidra.dbg.gadp.server;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.*;
|
||||||
import java.io.InputStreamReader;
|
|
||||||
import java.lang.ProcessBuilder.Redirect;
|
|
||||||
import java.nio.channels.AsynchronousByteChannel;
|
import java.nio.channels.AsynchronousByteChannel;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
|
||||||
|
import generic.concurrent.io.IOResult;
|
||||||
|
import generic.concurrent.io.ProcessConsumer;
|
||||||
import ghidra.dbg.DebuggerModelFactory;
|
import ghidra.dbg.DebuggerModelFactory;
|
||||||
import ghidra.dbg.gadp.client.GadpClient;
|
import ghidra.dbg.gadp.client.GadpClient;
|
||||||
import ghidra.dbg.gadp.client.GadpTcpDebuggerModelFactory;
|
import ghidra.dbg.gadp.client.GadpTcpDebuggerModelFactory;
|
||||||
import ghidra.dbg.util.ConfigurableFactory.FactoryOption;
|
|
||||||
import ghidra.util.Msg;
|
import ghidra.util.Msg;
|
||||||
|
|
||||||
public abstract class AbstractGadpLocalDebuggerModelFactory implements DebuggerModelFactory {
|
public abstract class AbstractGadpLocalDebuggerModelFactory implements DebuggerModelFactory {
|
||||||
@@ -108,9 +108,13 @@ public abstract class AbstractGadpLocalDebuggerModelFactory implements DebuggerM
|
|||||||
}
|
}
|
||||||
completeCommandLine(cmd);
|
completeCommandLine(cmd);
|
||||||
builder.command(cmd);
|
builder.command(cmd);
|
||||||
builder.redirectError(Redirect.INHERIT);
|
//builder.redirectError(Redirect.INHERIT);
|
||||||
|
|
||||||
process = builder.start();
|
process = builder.start();
|
||||||
|
|
||||||
|
InputStream errorStream = process.getErrorStream();
|
||||||
|
Future<IOResult> errorFuture = ProcessConsumer.consume(errorStream);
|
||||||
|
|
||||||
BufferedReader reader =
|
BufferedReader reader =
|
||||||
new BufferedReader(new InputStreamReader(process.getInputStream()));
|
new BufferedReader(new InputStreamReader(process.getInputStream()));
|
||||||
String line;
|
String line;
|
||||||
@@ -124,9 +128,19 @@ public abstract class AbstractGadpLocalDebuggerModelFactory implements DebuggerM
|
|||||||
ready.complete(null);
|
ready.complete(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ready.isDone()) {
|
if (!ready.isDone()) {
|
||||||
ready.completeExceptionally(
|
IOResult errorResult = errorFuture.get();
|
||||||
new RuntimeException("Agent terminated unexpectedly"));
|
String errorMessage = errorResult.getOutputAsString();
|
||||||
|
if (errorMessage != null) {
|
||||||
|
ready.completeExceptionally(
|
||||||
|
new RuntimeException("Agent terminated with error: " + errorMessage));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ready.completeExceptionally(
|
||||||
|
new RuntimeException("Agent terminated unexpectedly"));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Throwable e) {
|
catch (Throwable e) {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ public class IOResult implements Runnable {
|
|||||||
|
|
||||||
public static final String THREAD_POOL_NAME = "I/O Thread Pool";
|
public static final String THREAD_POOL_NAME = "I/O Thread Pool";
|
||||||
|
|
||||||
private List<String> outputLines = new ArrayList<String>();
|
private List<String> outputLines = new ArrayList<>();
|
||||||
private BufferedReader commandOutput;
|
private BufferedReader commandOutput;
|
||||||
private final Throwable inception;
|
private final Throwable inception;
|
||||||
private Consumer<String> consumer = Dummy.consumer();
|
private Consumer<String> consumer = Dummy.consumer();
|
||||||
@@ -53,7 +53,7 @@ public class IOResult implements Runnable {
|
|||||||
public String getOutputAsString() {
|
public String getOutputAsString() {
|
||||||
StringBuilder buffy = new StringBuilder();
|
StringBuilder buffy = new StringBuilder();
|
||||||
for (String line : outputLines) {
|
for (String line : outputLines) {
|
||||||
buffy.append(line);
|
buffy.append(line).append("\n");
|
||||||
}
|
}
|
||||||
return buffy.toString();
|
return buffy.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user