Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 200725 Details for
Bug 347514
[tracepoints] Tracepoint visualization should be prepared for multi-threaded programs
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Fix for master which only returns a single thread during visualization
z.patch (text/plain), 11.27 KB, created by
Marc Khouzam
on 2011-08-02 11:01:49 EDT
(
hide
)
Description:
Fix for master which only returns a single thread during visualization
Filename:
MIME Type:
Creator:
Marc Khouzam
Created:
2011-08-02 11:01:49 EDT
Size:
11.27 KB
patch
obsolete
>From 1fa4546f70a6215674fc4decd8332b140e903da2 Tue, 2 Aug 2011 10:57:39 -0400 >From: Marc Khouzam <marc.khouzam@ericsson.com> >Date: Tue, 2 Aug 2011 10:57:26 -0400 >Subject: [PATCH] Bug 347514: Tracepoint visualization should be prepared for multi-threaded programs > >diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java >index b2a8f7e..16a99f5 100644 >--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java >+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/commands/GdbSelectNextTraceRecordCommand.java >@@ -80,14 +80,22 @@ > new DataRequestMonitor<ITraceRecordDMContext>(fExecutor, rm) { > @Override > protected void handleSuccess() { >- final ITraceRecordDMContext nextDmc = traceControl.createNextRecordContext(getData()); >- traceControl.selectTraceRecord(nextDmc, new RequestMonitor(ImmediateExecutor.getInstance(), rm) { >- @Override >- protected void handleSuccess() { >- fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(nextDmc), new Hashtable<String, String>()); >- rm.done(); >- } >- }); >+ final ITraceRecordDMContext previousDmc = getData(); >+ ITraceRecordDMContext nextDmc = traceControl.createNextRecordContext(previousDmc); >+ // Must send the event right away to tell the services we are starting visualization >+ // If we don't, the services won't behave accordingly soon enough >+ // Bug 347514 >+ fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(nextDmc), new Hashtable<String, String>()); >+ >+ traceControl.selectTraceRecord(nextDmc, new RequestMonitor(ImmediateExecutor.getInstance(), rm) { >+ @Override >+ protected void handleError() { >+ // If we weren't able to select the next record, we must notify that we are still on the previous one >+ // since we have already sent a TraceRecordSelectedChangedEvent early, but it didn't happen. >+ fSession.dispatchEvent(new TraceRecordSelectedChangedEvent(previousDmc), new Hashtable<String, String>()); >+ rm.done(); >+ } >+ }); > }; > }); > } else { >diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/launch/LaunchVMProvider.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/launch/LaunchVMProvider.java >index 9b15f74..f7f3292 100644 >--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/launch/LaunchVMProvider.java >+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb.ui/src/org/eclipse/cdt/dsf/gdb/internal/ui/viewmodel/launch/LaunchVMProvider.java >@@ -26,6 +26,7 @@ > import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.LaunchRootVMNode; > import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.StackFramesVMNode; > import org.eclipse.cdt.dsf.gdb.internal.ui.GdbUIPlugin; >+import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent; > import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITracingStartedDMEvent; > import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITracingStoppedDMEvent; > import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITracingSupportedChangeDMEvent; >@@ -45,6 +46,12 @@ > public class LaunchVMProvider extends AbstractLaunchVMProvider > implements IDebugEventSetListener, ILaunchesListener2 > { >+ >+ /** >+ * Indicates that we are currently visualizing trace data. >+ */ >+ private boolean fTracepointVisualizationModeEnabled; >+ > @ThreadSafe > public LaunchVMProvider(AbstractVMAdapter adapter, IPresentationContext presentationContext, DsfSession session) > { >@@ -91,6 +98,15 @@ > return true; > } > } >+ >+ if (eventToSkip instanceof ITraceRecordSelectedChangedDMEvent) { >+ ITraceRecordSelectedChangedDMEvent recordChanged = (ITraceRecordSelectedChangedDMEvent)eventToSkip; >+ if (recordChanged.isVisualizationModeEnabled() == fTracepointVisualizationModeEnabled) { >+ // We only care about this event if it indicates a change of visualization state >+ return true; >+ } >+ } >+ > return super.canSkipHandlingEvent(newEvent, eventToSkip); > } > >@@ -107,6 +123,19 @@ > return; > } > >+ if (event instanceof ITraceRecordSelectedChangedDMEvent) { >+ ITraceRecordSelectedChangedDMEvent recordChanged = (ITraceRecordSelectedChangedDMEvent)event; >+ // If trace visualization has changed we have to refresh the debug view >+ if (recordChanged.isVisualizationModeEnabled() != fTracepointVisualizationModeEnabled) { >+ fTracepointVisualizationModeEnabled = recordChanged.isVisualizationModeEnabled(); >+ >+ // Refresh the view because the set of threads has totally changed. >+ refresh(); >+ rm.done(); >+ return; >+ } >+ } >+ > super.handleEvent(event, rm); > } > >diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java >index 5e66158..3dda911 100644 >--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java >+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBProcesses_7_2.java >@@ -29,9 +29,11 @@ > import org.eclipse.cdt.dsf.debug.service.command.ICommandControlService.ICommandControlDMContext; > import org.eclipse.cdt.dsf.gdb.IGDBLaunchConfigurationConstants; > import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin; >+import org.eclipse.cdt.dsf.gdb.service.IGDBTraceControl.ITraceRecordSelectedChangedDMEvent; > import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; > import org.eclipse.cdt.dsf.mi.service.IMICommandControl; > import org.eclipse.cdt.dsf.mi.service.IMIContainerDMContext; >+import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext; > import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext; > import org.eclipse.cdt.dsf.mi.service.IMIRunControl; > import org.eclipse.cdt.dsf.mi.service.IMIRunControl.MIRunMode; >@@ -54,6 +56,12 @@ > */ > public class GDBProcesses_7_2 extends GDBProcesses_7_1 { > >+ /** >+ * The id of the single thread to be used during event visualization. >+ * @since 4.1 >+ */ >+ protected static final String TRACE_VISUALIZATION_THREAD_ID = "1"; //$NON-NLS-1$ >+ > private CommandFactory fCommandFactory; > private IGDBControl fCommandControl; > private IGDBBackend fBackend; >@@ -73,6 +81,11 @@ > * because we know the process will be restarted. > */ > private Set<IContainerDMContext> fProcRestarting = new HashSet<IContainerDMContext>(); >+ >+ /** >+ * Indicates that we are currently visualizing trace data. >+ */ >+ private boolean fTraceVisualization; > > public GDBProcesses_7_2(DsfSession session) { > super(session); >@@ -107,6 +120,16 @@ > @Override > public void shutdown(RequestMonitor requestMonitor) { > super.shutdown(requestMonitor); >+ } >+ >+ /** @since 4.1 */ >+ protected boolean getTraceVisualization() { >+ return fTraceVisualization; >+ } >+ >+ /** @since 4.1 */ >+ protected void setTraceVisualization(boolean visualizing) { >+ fTraceVisualization = visualizing; > } > > @Override >@@ -459,6 +482,25 @@ > return new DebugNewProcessSequence_7_2(executor, isInitial, dmc, file, attributes, rm); > } > >+ @Override >+ public void getProcessesBeingDebugged(final IDMContext dmc, final DataRequestMonitor<IDMContext[]> rm) { >+ if (getTraceVisualization()) { >+ // If we are visualizing data during a live session, we should not ask GDB for the list of threads, >+ // because we will get the list of active threads, while GDB only cares about thread 1 for visualization. >+ final IMIContainerDMContext containerDmc = DMContexts.getAncestorOfType(dmc, IMIContainerDMContext.class); >+ if (containerDmc != null) { >+ IProcessDMContext procDmc = DMContexts.getAncestorOfType(containerDmc, IProcessDMContext.class); >+ rm.setData(new IMIExecutionDMContext[]{createExecutionContext(containerDmc, >+ createThreadContext(procDmc, TRACE_VISUALIZATION_THREAD_ID), >+ TRACE_VISUALIZATION_THREAD_ID)}); >+ rm.done(); >+ return; >+ } >+ } >+ >+ super.getProcessesBeingDebugged(dmc, rm); >+ } >+ > /** > * Creates the container context that is to be used for the new process that will > * be created by the restart operation. >@@ -535,5 +577,13 @@ > protected boolean needFixForGDB72Bug352998() { > return true; > } >+ >+ /** >+ * @since 4.1 >+ */ >+ @DsfServiceEventHandler >+ public void eventDispatched(ITraceRecordSelectedChangedDMEvent e) { >+ setTraceVisualization(e.isVisualizationModeEnabled()); >+ } > } > >diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java >index b90b214..9598103 100644 >--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java >+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/GDBTraceControl_7_2.java >@@ -972,7 +972,7 @@ > // process? > IContainerDMContext processContainerDmc = (IContainerDMContext)(getData()[0]); > >- // Now find the proper thread. We must do this hear because in post-mortem debugging >+ // Now find the proper thread. We must do this here because in post-mortem debugging > // we cannot rely on MIRunControl using 'thread', as it will fail > IMIProcesses procService = getServicesTracker().getService(IMIProcesses.class); > if (procService == null) { >diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java >index f098ca7..925bd51 100644 >--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java >+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/gdb/service/command/GDBControl_7_0.java >@@ -345,18 +345,6 @@ > /** @since 3.0 */ > @DsfServiceEventHandler > public void eventDispatched(ITraceRecordSelectedChangedDMEvent e) { >- if (e.isVisualizationModeEnabled()) { >- // Once we start looking at trace frames, we should not use >- // the --thread or --frame options because GDB does not handle >- // it well, there are no actual threads running. >- // We only need to do this once, but it won't hurt to do it >- // every time. >- setUseThreadAndFrameOptions(false); >- } else { >- // We stopped looking at trace frames, so we can start >- // using --thread and --frame again >- setUseThreadAndFrameOptions(true); >- } > } > > public static class InitializationShutdownStep extends Sequence.Step {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
marc.khouzam
:
iplog-
Actions:
View
|
Diff
Attachments on
bug 347514
:
200220
|
200725
|
200757
|
200758