1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-22 06:02:11 +02:00

Bug 293832 - [dsf-gdb] Ask gdb for variable value, even if it is a complex type

Currently, CDT does not ask GDB for the value of the variables it
believes to be of complex types, such as structures. However, as
described in the bug, it assumes that a typedefed pointer is a complex
structure. Because of that, it displays a value of "{...}" for it
instead of the pointer value.

By asking GDB for the value of the variable even if it's of a complex
type, CDT will always display the right thing for the value. This will
cause a few more -var-evaluate-expression calls, but their number is
still limited to what is visible in the variables view. So the impact
should be negligible.

Screenshot of before/after:
	http://i.imgur.com/Sx5ZPfO.png

It is still impossible to edit the value, but this would be addressed in
another patch.

Change-Id: I92e6ead6351677e098a56d4af5bdb85fc61df080
Signed-off-by: Simon Marchi <simon.marchi@polymtl.ca>
This commit is contained in:
Simon Marchi 2015-02-17 13:07:26 -05:00 committed by Gerrit Code Review @ Eclipse.org
parent 9f39b4828d
commit cb16665cc7

View file

@ -1102,38 +1102,29 @@ public class MIVariableManager implements ICommandControl {
return;
}
// If the variable is a complex structure, there is no need to ask the back-end for a value,
// we can give it the {...} ourselves
// Unless we are dealing with an array, in which case, we want to get the address of it
if (isComplex() && ! isDynamic()) {
if (isArray()) {
// Figure out the address
IExpressionDMContext exprCxt = DMContexts.getAncestorOfType(dmc, IExpressionDMContext.class);
IExpressionDMContext addrCxt = fExpressionService.createExpression(exprCxt, "&(" + exprCxt.getExpression() + ")"); //$NON-NLS-1$//$NON-NLS-2$
// If we are dealing with an array, in which case, we want to get the address of it.
// When dealing with a complex value, we want to query the back-end to correctly
// address the case of a typedefed pointer (see bug 293832).
if (isArray()) {
// Figure out the address
IExpressionDMContext exprCxt = DMContexts.getAncestorOfType(dmc, IExpressionDMContext.class);
IExpressionDMContext addrCxt = fExpressionService.createExpression(exprCxt, "&(" + exprCxt.getExpression() + ")"); //$NON-NLS-1$//$NON-NLS-2$
final FormattedValueDMContext formatCxt = new FormattedValueDMContext(
fSession.getId(),
addrCxt,
dmc.getFormatID()
);
final FormattedValueDMContext formatCxt = new FormattedValueDMContext(
fSession.getId(),
addrCxt,
dmc.getFormatID()
);
getVariable(
addrCxt,
new DataRequestMonitor<MIVariableObject>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
getData().getValue(formatCxt, rm);
}
});
} else {
// Other complex structure
String complexValue = "{...}"; //$NON-NLS-1$
setValue(dmc.getFormatID(), complexValue);
rm.setData(new FormattedValueDMData(complexValue));
rm.done();
}
getVariable(
addrCxt,
new DataRequestMonitor<MIVariableObject>(fSession.getExecutor(), rm) {
@Override
protected void handleSuccess() {
getData().getValue(formatCxt, rm);
}
});
return;
}