Go Wiki: heapdump14
他のバージョンのヒープダンプ形式
- Go 1.3: heapdump13
- Go 1.5以降: heapdump15-through-heapdump17
はじめに
Go 1.4には、ヒープ内のすべてのオブジェクトと追加情報(ルート、ゴルーチン、ファイナライザなど)をファイルに書き込む`runtime/debug.WriteHeapDump`関数があります。このファイルの形式はここに指定されています。
詳細
ファイルは文字列「go1.4 heap dump\n」のバイトから始まります。
ファイルの残りは、レコードのシーケンスです。レコードはいくつかの異なる種類があります。レコードには次のプリミティブが含まれます。
- uvarint - `encoding/binary.{Put,Read}Uvarint`のようにエンコードされた64ビット符号なし整数
- 文字列 - uvarintでエンコードされた長さの後に、そのバイト数のデータが続きます
- ブール値 - falseの場合はuvarintでエンコードされた0、trueの場合は1
- fieldlist - メモリ領域のポインタを含む部分の説明です。uvarintでエンコードされたフィールドの種類とフィールドのオフセットのペアを繰り返し、リストの終了マーカーが続きます。可能な種類は、1=Ptr、2=Iface、3=Efaceです。0=Eolはリストの終了マーカーです。リストの終了マーカーには対応するオフセットはありません。
各レコードは、レコードの種類を表すuvarintでエンコードされた整数から始まります。
- 0 = EOF
- 1 = オブジェクト
- 2 = その他のルート
- 3 = 型
- 4 = ゴルーチン
- 5 = スタックフレーム
- 6 = ダンプパラメータ
- 7 = 登録されたファイナライザ
- 8 = itab
- 9 = OSスレッド
- 10 = メモリ統計
- 11 = キューに入れられたファイナライザ
- 12 = データセグメント
- 13 = BSSセグメント
- 14 = deferレコード
- 15 = panicレコード
- 16 = 割り当て/解放プロファイルレコード
- 17 = 割り当てスタックトレースサンプル
各レコードの残りのフィールドは、タイプ依存であり、以下に説明されています。
EOF
EOFレコードにはフィールドがなく、最後に表示される必要があります。
オブジェクト
- uvarint: オブジェクトのアドレス
- 文字列: オブジェクトの内容
- fieldlist: オブジェクトのポインタを含むフィールドを記述します
コンテンツ文字列のサイズは、オブジェクト自体のサイズではなく、含まれているサイズクラスのサイズです。そのため、コンテンツサイズは、含まれているオブジェクトの型よりもやや大きくなる可能性があります。
その他のルート
- 文字列: このルートの由来を示すテキストの説明
- uvarint: ルートポインタ
型
- uvarint: 型記述子のアドレス
- uvarint: この型のオブジェクトのサイズ
- 文字列: 型の名前
- ブール値: この型の値を含むインターフェースのデータフィールドがポインタかどうか
ゴルーチン (G)
- uvarint: 記述子のアドレス
- uvarint: スタックの先頭へのポインタ(現在実行中のフレーム、別名深度0)
- uvarint: ゴルーチンID
- uvarint: このゴルーチンを作成したgoステートメントの位置
- uvarint: 状態
- ブール値: システムによって開始されたゴルーチンかどうか
- ブール値: バックグラウンドゴルーチンかどうか
- uvarint: ゴルーチンが最後に待機を開始したおおよその時間(エポックからのナノ秒)
- 文字列: 待機している理由を示すテキスト
- uvarint: 現在実行中のフレームのコンテキストポインタ
- uvarint: OSスレッド記述子 (M) のアドレス
- uvarint: 最上位のdeferレコード
- uvarint: 最上位のpanicレコード
可能な状態
- 0 = アイドル
- 1 = 実行可能
- 3 = システムコール
- 4 = 待機中
待機フィールドはすべての場合に存在する必要がありますが、「待機中」の状態の場合にのみ意味を持ちます。
スタックフレーム
- uvarint: スタックポインタ(フレーム内の最低アドレス)
- uvarint: スタックの深度(0 = スタックの先頭)
- uvarint: 子フレームのスタックポインタ(ない場合は0)
- 文字列: スタックフレームの内容
- uvarint: 関数のエントリPC
- uvarint: 関数の現在のPC
- uvarint: 関数の継続PC(関数の実行を再開できる場所がある場合)
- 文字列: 関数名
- fieldlist: このフレーム内のポインタを含むフィールドの種類とオフセットのリスト
ダンプパラメータ
- ブール値: ビッグエンディアン
- uvarint: バイト単位のポインタサイズ
- uvarint: ヒープの開始アドレス
- uvarint: ヒープの終了アドレス
- uvarint: thechar = アーキテクチャ指定子
- 文字列: GOEXPERIMENT環境変数の値
- uvarint: runtime.ncpu
ファイナライザ
- uvarint: ファイナライザを持つオブジェクトのアドレス
- uvarint: ファイナライザを記述するFuncValへのポインタ
- uvarint: ファイナライザエントリポイントのPC
- uvarint: ファイナライザ引数の型
- uvarint: オブジェクトの型
このファイナライザはランタイムシステムに登録されていますが、参照するオブジェクトは、最新のGC時点で到達可能であったか、最新のGC以降に割り当てられました。
itab
- uvarint: Itabアドレス
- uvarint: 含まれる型の型記述子のアドレス
OSスレッド (M)
- uvarint: このOSスレッド記述子のアドレス
- uvarint: スレッドのGo内部ID
- uvarint: スレッドのOSのID
メモリ統計
MemStatsの最初の26個のフィールドをダンプします。25番目を除くすべてのフィールドはuvarintでダンプされ、25番目は256個のuvarintでダンプされます。
キューに入れられたファイナライザ
- uvarint: ファイナライザを持つオブジェクトのアドレス
- uvarint: ファイナライザを記述するFuncValへのポインタ
- uvarint: ファイナライザエントリポイントのPC
- uvarint: ファイナライザ引数の型
- uvarint: オブジェクトの型
このファイナライザは実行準備ができています。参照するオブジェクトは到達不能です。ランタイムシステムはまだ実行していません。
データ
- uvarint: データセグメントの先頭のアドレス
- 文字列: データセグメントの内容
- fieldlist: データセグメント内のポインタを含むフィールドの種類とオフセット。
BSS
データと同じ形式ですが、BSSセグメント用です。
defer
- uvarint: deferレコードアドレス
- uvarint: 含まれるゴルーチン
- uvarint: argp
- uvarint: pc
- uvarint: deferのFuncVal
- uvarint: deferエントリポイントのPC
- uvarint: 次のdeferレコードへのリンク
panic
- uvarint: panicレコードアドレス
- uvarint: 含まれるゴルーチン
- uvarint: panic引数efaceの型ポインタ
- uvarint: panic引数efaceのデータフィールド
- uvarint: 現在実行中のdeferレコードへのポインタ
- uvarint: 次のpanicレコードへのリンク
割り当て/解放プロファイルレコード
- uvarint: レコード識別子
- uvarint: 割り当てられたオブジェクトのサイズ
- uvarint: スタックフレームの数。各フレームについて
-
- 文字列: 関数名
-
- 文字列: ファイル名
-
- uvarint: 行番号
- uvarint: 割り当ての数
- uvarint: 解放の数
割り当てサンプルレコード
- uvarint: オブジェクトのアドレス
- uvarint: 割り当て/解放プロファイルレコード識別子
このコンテンツはGo Wikiの一部です。