Golang は、多くの優れた機能を備えた、効率的で簡潔な同時開発言語です。 Golang アプリケーション開発の過程では、関数呼び出しチェーンのトレースなど、より複雑な問題に遭遇することがよくあります。現時点では、関数呼び出しチェーンをより適切に追跡し、アプリケーション開発の問題を解決するためのいくつかのスキルを習得する必要があります。
この記事では、コール スタック関数や Stacktrace など、Golang の関数呼び出しチェーン トレースの手法を紹介します。
Golangでは、ランタイムパッケージの関数を使用できますCaller(i int) (pc uintptr, file string, line int, ok bool)
現在のプログラムで実行されている関数のフルパス情報を取得し、関数が配置されているファイル名と行番号情報を返します。同時に、Callers(skip int, pc []uintptr) int
関数を使用して、現在のスタック上のプログラム カウンターと、現在のスタック呼び出し上のすべての関数の完全なパス情報を返すこともできます。パス。これをコールスタック関数と呼びます。
関数を呼び出すとき、必要に応じて Caller
を使用して、現在のスタック上の呼び出しパスに関する関数情報を取得できます。たとえば、例外が発生した場合、現在のスタック上の関数呼び出し情報を出力して、コード エラーをより適切に見つけることができます。サンプル コードは次のとおりです。
package main import ( "fmt" "runtime" ) func testA() { testB() } func testB() { _, file, line, _ := runtime.Caller(0) fmt.Println(file, line) } func main() { testA() }
この例では、testA
関数を呼び出し、その中で testB
関数を呼び出します。最後に、testB
関数の Caller
関数を通じて関数呼び出し情報を出力しました。
Golang では、ゴルーチン ID は各ゴルーチンの一意の識別子であり、uint64 数値です。プログラムの実行中に現在の Goroutine の ID を取得し、デバッグやエラーの場所を確認するためにそれを出力できます。
Golang では、runtime
パッケージの GetGoID()
関数を使用して、現在の Goroutine の ID を取得できます。サンプル コードは次のとおりです。 ##
package main import ( "fmt" "runtime" ) func test() { fmt.Println("Goroutine ID:", runtime.GetGoID()) } func main() { go test() fmt.Println("main Goroutine ID:", runtime.GetGoID()) for {} }
main 関数でコルーチン (つまり Goroutine) を開始し、コルーチン内で
test 関数を呼び出し、最後に ID を出力しました。現在のゴルーチン情報。
Stacktrace を使用して完全な関数呼び出しチェーン情報を取得できます。これには、
go-spew、
logrus などのサードパーティ ライブラリを使用する必要があります。サンプル コードは次のとおりです。
package main import ( "fmt" "github.com/davecgh/go-spew/spew" "github.com/sirupsen/logrus" ) func testC() { log := logrus.New() log.Out = nil trace := spew.Sdump(string(debug.Stack())) fmt.Println(trace) } func testB() { testC() } func testA() { testB() } func main() { testA() }
debug.Stack() 関数を使用して現在のスタック上の完全な関数呼び出しチェーン情報を取得し、その後
logrusライブラリはこの情報を出力します。同時に、見やすく、配置しやすくするために、
spew.Sdump() 関数を通じてこの情報を文字列形式に変換します。
以上がGolang 関数呼び出しチェーン トレース スキルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。