mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Bug 516371: Enable GDB target async support for Windows remote debugging
Traditionally CDT used sync debug support all the time. However there are cases where using target async is better because of GDB missing interrupt. This patch expands the cases that use target async to be all remote targets when using Windows host. That is in addition to cases when the full GDB Console is supported (new-ui). Signed-off-by: Muhammad Bilal <hafizbilal100@gmail.com> Change-Id: I1309d20319a24e4f23543d4ed22735044fd5b811
This commit is contained in:
parent
c3c5c2f3ba
commit
5f8fa75f1f
8 changed files with 50 additions and 28 deletions
11
dsf-gdb/org.eclipse.cdt.dsf.gdb/.settings/.api_filters
Normal file
11
dsf-gdb/org.eclipse.cdt.dsf.gdb/.settings/.api_filters
Normal file
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<component id="org.eclipse.cdt.dsf.gdb" version="2">
|
||||
<resource path="src/org/eclipse/cdt/dsf/gdb/service/IGDBBackend.java" type="org.eclipse.cdt.dsf.gdb.service.IGDBBackend">
|
||||
<filter comment="CDT allows new default methods that are unlikely to conflict with existing methods, therefore major version bump is unneeded." id="404000815">
|
||||
<message_arguments>
|
||||
<message_argument value="org.eclipse.cdt.dsf.gdb.service.IGDBBackend"/>
|
||||
<message_argument value="useTargetAsync()"/>
|
||||
</message_arguments>
|
||||
</filter>
|
||||
</resource>
|
||||
</component>
|
|
@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
|
|||
Bundle-Name: %pluginName
|
||||
Bundle-Vendor: %providerName
|
||||
Bundle-SymbolicName: org.eclipse.cdt.dsf.gdb;singleton:=true
|
||||
Bundle-Version: 6.1.0.qualifier
|
||||
Bundle-Version: 6.2.0.qualifier
|
||||
Bundle-Activator: org.eclipse.cdt.dsf.gdb.internal.GdbPlugin
|
||||
Bundle-Localization: plugin
|
||||
Require-Bundle: org.eclipse.core.runtime,
|
||||
|
|
|
@ -107,11 +107,11 @@ public class FinalLaunchSequence_7_12 extends FinalLaunchSequence_7_7 {
|
|||
return;
|
||||
}
|
||||
|
||||
// Use target async for non-stop mode or when the
|
||||
// Full GDB CLI console is being used.
|
||||
// Use target async for non-stop mode or when
|
||||
// it is specifically enabled by backend in all-stop mode
|
||||
// Otherwise Explicitly set target-async to off
|
||||
boolean asyncOn = false;
|
||||
if (isNonStop() || fGdbBackEnd.isFullGdbConsoleSupported()) {
|
||||
if (isNonStop() || fGdbBackEnd.useTargetAsync()) {
|
||||
asyncOn = true;
|
||||
}
|
||||
|
||||
|
|
|
@ -63,6 +63,17 @@ public class GDBBackend_7_12 extends GDBBackend {
|
|||
&& !fPtyFailure;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 6.2
|
||||
*/
|
||||
@Override
|
||||
public boolean useTargetAsync() {
|
||||
// Enable target asynchronously if there is Full GDB console as Full GDB Console requires async target or
|
||||
// If Windows remote debugging as remote debugging in GDB has lots of issues with handling Ctrl-C (See Bug 516371)
|
||||
return isFullGdbConsoleSupported()
|
||||
|| (Platform.getOS().equals(Platform.OS_WIN32) && getSessionType() == SessionType.REMOTE);
|
||||
}
|
||||
|
||||
protected void createPty() {
|
||||
if (!isFullGdbConsoleSupported()) {
|
||||
return;
|
||||
|
|
|
@ -47,12 +47,12 @@ public class GDBProcesses_7_12 extends GDBProcesses_7_11 {
|
|||
@Override
|
||||
public void terminate(IThreadDMContext thread, RequestMonitor rm) {
|
||||
IGDBBackend backend = getServicesTracker().getService(IGDBBackend.class);
|
||||
if (!backend.isFullGdbConsoleSupported()) {
|
||||
if (!backend.useTargetAsync()) {
|
||||
super.terminate(thread, rm);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we are running the full GDB console, there is a bug with GDB 7.12
|
||||
// If we are running the target-async support, there is a bug with GDB 7.12
|
||||
// where after we terminate the process, the GDB prompt does not come
|
||||
// back in the console. As a workaround, we first interrupt the process
|
||||
// to get the prompt back, and only then kill the process.
|
||||
|
@ -93,12 +93,12 @@ public class GDBProcesses_7_12 extends GDBProcesses_7_11 {
|
|||
}
|
||||
|
||||
IGDBBackend backend = getServicesTracker().getService(IGDBBackend.class);
|
||||
if (!backend.isFullGdbConsoleSupported()) {
|
||||
if (!backend.useTargetAsync()) {
|
||||
super.detachDebuggerFromProcess(dmc, rm);
|
||||
return;
|
||||
}
|
||||
|
||||
// If we are running the full GDB console, there is a bug with GDB 7.12
|
||||
// If we are running the target-async support, there is a bug with GDB 7.12
|
||||
// where after we detach the process, the GDB prompt does not come
|
||||
// back in the console. As a workaround, we first interrupt the process
|
||||
// to get the prompt back, and only then detach the process.
|
||||
|
|
|
@ -92,10 +92,7 @@ public class GDBRunControl_7_12 extends GDBRunControl_7_10 {
|
|||
|
||||
private void doSuspend(IExecutionDMContext context, final RequestMonitor rm) {
|
||||
// We use the MI interrupt command when working in async mode.
|
||||
// Since this run control service is specifically for all-stop mode,
|
||||
// the only possibility to be running asynchronously is if the Full GDB console
|
||||
// is being used.
|
||||
if (fGDBBackEnd.isFullGdbConsoleSupported()) {
|
||||
if (fGDBBackEnd.useTargetAsync()) {
|
||||
// Start the job before sending the interrupt command
|
||||
// to make sure we don't miss the *stopped event
|
||||
final MonitorSuspendJob monitorJob = new MonitorSuspendJob(0, rm);
|
||||
|
@ -124,11 +121,8 @@ public class GDBRunControl_7_12 extends GDBRunControl_7_10 {
|
|||
|
||||
@Override
|
||||
public boolean isTargetAcceptingCommands() {
|
||||
// We shall directly return true if the async mode is ON,
|
||||
// Since this run control service is specifically for all-stop mode,
|
||||
// The only possibility to be running asynchronously is if the Full GDB console
|
||||
// is being used.
|
||||
if (fGDBBackEnd.isFullGdbConsoleSupported()) {
|
||||
// We shall directly return true if the async mode is ON.
|
||||
if (fGDBBackEnd.useTargetAsync()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -170,6 +170,14 @@ public interface IGDBBackend extends IMIBackend {
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return True if CDT should use target async in all-stop mode.
|
||||
* @since 6.2
|
||||
*/
|
||||
default boolean useTargetAsync() {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return The real GDB process that was started for the debug session
|
||||
* @since 5.2
|
||||
|
|
|
@ -64,17 +64,15 @@ public class GDBJtagDSFFinalLaunchSequence_7_12 extends GDBJtagDSFFinalLaunchSeq
|
|||
if (commandControl != null && gdbBackEnd != null) {
|
||||
// Use target async when interfacing with the full GDB console (i.e. minimum GDB version 7.12)
|
||||
// otherwise explicitly set it to off.
|
||||
commandControl
|
||||
.queueCommand(
|
||||
commandControl.getCommandFactory().createMIGDBSetTargetAsync(commandControl.getContext(),
|
||||
gdbBackEnd.isFullGdbConsoleSupported()),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
||||
@Override
|
||||
protected void handleError() {
|
||||
// Accept errors for older GDBs
|
||||
rm.done();
|
||||
}
|
||||
});
|
||||
commandControl.queueCommand(commandControl.getCommandFactory()
|
||||
.createMIGDBSetTargetAsync(commandControl.getContext(), gdbBackEnd.useTargetAsync()),
|
||||
new DataRequestMonitor<MIInfo>(getExecutor(), rm) {
|
||||
@Override
|
||||
protected void handleError() {
|
||||
// Accept errors for older GDBs
|
||||
rm.done();
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// Should not happen
|
||||
rm.done();
|
||||
|
|
Loading…
Add table
Reference in a new issue