Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarc Khouzam2011-06-28 17:52:40 +0000
committerMarc Khouzam2011-06-28 17:52:40 +0000
commitd3eb4cd839117d9d2f79462ed7a6ece5cf1da932 (patch)
treed9121205244f168a47735bb7450933f968e2f0e5 /dsf-gdb/org.eclipse.cdt.dsf.gdb
parent2041eb9870092b33d3fad240b840e216e5adac7a (diff)
downloadorg.eclipse.cdt-d3eb4cd839117d9d2f79462ed7a6ece5cf1da932.tar.gz
org.eclipse.cdt-d3eb4cd839117d9d2f79462ed7a6ece5cf1da932.tar.xz
org.eclipse.cdt-d3eb4cd839117d9d2f79462ed7a6ece5cf1da932.zip
Bug 347047: Trace visualization does not show proper frames with GDB >=
7.3
Diffstat (limited to 'dsf-gdb/org.eclipse.cdt.dsf.gdb')
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIStack.java111
-rw-r--r--dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/MIFrame.java2
2 files changed, 11 insertions, 102 deletions
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIStack.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIStack.java
index 0e10af2b5ad..19e865dae6e 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIStack.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/MIStack.java
@@ -271,7 +271,7 @@ public class MIStack extends AbstractDsfService
return;
}
- if (fTraceVisualization || (startIndex == 0 && endIndex == 0)) {
+ if (startIndex == 0 && endIndex == 0) {
// Try to retrieve the top stack frame from the cached stopped event.
if (fCachedStoppedEvent != null &&
fCachedStoppedEvent.getFrame() != null &&
@@ -383,6 +383,9 @@ public class MIStack extends AbstractDsfService
public IAddress getAddress() {
String addr = getMIFrame().getAddress();
+ if (addr == null || addr.length() == 0) {
+ return new Addr32(0);
+ }
if (addr.startsWith("0x")) { //$NON-NLS-1$
addr = addr.substring(2);
}
@@ -415,7 +418,7 @@ public class MIStack extends AbstractDsfService
// Retrieve the top stack frame from the stopped event only if the selected thread is the one on which stopped event
// is raised
- if (fTraceVisualization || miFrameDmc.fLevel == 0) {
+ if (miFrameDmc.fLevel == 0) {
if (fCachedStoppedEvent != null && fCachedStoppedEvent.getFrame() != null &&
(execDmc.equals(fCachedStoppedEvent.getDMContext()) || fTraceVisualization))
{
@@ -513,14 +516,6 @@ public class MIStack extends AbstractDsfService
rm.done();
return;
}
-
- if (fTraceVisualization) {
- // For the pre-release of GDB that supports tracepoints, we cannot ask
- // for the list of arguments for all stack frames, but only for available
- // ones. Again, I'm hoping that GDB 7.2 will be smarter than that.
- getArgumentsForTraceVisualization(frameDmc, rm);
- return;
- }
// If not, retrieve the full list of frame data. Although we only need one frame
// for this call, it will be stored the cache and made available for other calls.
@@ -581,44 +576,7 @@ public class MIStack extends AbstractDsfService
});
}
});
- }
-
- // For the pre-release of GDB that supports tracepoints, we cannot ask
- // for the list of arguments for all stack frames, but only for available
- // ones. Again, I'm hoping that GDB 7.2 will be smarter than that.
- private void getArgumentsForTraceVisualization(final IFrameDMContext frameDmc, final DataRequestMonitor<IVariableDMContext[]> rm) {
- final IMIExecutionDMContext execDmc = DMContexts.getAncestorOfType(frameDmc, IMIExecutionDMContext.class);
-
- getStackDepth(execDmc, 0, new DataRequestMonitor<Integer>(getExecutor(), rm) {
- @Override
- protected void handleSuccess() {
- int bottomFrame = getData() - 1;
- fMICommandCache.execute(
- // Don't ask for values for tracepoints
- fCommandFactory.createMIStackListArguments(execDmc, false, 0, bottomFrame),
- new DataRequestMonitor<MIStackListArgumentsInfo>(getExecutor(), rm) {
- @Override
- protected void handleSuccess() {
- // Find the index to the correct MI frame object.
- // Note: this is a short-cut, but it won't work once we implement retrieving
- // partial lists of stack frames.
- int idx = frameDmc.getLevel();
- if (idx == -1 || idx >= getData().getMIFrames().length) {
- rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_STATE, "Invalid frame " + frameDmc, null)); //$NON-NLS-1$
- rm.done();
- return;
- }
-
- // Create the variable array out of MIArg array.
- MIArg[] args = getData().getMIFrames()[idx].getArgs();
- if (args == null) args = new MIArg[0];
- rm.setData(makeVariableDMCs(frameDmc, MIVariableDMC.Type.ARGUMENT, args));
- rm.done();
- }
- });
- }
- });
- }
+ }
public void getVariableData(IVariableDMContext variableDmc, final DataRequestMonitor<IVariableDMData> rm) {
if (!(variableDmc instanceof MIVariableDMC)) {
@@ -676,9 +634,6 @@ public class MIStack extends AbstractDsfService
}
if (miVariableDmc.fType == MIVariableDMC.Type.ARGUMENT){
- if (fTraceVisualization) {
- getArgumentsDataForTraceVisualization(miVariableDmc, rm);
- } else {
fMICommandCache.execute(
// Don't ask for value when we are visualizing trace data, since some
// data will not be there, and the command will fail
@@ -724,7 +679,6 @@ public class MIStack extends AbstractDsfService
});
}
});
- }
}//if
if (miVariableDmc.fType == MIVariableDMC.Type.LOCAL){
fMICommandCache.execute(
@@ -770,52 +724,6 @@ public class MIStack extends AbstractDsfService
}
- // For the pre-release of GDB that supports tracepoints, we cannot ask
- // for the list of arguments for all stack frames, but only for available
- // ones. Again, I'm hoping that GDB 7.2 will be smarter than that.
- private void getArgumentsDataForTraceVisualization(final MIVariableDMC miVariableDmc, final DataRequestMonitor<IVariableDMData> rm) {
- final MIFrameDMC frameDmc = DMContexts.getAncestorOfType(miVariableDmc, MIFrameDMC.class);
- final IMIExecutionDMContext execDmc = DMContexts.getAncestorOfType(frameDmc, IMIExecutionDMContext.class);
-
- class VariableData implements IVariableDMData {
- private MIArg dsfMIArg;
- VariableData(MIArg arg){
- dsfMIArg = arg;
- }
- public String getName() { return dsfMIArg.getName(); }
- public String getValue() { return dsfMIArg.getValue(); }
- @Override
- public String toString() { return dsfMIArg.toString(); }
- }
-
- getStackDepth(execDmc, 0, new DataRequestMonitor<Integer>(getExecutor(), rm) {
- @Override
- protected void handleSuccess() {
- int bottomFrame = getData() - 1;
- fMICommandCache.execute(
- // Don't ask for values for tracepoints
- fCommandFactory.createMIStackListArguments(execDmc, false, 0, bottomFrame),
- new DataRequestMonitor<MIStackListArgumentsInfo>(getExecutor(), rm) {
- @Override
- protected void handleSuccess() {
- // Find the correct frame and argument
- if ( frameDmc.fLevel >= getData().getMIFrames().length ||
- miVariableDmc.fIndex >= getData().getMIFrames()[frameDmc.fLevel].getArgs().length )
- {
- rm.setStatus(new Status(IStatus.ERROR, GdbPlugin.PLUGIN_ID, INVALID_HANDLE, "Invalid variable " + miVariableDmc, null)); //$NON-NLS-1$
- rm.done();
- return;
- }
-
- // Create the data object.
- rm.setData(new VariableData(getData().getMIFrames()[frameDmc.fLevel].getArgs()[miVariableDmc.fIndex]));
- rm.done();
- }
- });
- }
- });
- }
-
private MIVariableDMC[] makeVariableDMCs(IFrameDMContext frame, MIVariableDMC.Type type, MIArg[] miArgs) {
// Use LinkedHashMap in order to keep the original ordering.
// We don't currently support variables with the same name in the same frame,
@@ -944,13 +852,12 @@ public class MIStack extends AbstractDsfService
@Override
protected void handleError() {
if (fTraceVisualization) {
- // when visualizing trace data, the pre-release GDB, the command
+ // when visualizing trace data with GDB 7.2, the command
// -stack-info-depth will return an error if we ask for any level
// that GDB does not know about. We would have to iteratively
// try different depths until we found the deepest that succeeds.
- // That is too much of a hack for a pre-release. Let's hope
- // GDB 7.2 will properly answer -stack-info-depth when visualizing
- // trace data. Until then, we can safely say we have one stack
+ // That is too much of a hack, especially since GDB 7.3 answers correctly.
+ // For 7.2, we can safely say we have one stack
// frame, which is going to be the case for 95% of the cases.
// To have more stack frames, the user would have to have collected
// the registers and enough stack memory for GDB to build another frame.
diff --git a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/MIFrame.java b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/MIFrame.java
index 42e36d84eb4..8e3154435be 100644
--- a/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/MIFrame.java
+++ b/dsf-gdb/org.eclipse.cdt.dsf.gdb/src/org/eclipse/cdt/dsf/mi/service/command/output/MIFrame.java
@@ -96,6 +96,8 @@ public class MIFrame {
} else if (var.equals("addr")) { //$NON-NLS-1$
try {
addr = str.trim();
+ if ( str.equals( "<unavailable>" ) ) //$NON-NLS-1$
+ addr = ""; //$NON-NLS-1$
} catch (NumberFormatException e) {
}
} else if (var.equals("func")) { //$NON-NLS-1$

Back to the top