🐼
VSCodeでデバッグ時のメモリ表示
経緯
VSCodeでデバッグする時にVisualStudioみたいにメモリ表示したい
よい方法が見つからなかったのでVSCodeの拡張機能開発を試したときの備忘録
確認したデバッガ
No. | debugger |
---|---|
1 | lldb |
2 | cortex-debug |
表示方法
vscode.debug.activeDebugSession
で取得したデバッグセッションに対してcustomRequest()
を送信する
送信時のパラメータは参考を確認
アドレスからメモリを取得
customRequest()
に"readMemory"
コマンドを指定
以下の感じに実装。(今回はコンソール出力)
function printMemory(
session: vscode.DebugSession,
address: string,
readBytes: number) {
//読み込みサイズを16の倍数にする
readBytes = (readBytes != 0) ? ((readBytes + 15) & 0xFFFFFFF0) : 16;
session.customRequest("readMemory", {
memoryReference: address,
count: readBytes
}).then(res => {
if (!res.data) throw "memory read error";
//base64で返ってくるためデコード
let data = Buffer.from(res.data, 'base64');
let addrNumber = parseInt(address, 16);
//目盛り
console.log(" " +
"00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
//1行16byteずつ表示
let rowMax = data.length / 16;
for (let row = 0; row < rowMax; row++) {
let curAddrNumber = addrNumber + (16 * row);
let curAddrString = ("0000000000000000" +
curAddrNumber.toString(16)).slice(-16);
let line = "0x" + curAddrString + ": ";
for (let col = 0; col < 16; col++) {
let tmp = data[(row * 16) + col].toString(16);
line += ("0" + tmp).slice(-2) + " ";
}
//0xXXXXXXXXXXXXXXXX: XX XX XX ..
console.log(line);
}
});
}
VSCodeのデバッグコンソールに以下のように出力される
備考
-
MemoryEvent
を使えばメモリ変更監視ができそう。 - 変数名や数式からアドレスを取得するようにしたかったけど
lldb
とcortex-debug
で挙動が違ったので見送り
参考
Debug Adapter Protocol Specification
Discussion