1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-23 22:52:11 +02:00

Bug 405660 - Exceptions thrown when starting to debug (executing

commands while target running)

Change-Id: I7fdbd1ee515545db829f9892eabdb8a102be251b
Reviewed-on: https://git.eclipse.org/r/12134
Reviewed-by: Marc Khouzam <marc.khouzam@ericsson.com>
IP-Clean: Marc Khouzam <marc.khouzam@ericsson.com>
Reviewed-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
IP-Clean: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
Tested-by: Mikhail Khodjaiants <mikhailkhod@googlemail.com>
This commit is contained in:
Mikhail Khodjaiants 2013-05-07 16:51:50 -04:00
parent fa9cd1cecd
commit 8c5b133e17
6 changed files with 149 additions and 55 deletions

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2011, 2012 Ericsson and others.
* Copyright (c) 2011, 2013 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -28,6 +28,7 @@ import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
@ -106,6 +107,7 @@ public class DebugNewProcessSequence extends ReflectionSequence {
// For post-mortem launch only
"stepSpecifyCoreFile", //$NON-NLS-1$
"stepInitializeMemory", //$NON-NLS-1$
"stepStartTrackingBreakpoints", //$NON-NLS-1$
"stepStartExecution", //$NON-NLS-1$
"stepCleanupBaseSequence", //$NON-NLS-1$
@ -443,6 +445,21 @@ public class DebugNewProcessSequence extends ReflectionSequence {
}
}
/**
* Initialize the memory service with the data for given process.
* @since 4.2
*/
@Execute
public void stepInitializeMemory(final RequestMonitor rm) {
IGDBMemory memory = fTracker.getService(IGDBMemory.class);
IMemoryDMContext memContext = DMContexts.getAncestorOfType(getContainerContext(), IMemoryDMContext.class);
if (memory == null || memContext == null) {
rm.done();
return;
}
memory.initializeMemoryData(memContext, rm);
}
/**
* Start executing the program.
*/

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.ImmediateExecutor;
import org.eclipse.cdt.dsf.concurrent.ImmediateRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IExpressions;
@ -28,7 +29,6 @@ import org.eclipse.cdt.dsf.debug.service.IExpressions.IExpressionDMContext;
import org.eclipse.cdt.dsf.debug.service.IMemory;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IStartedDMEvent;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.MIMemory;
@ -56,7 +56,7 @@ public class GDBMemory extends MIMemory implements IGDBMemory {
/**
* We assume the endianness is the same for all processes because GDB supports only one target.
*/
private boolean fIsBigEndian = false;
private Boolean fIsBigEndian;
public GDBMemory(DsfSession session) {
super(session);
@ -121,15 +121,59 @@ public class GDBMemory extends MIMemory implements IGDBMemory {
});
}
@DsfServiceEventHandler
public void eventDispatched(IStartedDMEvent event) {
if (event.getDMContext() instanceof IContainerDMContext) {
IMemoryDMContext memContext = DMContexts.getAncestorOfType(event.getDMContext(), IMemoryDMContext.class);
if (memContext != null) {
readAddressSize(memContext);
readEndianness(memContext);
@Override
public void initializeMemoryData(final IMemoryDMContext memContext, RequestMonitor rm) {
ImmediateExecutor.getInstance().execute(new Sequence(getExecutor(), rm) {
private Step[] fSteps = new Step[] {
new Step() {
@Override
public void execute(final RequestMonitor requestMonitor) {
Integer addrSize = fAddressSizes.get(memContext);
if (addrSize != null) {
requestMonitor.done();
return;
}
readAddressSize(
memContext,
new DataRequestMonitor<Integer>(ImmediateExecutor.getInstance(), requestMonitor) {
@Override
@ConfinedToDsfExecutor("fExecutor")
protected void handleSuccess() {
fAddressSizes.put(memContext, getData());
requestMonitor.done();
}
});
}
},
new Step() {
@Override
public void execute(final RequestMonitor requestMonitor) {
if ( fIsBigEndian != null) {
requestMonitor.done();
return;
}
readEndianness(
memContext,
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), requestMonitor) {
@Override
@ConfinedToDsfExecutor("fExecutor")
protected void handleSuccess() {
fIsBigEndian = getData();
requestMonitor.done();
}
});
}
},
};
@Override
public Step[] getSteps() {
return fSteps;
}
}
});
}
@DsfServiceEventHandler
@ -153,40 +197,7 @@ public class GDBMemory extends MIMemory implements IGDBMemory {
return fIsBigEndian;
}
/**
* Retrieves the address size for given memory and execution contexts.
*/
private void readAddressSize(final IMemoryDMContext memContext) {
Integer addrSize = fAddressSizes.get(memContext);
if (addrSize == null) {
doReadAddressSize(
memContext,
new DataRequestMonitor<Integer>(ImmediateExecutor.getInstance(), null) {
@Override
@ConfinedToDsfExecutor("fExecutor")
protected void handleSuccess() {
fAddressSizes.put(memContext, getData());
}
});
}
}
/**
* Retrieves the endianness for given memory and execution contexts.
*/
private void readEndianness(IMemoryDMContext memContext) {
doReadEndianness(
memContext,
new DataRequestMonitor<Boolean>(ImmediateExecutor.getInstance(), null) {
@Override
@ConfinedToDsfExecutor("fExecutor")
protected void handleSuccess() {
fIsBigEndian = getData();
}
});
}
protected void doReadAddressSize(IMemoryDMContext memContext, final DataRequestMonitor<Integer> drm) {
protected void readAddressSize(IMemoryDMContext memContext, final DataRequestMonitor<Integer> drm) {
IExpressions exprService = getServicesTracker().getService(IExpressions.class);
IExpressionDMContext exprContext = exprService.createExpression(memContext, "sizeof (void*)"); //$NON-NLS-1$
CommandFactory commandFactory = fCommandControl.getCommandFactory();
@ -207,7 +218,7 @@ public class GDBMemory extends MIMemory implements IGDBMemory {
});
}
protected void doReadEndianness(IMemoryDMContext memContext, final DataRequestMonitor<Boolean> drm) {
protected void readEndianness(IMemoryDMContext memContext, final DataRequestMonitor<Boolean> drm) {
CommandFactory commandFactory = fCommandControl.getCommandFactory();
fCommandControl.queueCommand(
commandFactory.createCLIShowEndian(memContext),

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2012 Ericsson and others.
* Copyright (c) 2008, 2013 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -245,13 +245,43 @@ public class GDBProcesses extends MIProcesses implements IGDBProcesses {
protected void handleSuccess() {
// For an attach, we actually know the pid, so let's remember it
fProcId = ((IMIProcessDMContext)procCtx).getProcId();
IDMContext containerDmc = getData();
rm.setData(containerDmc);
final IDMContext ctx = getData();
rm.setData(ctx);
// Start tracking breakpoints.
MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class);
IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(containerDmc, IBreakpointsTargetDMContext.class);
bpmService.startTrackingBreakpoints(bpTargetDmc, rm);
ImmediateExecutor.getInstance().execute(
new Sequence(getExecutor(), rm) {
private Step[] fSteps = new Step[] {
// Initialize memory data for this process
new Step() {
@Override
public void execute(RequestMonitor memoryDataRm) {
IGDBMemory memory = getServicesTracker().getService(IGDBMemory.class);
IMemoryDMContext memContext = DMContexts.getAncestorOfType(ctx, IMemoryDMContext.class);
if (memory == null || memContext == null) {
memoryDataRm.done();
return;
}
memory.initializeMemoryData(memContext, memoryDataRm);
};
},
// Start tracking breakpoints.
new Step() {
@Override
public void execute(RequestMonitor trackBpRm) {
MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class);
IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(ctx, IBreakpointsTargetDMContext.class);
bpmService.startTrackingBreakpoints(bpTargetDmc, trackBpRm);
};
}
};
@Override
public Step[] getSteps() {
return fSteps;
}
});
}
});
}

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2008, 2012 Ericsson and others.
* Copyright (c) 2008, 2013 Ericsson and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -911,6 +911,19 @@ public class GDBProcesses_7_0 extends AbstractDsfService
// Store the fully formed container context so it can be returned to the caller.
dataRm.setData(fContainerDmc);
// Initialize memory data for this process.
IGDBMemory memory = getServicesTracker().getService(IGDBMemory.class);
IMemoryDMContext memContext = DMContexts.getAncestorOfType(fContainerDmc, IMemoryDMContext.class);
if (memory == null || memContext == null) {
rm.done();
return;
}
memory.initializeMemoryData(memContext, rm);
}
},
new Step() {
@Override
public void execute(RequestMonitor rm) {
// Start tracking breakpoints.
MIBreakpointsManager bpmService = getServicesTracker().getService(MIBreakpointsManager.class);
IBreakpointsTargetDMContext bpTargetDmc = DMContexts.getAncestorOfType(fContainerDmc, IBreakpointsTargetDMContext.class);

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2010, 2011 TUBITAK BILGEM-ITI and others.
* Copyright (c) 2010, 2013 TUBITAK BILGEM-ITI and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@ -26,6 +26,7 @@ import org.eclipse.cdt.dsf.concurrent.Sequence;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
import org.eclipse.cdt.dsf.debug.service.IBreakpoints.IBreakpointsTargetDMContext;
import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IRunControl.IExitedDMEvent;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext;
@ -311,6 +312,19 @@ public class GDBProcesses_7_2 extends GDBProcesses_7_1 {
new ImmediateDataRequestMonitor<MIInfo>(rm));
}
},
// Initialize memory data for this process.
new Step() {
@Override
public void execute(RequestMonitor rm) {
IGDBMemory memory = getServicesTracker().getService(IGDBMemory.class);
IMemoryDMContext memContext = DMContexts.getAncestorOfType(fContainerDmc, IMemoryDMContext.class);
if (memory == null || memContext == null) {
rm.done();
return;
}
memory.initializeMemoryData(memContext, rm);
}
},
// Start tracking this process' breakpoints.
new Step() {
@Override

View file

@ -10,13 +10,22 @@
*******************************************************************************/
package org.eclipse.cdt.dsf.gdb.service;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.debug.service.IMemory;
/**
* Provides access to memory related data such as address size and endianness.
*
* @since 4.2
*/
public interface IGDBMemory extends IMemory {
/**
* This method is required to retrieve data from GDB asynchronously. The Platform's
* memory related API is not asynchronous, so the data can not be acquired on demand.
*/
public void initializeMemoryData(IMemoryDMContext ctx, RequestMonitor rm);
/**
* Returns the address size (in bytes) of the memory specified by the given context.
*/