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.model.DsfMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext; import org.eclipse.cdt.dsf.debug.service.IMemory.IMemoryDMContext;
import org.eclipse.cdt.dsf.debug.service.IMemorySpaces; 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.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServices; import org.eclipse.cdt.dsf.service.DsfServices;
import org.eclipse.cdt.dsf.service.DsfSession; import org.eclipse.cdt.dsf.service.DsfSession;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.ILaunchConfiguration; 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.IMemoryBlock;
import org.eclipse.debug.core.model.IMemoryBlockExtension; import org.eclipse.debug.core.model.IMemoryBlockExtension;
import org.osgi.framework.BundleContext; import org.osgi.framework.BundleContext;
@ -381,4 +388,35 @@ public class GdbMemoryBlockRetrieval extends DsfMemoryBlockRetrieval implements
} }
return false; 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.DsfLaunch;
import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval; import org.eclipse.cdt.dsf.debug.model.DsfMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.debug.service.IDsfDebugServicesFactory; 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.debug.service.command.ICommandControlService.ICommandControlShutdownDMEvent;
import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants; import org.eclipse.cdt.dsf.gdb.IGdbDebugConstants;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlockRetrieval; import org.eclipse.cdt.dsf.gdb.internal.memory.GdbMemoryBlockRetrieval;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; 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.mi.service.command.AbstractCLIProcess;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler; import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServicesTracker; import org.eclipse.cdt.dsf.service.DsfServicesTracker;
@ -132,17 +127,10 @@ public class GdbLaunch extends DsfLaunch
fExecutor.submit( new Callable<Object>() { fExecutor.submit( new Callable<Object>() {
@Override @Override
public Object call() throws CoreException { public Object call() throws CoreException {
ICommandControlService commandControl = fTracker.getService(ICommandControlService.class); fMemRetrieval = new GdbMemoryBlockRetrieval(
IMIProcesses procService = fTracker.getService(IMIProcesses.class); GdbLaunchDelegate.GDB_DEBUG_MODEL_ID, getLaunchConfiguration(), fSession);
if (commandControl != null && procService != null) { fSession.registerModelAdapter(IMemoryBlockRetrieval.class, fMemRetrieval);
fMemRetrieval = new GdbMemoryBlockRetrieval( fSession.addServiceEventListener(fMemRetrieval, null);
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);
}
return null; return null;
} }
}).get(); }).get();
@ -253,6 +241,9 @@ public class GdbLaunch extends DsfLaunch
new RequestMonitor(fSession.getExecutor(), rm) { new RequestMonitor(fSession.getExecutor(), rm) {
@Override @Override
public void handleCompleted() { public void handleCompleted() {
if (fMemRetrieval != null)
fSession.removeServiceEventListener(fMemRetrieval);
fSession.removeServiceEventListener(GdbLaunch.this); fSession.removeServiceEventListener(GdbLaunch.this);
if (!isSuccess()) { if (!isSuccess()) {
GdbPlugin.getDefault().getLog().log(new MultiStatus( GdbPlugin.getDefault().getLog().log(new MultiStatus(
@ -268,8 +259,6 @@ public class GdbLaunch extends DsfLaunch
// launch with an invalid gdbserver // launch with an invalid gdbserver
// Bug 368597 // Bug 368597
if (fMemRetrieval != null) { if (fMemRetrieval != null) {
// DsfMemoryBlockRetrieval.saveMemoryBlocks();
fMemRetrieval.saveMemoryBlocks();
// Fire a terminate event for the memory retrieval object so // Fire a terminate event for the memory retrieval object so
// that the hosting memory views can clean up. See 255120 and // that the hosting memory views can clean up. See 255120 and