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
コマンドに渡します。このコマンドは、デバッグされたコードをビルドするために使用されます。
一般的な操作
- コードのファイルと行番号を表示し、ブレークポイントを設定して逆アセンブルします。
(gdb) list (gdb) list line (gdb) list file.go:line (gdb) break line (gdb) break file.go:line (gdb) disas
- トレースフレームとねじれていないスタックフレームを表示します。
(gdb) bt (gdb) frame n
- ローカル変数、引数、および戻り値のスタックフレーム上の名前、タイプ、および場所を表示します。
(gdb) info locals (gdb) info args (gdb) p variable (gdb) whatis variable
- グローバル変数の名前、タイプ、場所を表示します。
(gdb) info variables regexp
Go拡張機能
新しいGDB拡張メカニズムにより、特定のバイナリファイルの拡張スクリプトをロードできます。 ツールキットはこの事実を使用して、実行可能なコード(ゴルーチンなど)の内部を調べ、組み込みタイプの辞書、スライス、およびチャネルを美しく表示できる少数のコマンドでGDBを拡張します。
- 文字列、スライス、辞書、チャネルまたはインターフェースの美しい表示:
(gdb) p var
- 文字列、スライス、および辞書用の$ len()および$ cap()関数:
(gdb) p $len(var)
- 動的型にインターフェースをキャストする関数:
(gdb) p $dtype(var) (gdb) iface var
既知の問題: GDBは、名前が短い名前と長い場合、インターフェイス値の動的な型を自動的に見つけることができません(美しい表示ではなく、スタックトレースが表示されるときに迷惑をかけて、短い型名とポインターを取得します)。
- Gorutin Research:
(gdb) info goroutines (gdb) goroutine n cmd (gdb) help goroutine
例:
(gdb) goroutine 12 bt
拡張スクリプトの仕組みを知りたい場合、または拡張スクリプトを展開したい場合は、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_*
セクションを見てください。
既知の問題
- 文字列の美しい表示は、タイプ文字列に対してのみ機能し、継承されたタイプに対しては機能しません。
- Cで記述されたランタイムライブラリの一部の型情報がありません。
- GDBはGoの名前の定義を理解せず、
"fmt.Print"
を"."
を含む非構造化リテラルとして扱い"."
引用符で囲む必要があります。 これは、pkg.(*MyType).Meth
。 - すべてのグローバル変数は
main
パッケージに割り当てられます。