C++ライブラリにいくつかのバインディングを提供するC++で記述されたnode.jsモジュールがあります。ライブラリはSIGSEGVでクラッシュするので、GDBでデバッグして、何が問題なのかを調べる必要があります。
モジュールのソースはすでに./node_modules/somelib/
にあり、そのフォルダーに移動してnpm install
と入力すると、ライブラリがコンパイルされ、node.jsのrequire( 'somelib')を介して使用できます。 gdbをノードに接続してエラーを再現できますが、スタックトレースにnode_modules/somelib/Release/somelib.node
が表示されます。
これが重要かどうかはわかりませんが、ライブラリはnode-gyp
を使用してコンパイルされています。
node-gyp
を構成するにはどうすればよいですか?node-gyp
ドキュメントでこれに対する答えを見つけました。解決策は、--debug
フラグを使用してビルドプロセスを呼び出すことです。つまり、node-gyp configure --debug
および/またはnode-gyp build --debug
を呼び出すことを意味します。次に、Release
フォルダーの代わりにDebug
フォルダーが作成されます。その後、gdbはソースファイルを自動的にロードします。
@ Peter Cordesによって提供された(現在壊れている)リンクの アーカイブ から恥知らずにコピーされました
まず、-debugフラグを指定したnode-gypを使用してアドオンをコンパイルします。
$ node-gyp --debug configure rebuild
次に、私のようにまだ「プレイグラウンド」モードになっている場合は、モジュールに次のようなものをロードしている可能性があります。
var ObjModule = require('./ObjModule/build/Release/objModule');
ただし、デバッグモードでnode-gypを使用して再構築すると、node-gypはリリースバージョンを破棄し、代わりにデバッグバージョンを作成します。したがって、モジュールパスを更新します。
var ObjModule = require('./ObjModule/build/Debug/objModule');
これで、C++アドオンをデバッグする準備が整いました。 C++アプリケーションであるノードバイナリに対してgdbを実行します。現在、ノード自体はアドオンを認識していないため、アドオン関数(この場合はStringReverse)にブレークポイントを設定しようとすると、特定の関数が定義されていないと文句を言います。恐れることはありません。アドオンは、それが参照する「将来の共有ライブラリのロード」の一部であり、JavaScriptでアドオンがrequire()されるとロードされます。
$ gdb node
...
Reading symbols from node...done.
(gdb) break StringReverse
Function "StringReverse" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
OK、アプリケーションを実行するだけです。
(gdb) run ../modTest.js
...
Breakpoint 1, StringReverse (args=...) at ../objModule.cpp:49
モジュールのソースを含むディレクトリをgdbの検索パスに追加できます。
(gdb) directory /path/to/source
参照: http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html
また、node-gyp
デバッグシンボルを取得するには、node-gyp-dbg/dev
または同等のものをインストールするか、-g
でコンパイルします。
VSCodeユーザーの場合、モジュールをデバッグするためにこれが役立つ場合があります。
基本的な手順は次のとおりです。
Vscodeプラグインをインストールします https://github.com/vadimcn/vscode-lldb
次のようにlaunch.jsonを設定します。
{ "version": "0.2.0", "configurations": [{ "type": "lldb", "request": "launch", "name": "Launch Program", "program": "/absolute/path/to/node", "args": [ "/absolute/path/to/your/index.js" ] }] }
次に、VSCodeの場合と同じようにブレークポイントを設定します。
ハッピーデバッグ!
より詳細な説明が必要な場合は、ここに詳細なブログも公開しています。
https://medium.com/@atulanand94/debugging-nodejs-c-addons-using-vs-code-27e9940fc3ad