如何轉儲正在運行的Go 進程中所有Goroutine 的堆疊追蹤
在偵錯或排除Go 進程故障時,取得所有Go>
在偵錯或排除Go 進程故障時,取得所有Go進程的堆疊追蹤它的goroutine 可能至關重要。然而,在不修改原始程式碼或終止進程的情況下執行此操作可能具有挑戰性。本指南提供了此問題的解決方案。
Go 運行時包含一項功能,可讓您按需轉儲堆疊追蹤。然而,從進程外部呼叫此功能並不是立即顯而易見的。
使用訊號處理程序要捕獲所有 goroutine 的堆疊跟踪,您可以設定一個訊號監聽特定訊號的處理程序。收到訊號後,處理程序將產生並列印堆疊追蹤。
<code class="go">import ( "fmt" "os" "os/signal" "runtime" "syscall" ) func main() { // Create a channel to receive signals. sigChan := make(chan os.Signal) // Start a goroutine that will write stack traces to the channel. go func() { // Create a buffer to hold the stack trace. stacktrace := make([]byte, 8192) // Loop until a signal is received. for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() // Register to receive SIGQUIT signals. signal.Notify(sigChan, syscall.SIGQUIT) // Continue with the main application logic. ... }</code>以下是範例程式碼片段:
發送訊號
kill -QUIT <process id>設定處理程序後,您可以向行程堆疊SIGQUIT 訊號以觸發堆疊追蹤轉儲。您可以使用以下命令來執行此操作:
其中
kill -QUIT <process id>進程運行時,打開終端機視窗並輸入Kill 指令:
以上是如何取得正在運行的 Go 進程中所有 Goroutine 的堆疊追蹤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!