1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 383344 - Stored memory monitors don't show data in subsequent

sessions

Change-Id: I2621c97c57d2f2e1393144e8bcc551adbdad031e
This commit is contained in:
Mikhail Khodjaiants 2012-07-03 11:13:46 -04:00
parent ba17c7ac64
commit 4b834ede87
2 changed files with 45 additions and 18 deletions

View file

@ -24,16 +24,23 @@ import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlock;
import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
import org.eclipse.cdt.dsf.debug.service.IMemorySpaces;
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.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServices;
import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.IMemoryBlockManager;
import org.eclipse.debug.core.model.IMemoryBlock;
import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.osgi.framework.BundleContext;
@ -381,4 +388,35 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements
}
return false;
}
@DsfServiceEventHandler
public void eventDispatched(IStartedDMEvent event) {
if (event.getDMContext() instanceof IContainerDMContext) {
IMemoryDMContext memoryDmc = DMContexts.getAncestorOfType(event.getDMContext(), IMemoryDMContext.class);
if (memoryDmc != null) {
initialize(memoryDmc);
}
}
}
@DsfServiceEventHandler
public void eventDispatched(IExitedDMEvent event) {
if (event.getDMContext() instanceof IContainerDMContext) {
IMemoryDMContext memoryDmc = DMContexts.getAncestorOfType(event.getDMContext(), IMemoryDMContext.class);
if (memoryDmc != null) {
saveMemoryBlocks();
Job removeJob = new Job("Removing memory blocks") { //$NON-NLS-1$
@Override
protected IStatus run( IProgressMonitor monitor ) {
IMemoryBlockManager mbm = DebugPlugin.getDefault().getMemoryBlockManager();
IMemoryBlock[] deletedMemoryBlocks = mbm.getMemoryBlocks(GdbMemoryBlockRetrieval.this);
mbm.removeMemoryBlocks(deletedMemoryBlocks);
return Status.OK_STATUS;
}
};
removeJob.schedule();
}
}
}
}

View file

@ -32,16 +32,11 @@ import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor;
import org.eclipse.cdt.dsf.debug.model.DsfLaunch;
import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.debug.service.IDsfDebugServicesFactory;
import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService;
import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.IMIProcesses;
import org.eclipse.cdt.dsf.mi.service.MIProcesses;
import org.eclipse.cdt.dsf.mi.service.command.AbstractCLIProcess;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
@ -132,17 +127,10 @@ public class GdbLaunch extends DsfLaunch
fExecutor.submit( new Callable<Object>() {
@Override
public Object call() throws CoreException {
ICommandControlService commandControl = fTracker.getService(ICommandControlService.class);
IMIProcesses procService = fTracker.getService(IMIProcesses.class);
if (commandControl != null && procService != null) {
fMemRetrieval = new GdbMemoryBlockRetrieval(
GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, getLaunchConfiguration(), fSession);
fSession.registerModelAdapter(IMemoryBlockRetrieval.class, fMemRetrieval);
IProcessDMContext procDmc = procService.createProcessContext(commandControl.getContext(), MIProcesses.UNKNOWN_PROCESS_ID);
IMemoryDMContext memoryDmc = (IMemoryDMContext)procService.createContainerContext(procDmc, MIProcesses.UNIQUE_GROUP_ID);
fMemRetrieval.initialize(memoryDmc);
}
fMemRetrieval = new GdbMemoryBlockRetrieval(
GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, getLaunchConfiguration(), fSession);
fSession.registerModelAdapter(IMemoryBlockRetrieval.class, fMemRetrieval);
fSession.addServiceEventListener(fMemRetrieval, null);
return null;
}
}).get();
@ -253,6 +241,9 @@ public class GdbLaunch extends DsfLaunch
new RequestMonitor(fSession.getExecutor(), rm) {
@Override
public void handleCompleted() {
if (fMemRetrieval != null)
fSession.removeServiceEventListener(fMemRetrieval);
fSession.removeServiceEventListener(GdbLaunch.this);
if (!isSuccess()) {
GdbPlugin.getDefault().getLog().log(new MultiStatus(
@ -268,8 +259,6 @@ public class GdbLaunch extends DsfLaunch
// launch with an invalid gdbserver
// Bug 368597
if (fMemRetrieval != null) {
// DsfMemoryBlockRetrieval.saveMemoryBlocks();
fMemRetrieval.saveMemoryBlocks();
// Fire a terminate event for the memory retrieval object so
// that the hosting memory views can clean up. See 255120 and