GDB JIT コンパイルインターフェイス統合

GDB JIT コンパイルインターフェイス統合により、V8 は V8 ランタイムからエミットされたネイティブコードのシンボルとデバッグ情報を GDB に提供できます。

GDB JIT コンパイルインターフェイスが無効になっている場合は、GDB の一般的なバックトレースには??でマークされたフレームが含まれます。これらのフレームは動的に生成されたコードに対応します。

#8  0x08281674 in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc:3758
#9  0xf5cae28e in ?? ()
#10 0xf5cc3a0a in ?? ()
#11 0xf5cc38f4 in ?? ()
#12 0xf5cbef19 in ?? ()
#13 0xf5cb09a2 in ?? ()
#14 0x0809e0a5 in v8::internal::Invoke (construct=false, func=..., receiver=..., argc=0, args=0x0,
    has_pending_exception=0xffffd46f) at src/execution.cc:97

しかし、GDB JIT コンパイルインターフェイスを有効にすると、GDB はより有益なスタックトレースを生成できます。

#6  0x082857fc in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc:3758
#7  0xf5cae28e in ?? ()
#8  0xf5cc3a0a in loop () at test.js:6
#9  0xf5cc38f4 in test.js () at test.js:13
#10 0xf5cbef19 in ?? ()
#11 0xf5cb09a2 in ?? ()
#12 0x0809e1f9 in v8::internal::Invoke (construct=false, func=..., receiver=..., argc=0, args=0x0,
    has_pending_exception=0xffffd44f) at src/execution.cc:97

GDB に未知のフレームは、ソース情報を持たないネイティブコードに対応します。詳細については 既知の制限事項 を参照してください。

GDB JIT コンパイルインターフェイスは、GDB ドキュメントで指定されています: https://sourceware.org/gdb/current/onlinedocs/gdb/JIT-Interface.html

前提条件 #

GDB JIT コンパイルインターフェイスの有効化 #

GDB JIT コンパイルインターフェイスは現在、既定ではコンパイルから除外され、ランタイムで無効になっています。有効にするには

  1. ENABLE_GDB_JIT_INTERFACE を定義して V8 ライブラリを構築します。scons を使用して V8 を構築する場合は、gdbjit=on を指定して実行します。
  2. V8 を起動するときに --gdbjit フラグを渡します。

GDB JIT 統合が正しく有効になっていることを確認するには、__jit_debug_register_code でブレークポイントを設定してみてください。この関数は、新しいコードオブジェクトについて GDB に通知するために呼び出されます。

既知の制限事項 #