GDBを使用したGoコードのデバッグ。 はじめに

以下はgcツールに適用されます。 Gccgoには組み込みのgdbサポートがあります。 このレビューに加えて、 GDBマニュアルを参照できます

Linux、Mac OS X、またはFreeBSDでgcツールを使用してGoプログラムをコンパイルおよび構成すると、結果のバイナリには、最新のGDBデバッガー(> 7.1)がライブプロセスまたはダンプを調べるために使用できるDWARFv3デバッグ情報が含まれます。

デバッグ情報を省略するには、 '-s'フラグをリンカーに渡します(たとえば、 go build -ldflags "-s" prog.go )。

gcコンパイラーによって生成されるコードには、関数呼び出しの埋め込みと変数の登録が含まれます。 これらの最適化により、GDBでのデバッグが困難になる場合があります。 デバッグ中にそれらを無効にするには、 -gcflags "-N -l"フラグをgoコマンドに渡します。このコマンドは、デバッグされたコードをビルドするために使用されます。

一般的な操作



Go拡張機能


新しいGDB拡張メカニズムにより、特定のバイナリファイルの拡張スクリプトをロードできます。 ツールキットはこの事実を使用して、実行可能なコード(ゴルーチンなど)の内部を調べ、組み込みタイプの辞書、スライス、およびチャネルを美しく表示できる少数のコマンドでGDBを拡張します。


拡張スクリプトの仕組みを知りたい場合、または拡張スクリプトを展開したい場合は、Goソースディレクトリのsrc / pkg / runtime / runtime-gdb.pyを参照してください。 これは、リンカ( src / cmd / ld / dwarf.c )によってDWARFコードに記述されているいくつかの特別なマジックタイプ( hash<T,U> )および変数( runtime.mおよびruntime.g )に依存します。

デバッグ情報がどのように見えるかに興味がある場合は、「 objdump -W 6.out 」を実行し、 .debug_*セクションを見てください。

既知の問題


  1. 文字列の美しい表示は、タイプ文字列に対してのみ機能し、継承されたタイプに対しては機能しません。
  2. Cで記述されたランタイムライブラリの一部の型情報がありません。
  3. GDBはGoの名前の定義を理解せず、 "fmt.Print""."を含む非構造化リテラルとして扱い"." 引用符で囲む必要があります。 これは、 pkg.(*MyType).Meth
  4. すべてのグローバル変数はmainパッケージに割り当てられます。

Source: https://habr.com/ru/post/J179317/


All Articles