在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 to listen for signals and dump stack traces go func() { stacktrace := make([]byte, 8192) for _ = range sigChan { length := runtime.Stack(stacktrace, true) fmt.Println(string(stacktrace[:length])) } }() // Notify the process to listen for SIGQUIT signals and send them to sigChan signal.Notify(sigChan, syscall.SIGQUIT) // Do some other work here... }</code>
透過執行這段程式碼,您可以透過向Go 進程發送SIGQUIT 來觸發堆疊跟踪轉儲,而無需殺死它。為此,請使用kill -6
以上是如何在不停止 Go 進程的情況下轉儲 Goroutine 堆疊?的詳細內容。更多資訊請關注PHP中文網其他相關文章!