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



    パッケージに割り当てられます。



All Articles