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を使えばメモリ変更監視ができそう。
  • 変数名や数式からアドレスを取得するようにしたかったけどlldbcortex-debugで挙動が違ったので見送り

参考

Debug Adapter Protocol Specification

https://stackoverflow.com/questions/50287482/vs-code-how-to-access-debug-variables-from-within-extension