Skip to content

Commit cf264d2

Browse files
committed
supporting memory references
1 parent 424db4e commit cf264d2

3 files changed

Lines changed: 47 additions & 0 deletions

File tree

src/gdb/GDBDebugSessionBase.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2679,10 +2679,35 @@ export abstract class GDBDebugSessionBase extends LoggingDebugSession {
26792679
varobjName: varobj.varname,
26802680
})
26812681
: 0;
2682+
let memoryReferenceResult:
2683+
| MIGDBDataEvaluateExpressionResponse
2684+
| undefined;
2685+
let hasMemoryReference = false;
2686+
if (this.supportsMemoryReferences) {
2687+
try {
2688+
memoryReferenceResult =
2689+
await mi.sendDataEvaluateExpression(
2690+
gdb,
2691+
`&(${varobj.expression})`
2692+
);
2693+
// Depending on the GDBServer being used, sometimes the result of evaluating an address of a symbol returns "<address> <symbol name>"
2694+
if (memoryReferenceResult.value?.includes(' ')) {
2695+
memoryReferenceResult.value =
2696+
memoryReferenceResult.value.split(' ')[0];
2697+
}
2698+
hasMemoryReference = true;
2699+
} catch {
2700+
hasMemoryReference = false;
2701+
}
2702+
}
26822703
response.body = {
26832704
result,
26842705
type: varobj.type,
26852706
variablesReference,
2707+
memoryReference:
2708+
hasMemoryReference && memoryReferenceResult
2709+
? memoryReferenceResult.value
2710+
: undefined,
26862711
};
26872712
}
26882713

src/integration-tests/debugClient.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ export class CdtDebugClient extends DebugClient {
141141
if (!args) {
142142
args = {
143143
supportsRunInTerminalRequest: true,
144+
supportsMemoryEvent: true,
145+
supportsMemoryReferences: true,
144146
adapterID: this['_debugType'],
145147
linesStartAt1: true,
146148
columnsStartAt1: true,

src/integration-tests/evaluate.spec.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,26 @@ describe('evaluate request global variables', function () {
531531
});
532532
expect(evalRes.body.result).to.equal('25');
533533
});
534+
535+
it('response for variables should include memory reference if the expression has an lvalue', async function () {
536+
// Read a global variable using evaluateRequest
537+
const watchRes = await dc.evaluateRequest({
538+
context: 'watch',
539+
expression: 'global_int',
540+
frameId: scope.frame.id,
541+
});
542+
expect(watchRes.body.memoryReference).to.not.be.undefined;
543+
});
544+
545+
it('should not include memory reference if the expression does not have an lvalue', async function () {
546+
const watchRes = await dc.evaluateRequest({
547+
context: 'watch',
548+
expression: 'global_int + 1',
549+
frameId: scope.frame.id,
550+
});
551+
552+
expect(watchRes.body.memoryReference).to.be.undefined;
553+
});
534554
});
535555

536556
describe('evaluate request - watch local variable across lexical scope transition', function () {

0 commit comments

Comments
 (0)