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