web-dev-qa-db-ja.com

nodejsのバイナリモジュールをデバッグする方法は?

C++ライブラリにいくつかのバインディングを提供するC++で記述されたnode.jsモジュールがあります。ライブラリはSIGSEGVでクラッシュするので、GDBでデバッグして、何が問題なのかを調べる必要があります。

モジュールのソースはすでに./node_modules/somelib/にあり、そのフォルダーに移動してnpm installと入力すると、ライブラリがコンパイルされ、node.jsのrequire( 'somelib')を介して使用できます。 gdbをノードに接続してエラーを再現できますが、スタックトレースにnode_modules/somelib/Release/somelib.nodeが表示されます。

これが重要かどうかはわかりませんが、ライブラリはnode-gypを使用してコンパイルされています。

  • 質問1:ソースコードをロードする方法、またはgdbをソースコードにポイントする方法を教えてください。
  • 質問2:デバッグシンボルを生成するようにnode-gypを構成するにはどうすればよいですか?
19
lanoxx

node-gypドキュメントでこれに対する答えを見つけました。解決策は、--debugフラグを使用してビルドプロセスを呼び出すことです。つまり、node-gyp configure --debugおよび/またはnode-gyp build --debugを呼び出すことを意味します。次に、Releaseフォルダーの代わりにDebugフォルダーが作成されます。その後、gdbはソースファイルを自動的にロードします。

16
lanoxx

@ 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
2
JBaczuk

モジュールのソースを含むディレクトリをgdbの検索パスに追加できます。

(gdb) directory /path/to/source

参照: http://sourceware.org/gdb/onlinedocs/gdb/Source-Path.html

また、node-gypデバッグシンボルを取得するには、node-gyp-dbg/devまたは同等のものをインストールするか、-gでコンパイルします。

0
erenon

VSCodeユーザーの場合、モジュールをデバッグするためにこれが役立つ場合があります。

基本的な手順は次のとおりです。

  1. Vscodeプラグインをインストールします https://github.com/vadimcn/vscode-lldb

  2. 次のように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

0
Atul