Go Wiki: heapdump15-through-heapdump17

他のバージョンのヒープダンプ形式

はじめに

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 = object
  • 2 = otherroot
  • 3 = type
  • 4 = goroutine
  • 5 = stack frame
  • 6 = dump params
  • 7 = registered finalizer
  • 8 = itab
  • 9 = OS thread
  • 10 = mem stats
  • 11 = queued finalizer
  • 12 = data segment
  • 13 = bss segment
  • 14 = defer record
  • 15 = panic record
  • 16 = alloc/free profile record
  • 17 = alloc stack trace sample

各レコードの残りのフィールドはタイプによって異なり、以下に説明します。

EOF

EOFレコードにはフィールドがなく、最後に表示されなければなりません。

object

  • uvarint: オブジェクトのアドレス
  • string: オブジェクトの内容
  • fieldlist: オブジェクトのポインタを含むフィールドを記述します。

contents文字列のサイズは、格納されているsizeclassのサイズであり、オブジェクト自体のサイズではありません。そのため、contentsのサイズは、格納されているオブジェクトの型よりも多少大きい場合があります。

otherroot

  • string: このルートがどこから来たかのテキスト記述
  • uvarint: ルートポインタ

type

  • uvarint: タイプ記述子のアドレス
  • uvarint: このタイプのオブジェクトのサイズ
  • string: タイプ名
  • bool: この型の値を含むインターフェースのデータフィールドが型T(false)か*T(true)か。

goroutine (G)

  • uvarint: 記述子のアドレス
  • uvarint: スタックのトップへのポインタ (現在実行中のフレーム、別名深度0)
  • uvarint: ゴルーチンID
  • uvarint: このゴルーチンを作成したgoステートメントの位置
  • uvarint: ステータス
  • bool: システムによって開始されたGoルーチンであるか
  • bool: バックグラウンドGoルーチンであるか
  • uvarint: ゴルーチンが最後に待機を開始したおおよその時間 (エポックからのナノ秒)
  • string: 待機している理由のテキスト
  • uvarint: 現在実行中のフレームのコンテキストポインタ
  • uvarint: OSスレッド記述子 (M) のアドレス
  • uvarint: 最上位のdeferレコード
  • uvarint: 最上位のpanicレコード

可能なステータス

  • 0 = idle
  • 1 = runnable
  • 3 = syscall
  • 4 = waiting

waitフィールドはすべての場合に存在する必要がありますが、ステータスが「waiting」の場合にのみ意味を持ちます。

stack frame

  • uvarint: スタックポインタ (フレーム内の最低アドレス)
  • uvarint: スタック内の深さ (0 = スタックのトップ)
  • uvarint: 子フレームのスタックポインタ (ない場合は0)
  • string: スタックフレームの内容
  • uvarint: 関数のエントリPC
  • uvarint: 関数の現在のPC
  • uvarint: 関数の継続PC (関数が再開される可能性のある場所、もしあれば)
  • string: 関数名
  • fieldlist: このフレーム内のポインタを含むフィールドの種類とオフセットのリスト

dump params

  • bool: ビッグエンディアン
  • uvarint: ポインタサイズ (バイト)
  • uvarint: ヒープの開始アドレス
  • uvarint: ヒープの終了アドレス
  • string: アーキテクチャ名
  • string: GOEXPERIMENT環境変数の値
  • uvarint: runtime.ncpu

finalizer

  • 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

memstats

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

queuedfinalizer

  • uvarint: ファイナライザーを持つオブジェクトのアドレス
  • uvarint: ファイナライザーを記述するFuncValへのポインタ
  • uvarint: ファイナライザーエントリポイントのPC
  • uvarint: ファイナライザー引数のタイプ
  • uvarint: オブジェクトのタイプ

このファイナライザーは実行準備ができています。参照するオブジェクトは到達不能です。ランタイムシステムはまだ実行に着手していません。

data

  • uvarint: データセグメントの開始アドレス
  • string: データセグメントの内容
  • fieldlist: データセグメント内のポインタを含むフィールドの種類とオフセット。

bss

dataと同じ形式ですが、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レコードへのリンク

alloc/free profile record

  • uvarint: レコード識別子
  • uvarint: 割り当てられたオブジェクトのサイズ
  • uvarint: スタックフレーム数。各フレームについて
    • string: 関数名
    • string: ファイル名
    • uvarint: 行番号
  • uvarint: 割り当て回数
  • uvarint: 解放回数

alloc sample record

  • uvarint: オブジェクトのアドレス
  • uvarint: alloc/freeプロファイルレコード識別子

このコンテンツはGo Wikiの一部です。