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)