Go Wiki: heapdump13

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

はじめに

Go 1.3では、ヒープ内のすべてのオブジェクトと追加情報(ルート、ゴルーチン、ファイナライザーなど)をファイルに書き込むruntime/debug.WriteHeapDump関数が追加されました。このファイルの形式をここで指定します。

詳細

ファイルは文字列「go1.3 heap dump\n」のバイトで始まります。

ファイルの残りはレコードのシーケンスです。レコードにはいくつかの異なる種類があります。レコードには以下のプリミティブが含まれます。

  • uvarint - encoding/binary.{Put,Read}Uvarint と同様にエンコードされた64ビットの符号なし整数
  • string - 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 = 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: オブジェクトのアドレス
  • uvarint: タイプ記述子のアドレス (不明な場合は0)
  • uvarint: オブジェクトの種類 (0=通常 1=配列 2=チャネル 127=保守的にスキャン済み)
  • string: オブジェクトの内容

配列またはチャネルの種類の場合、タイプはゼロであってはなりません。

contents文字列のサイズは、含まれるsizeclassのサイズであり、タイプ自体のサイズではありません。したがって、contentsのサイズはタイプサイズよりも多少大きくなることがあります。配列やチャネルのタイプでは、はるかに大きくなる可能性があります。たとえば、n個の要素を持つ配列は、タイプサイズのn倍以上のコンテンツサイズを持つことになります。

otherroot

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

type

  • uvarint: タイプ記述子のアドレス
  • uvarint: このタイプのオブジェクトのサイズ
  • string: タイプ名
  • bool: このタイプの値を含むインターフェースのデータフィールドがポインタであるかどうか
  • fieldlist: このタイプのオブジェクト内のポインタを含むフィールドの種類と位置のリスト

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: ヒープの開始アドレス
  • uvarint: ヒープの終了アドレス
  • uvarint: thechar = アーキテクチャ指定子
  • string: GOEXPERIMENT環境変数の値
  • uvarint: runtime.ncpu

finalizer

  • 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番目のフィールドを除き、すべてのフィールドはuvarintでダンプされ、25番目は256個のuvarintでダンプされます。

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の一部です。