Go Wiki: heapdump15-through-heapdump17
その他のバージョンのヒープダンプ形式
- Go 1.3: heapdump13
- Go 1.4: heapdump14
はじめに
Go 1.5には、ヒープ内のすべてのオブジェクトに加えて、追加情報(ルート、ゴルーチン、ファイナライザなど)をファイルに書き込む`runtime/debug.WriteHeapDump`関数があります。このファイルの形式をここに指定します。
詳細
ファイルは文字列「go1.5 heap dump\n」のバイトで始まります。この説明は、「go1.6 heap dump\n」および「go1.7 heap dump\n」で始まるファイルにも適用されます。go1.6形式は1.5と同一であり、go1.7形式には以下で説明する小さな変更が1つあります。
ファイルの残りの部分は、レコードのシーケンスです。レコードは、いくつかの異なる種類があります。レコードには、次のプリミティブが含まれます。
- uvarint - `encoding/binary.{Put,Read}Uvarint`のようにエンコードされた64ビット符号なし整数
- string - uvarintでエンコードされた長さの後に、そのバイト数のデータが続きます
- bool - 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: オブジェクトのアドレス
- string: オブジェクトの内容
- fieldlist: オブジェクトのポインターを含むフィールドを記述します
コンテンツ文字列のサイズは、オブジェクト自体のサイズではなく、含まれているサイズクラスのサイズです。そのため、コンテンツのサイズは、含まれるオブジェクトの型よりもやや大きくなる可能性があります。
その他のルート
- string: このルートの由来に関するテキストの説明
- uvarint: ルートポインター
型
- uvarint: 型記述子のアドレス
- uvarint: この型のオブジェクトのサイズ
- string: 型の名前
- bool: この型の値を含むインターフェースのデータフィールドの型がT(false)か*T(true)か
ゴルーチン(G)
- uvarint: 記述子のアドレス
- uvarint: スタックの先頭へのポインター(現在実行中のフレーム、別名深度0)
- uvarint: ゴルーチンID
- uvarint: このゴルーチンを作成したgoステートメントの場所
- uvarint: ステータス
- bool: システムによって開始されたゴルーチンです
- bool: バックグラウンドゴルーチンです
- uvarint: ゴルーチンが最後に待機を開始したおおよその時間(エポックからのナノ秒)
- string: 待機している理由のテキストの説明
- uvarint: 現在実行中のフレームのコンテキストポインター
- uvarint: OSスレッド記述子のアドレス(M)
- uvarint: 最上位のdeferレコード
- uvarint: 最上位のpanicレコード
可能なステータス
- 0 = アイドル
- 1 = 実行可能
- 3 = システムコール
- 4 = 待機中
待機フィールドはすべての場合に存在する必要がありますが、「待機中」のステータスである場合にのみ意味を持ちます。
スタックフレーム
- uvarint: スタックポインター(フレーム内の最低アドレス)
- uvarint: スタック内の深度(0 = スタックの先頭)
- uvarint: 子フレームのスタックポインター(ない場合は0)
- string: スタックフレームの内容
- uvarint: 関数のエントリPC
- uvarint: 関数の現在のPC
- uvarint: 関数の継続PC(関数が再開される場所があれば)
- string: 関数名
- fieldlist: このフレーム内のポインターを含むフィールドの種類とオフセットのリスト
ダンプパラメータ
- bool: ビッグエンディアン
- uvarint: バイト単位のポインターサイズ
- uvarint: ヒープの開始アドレス
- uvarint: ヒープの終了アドレス
- string: アーキテクチャ名
- string: GOEXPERIMENT環境変数の値
- uvarint: runtime.ncpu
ファイナライザ
- uvarint: ファイナライザを持つオブジェクトのアドレス
- uvarint: ファイナライザを記述するFuncValへのポインター
- uvarint: ファイナライザエントリポイントのPC
- uvarint: ファイナライザ引数の型
- uvarint: オブジェクトの型
このファイナライザはランタイムシステムに登録されていますが、参照するオブジェクトは、最新のGC時点で到達可能であったか、最新のGC以降に割り当てられました。
itab
- uvarint: Itabアドレス
- uvarint: 含まれる型の型記述子のアドレス
- go1.6までは、型は常にポインター型であり、itab.dataフィールドの型を表します。
- go1.7以降では、型はインターフェースに格納されている型です。itab.dataフィールドがTか*Tかを判断するには、参照された型の記述子の最後のブール値を確認する必要があります。
osthread(M)
- uvarint: このOSスレッド記述子のアドレス
- uvarint: スレッドのGo内部ID
- uvarint: スレッドのOSのID
メモリ統計
runtime.MemStatsの次のフィールドを記録します
- uvarint: Alloc
- uvarint: TotalAlloc
- uvarint: Sys
- uvarint: Lookups
- uvarint: Mallocs
- uvarint: Frees
- uvarint: HeapAlloc
- uvarint: HeapSys
- uvarint: HeapIdle
- uvarint: HeapInuse
- uvarint: HeapReleased
- uvarint: HeapObjects
- uvarint: StackInuse
- uvarint: StackSys
- uvarint: MSpanInuse
- uvarint: MSpanSys
- uvarint: MCacheInuse
- uvarint: MCacheSys
- uvarint: BuckHashSys
- uvarint: GCSys
- uvarint: OtherSys
- uvarint: NextGC
- uvarint: LastGC
- uvarint: PauseTotalNs
- 256 uvarints: PauseNs
- uvarint: NumGC
キューに入れられたファイナライザ
- uvarint: ファイナライザを持つオブジェクトのアドレス
- uvarint: ファイナライザを記述するFuncValへのポインター
- uvarint: ファイナライザエントリポイントのPC
- uvarint: ファイナライザ引数の型
- uvarint: オブジェクトの型
このファイナライザは実行準備ができています-参照するオブジェクトは到達不能です。ランタイムシステムはまだ実行していません。
データ
- uvarint: データセグメントの先頭のアドレス
- string: データセグメントの内容
- 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: スタックフレームの数。各フレームについて
- string: 関数名
- string: ファイル名
- uvarint: 行番号
- uvarint: 割り当ての数
- uvarint: 解放の数
割り当てサンプルレコード
- uvarint: オブジェクトのアドレス
- uvarint: 割り当て/解放プロファイルレコード識別子
このコンテンツは、Go Wikiの一部です。