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:
parent
ba17c7ac64
commit
4b834ede87
2 changed files with 45 additions and 18 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue