在 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中文网其他相关文章!