github.com/shogo82148/std@v1.22.1-0.20240327122250-4e474527810c/runtime/symtab.go (about)

     1  // Copyright 2014 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package runtime
     6  
     7  // Framesを使用すると、[Callers] が返すPC値のスライスのための関数/ファイル/行情報を取得できます。
     8  type Frames struct {
     9  	// callersはまだフレームに展開されていないPCのスライスです。
    10  	callers []uintptr
    11  
    12  	// nextPC is a next PC to expand ahead of processing callers.
    13  	nextPC uintptr
    14  
    15  	// frames is a slice of Frames that have yet to be returned.
    16  	frames     []Frame
    17  	frameStore [2]Frame
    18  }
    19  
    20  // Frameは各コールフレームごとに [Frames] によって返される情報です。
    21  type Frame struct {
    22  
    23  	// PCはこのフレームの位置に対するプログラムカウンタです。
    24  	// 別のフレームを呼び出すフレームの場合、これは
    25  	// 呼び出し命令のプログラムカウンタです。インライン展開のため、
    26  	// 複数のフレームは同じPC値を持つことがありますが、異なる
    27  	// シンボリック情報を持ちます。
    28  	PC uintptr
    29  
    30  	// Funcはこの呼び出しフレームのFunc値です。これは、非Goコードや完全にインライン化された関数の場合はnilになることがあります。
    31  	Func *Func
    32  
    33  	// Functionはこの呼び出しフレームのパッケージパス修飾された関数名です。非空であれば、この文字列はプログラム内の1つの関数を一意に識別します。
    34  	// これは知られていない場合は空の文字列になることがあります。
    35  	// Funcがnilでない場合、Function == Func.Name()です。
    36  	Function string
    37  
    38  	// FileとLineは、このフレームのファイル名と行番号です。
    39  	// 非終端フレームの場合、これは呼び出しの位置になります。
    40  	// もし分かっていない場合は、それぞれ空文字列とゼロになります。
    41  	File string
    42  	Line int
    43  
    44  	// startLineは、このフレームの関数の開始行番号です。具体的には、Goの関数のfuncキーワードの行番号です。注意点として、//lineディレクティブは、関数内で任意のファイル名や行番号を変更することができ、したがってLine - startLineのオフセットは常に意味を持たないことがあります。
    45  	// もし知られていない場合、これはゼロになる場合があります。
    46  	startLine int
    47  
    48  	// 関数のエントリーポイントのプログラムカウンター。不明の場合はゼロ。
    49  	// Funcがnilでない場合、Entry == Func.Entry()。
    50  	Entry uintptr
    51  
    52  	// ランタイムの内部ビューでの関数。このフィールドは、Goの関数にのみ設定されます(funcInfo.valid()がtrueを返します)、Cの関数には設定されません。
    53  	funcInfo funcInfo
    54  }
    55  
    56  // CallersFramesは [Callers] によって返されるPC値のスライスを受け取り、
    57  // 関数/ファイル/行情報を返す準備をします。
    58  // [Frames] で終わるまでスライスを変更しないでください。
    59  func CallersFrames(callers []uintptr) *Frames
    60  
    61  // Nextは、PC値のスライス内で次の呼び出しフレームを表す [Frame] を返します。
    62  // すべての呼び出しフレームをすでに返した場合、Nextはゼロの [Frame] を返します。
    63  //
    64  // moreの結果は、次のNext呼び出しで有効な [Frame] が返されるかどうかを示します。
    65  // これが呼び出し元に一つ返されたかどうかを必ずしも示しません。
    66  //
    67  // 典型的な使用法については、[Frames] の例を参照してください。
    68  func (ci *Frames) Next() (frame Frame, more bool)
    69  
    70  // Funcは実行中のバイナリ内のGo関数を表します。
    71  type Func struct {
    72  	opaque struct{}
    73  }
    74  
    75  // FuncForPCは、指定されたプログラムカウンターアドレスを含む関数を記述した*[Func] を返します。もし複数の関数がインライン展開の影響で存在する場合は、最も内側の関数を示す*Funcを返しますが、最も外側の関数のエントリーも持っています。
    76  func FuncForPC(pc uintptr) *Func
    77  
    78  // Nameは関数の名前を返します。
    79  func (f *Func) Name() string
    80  
    81  // Entryは関数のエントリーアドレスを返します。
    82  func (f *Func) Entry() uintptr
    83  
    84  // FileLineは、プログラムカウンターpcに対応するソースコードのファイル名と行番号を返します。
    85  // pcがfのプログラムカウンターでない場合、結果は正確ではありません。
    86  func (f *Func) FileLine(pc uintptr) (file string, line int)