VSCode:リモートデバッグ
C/C++ の場合、gdbserver をリモートホスト上に配置する。
CentOS 7
$ yum install gdb-gdbserver
CentOS 8
$ dnf install gdb-gdbserver
code:launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "remote C/C++ debug",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceRoot}/hello",
"args": [],
"stopAtEntry": false,
"cwd": "/tmp",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerServerAddress": "your_remote_host:9091",
}
]
}
肝は "miDebuggerServerAddress" でここに該当リモートホストのアドレスと gdbserver で指定するポート番号を書く。
"program", "cwd" は無意味だが、書いておかないとエラーになる。
gdbserver をリモートホスト上で起動する。
$ gdbserver :ポート番号 実行バイナリ
何度も接続し直す場合は --multi を付ける。
--attach プロセスID で動作中のプロセスにアタッチすることもできる。
もしもリモートホストでファイアウォールなどでポートが開けない場合
これでデバッグを実行すると、リモートのバイナリが動いて、ローカルでソースをステップ実行したりブレークポイントを置いたりすることができる。
参考
Node.js の場合
公式の説明
普通に Node.js で launch.json を自動生成した場合は以下のようになる。
code:launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${file}"
}
]
}
この状態だと、開いたファイル上でデバッガを実行すると、そのファイルに対して node コマンドが実行されデバッガが動く。
code:launch.json
"configurations": [
{
"type": "node",
"request": "attach",
"name": "Attach to remote",
"address": "localhost",
"port": 9229,
"localRoot": "${workspaceFolder}/dist/",
"remoteRoot": "/tmp/hello2/dist/"
}
node 起動時に、node --inspect=アドレス:ポート ソース でデバッグポートが開く。
--inspect の代わりに --inspect-brk を使うと、ソースの先頭でブレークする。
node プロセスに SIGUSR1 シグナルを発行すると、localhost:9229 でデバッグポートが開く。
node inspect ソース でデバッガが直接起動する。この時にも localhost:9229 でデバッグポートが開く。
localRoot, remoteRoot は本来どこを指すべき? いまいち分からず。
参考