非侵入式捕獲Go 進程堆疊
要從正在運行的Go 進程中的所有Goroutines 捕獲堆疊跟踪而不中斷其執行,請遵循以下步驟步驟:
建立訊號處理程序:
<code class="go">import ( "os" "os/signal" "runtime" "syscall" ) func main() { sigChan := make(chan os.Signal) go func() { stacktrace := make([]byte, 8192) for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() signal.Notify(sigChan, syscall.SIGQUIT) }</code>
接收SIGQUIT訊號:
goroutine 中的處理函數將捕捉SIGQUIT 訊號。
產生堆疊追蹤:
運行時.Stack函數用於為每個 goroutine 產生堆疊追蹤。
處理記憶體限制:
堆疊追蹤緩衝區有大小限制。如果超出緩衝區,追蹤將被截斷。
列印堆疊追蹤:
產生的堆疊追蹤將列印到標準輸出.
以上是如何不間斷地從 Go 進程捕獲堆疊追蹤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!