我有一个用golang编写的进程,它作为守护进程运行。
几天后,它在没有明显原因的情况下停止生产。我认为这可能是内部僵局。如果我做strace -p <PID>
,我可以看到行
futex(0x9aaba0, FUTEX_WAIT, 0, NULL
显然,这通电话永远不会结束。我想使用已经运行的进程(因为我不知道如何/何时再次触发错误)来调试问题。
我如何才能看到运行的goroutines以及它们在哪里?如何从进程中转储对调试问题可能有用的任何其他信息?
您可以向任何go程序发送QUIT
信号,它将以全栈跟踪退出,显示所有goroutine的状态以及它们是如何被阻止的。
至于strace
,go程序总是多线程的,所以您总是需要添加-f
选项
以下是死锁的一些方法:并发的阴暗面(包括什么是死锁,如何调试以及如何避免死锁)
- 使用SIGQUIT
- 这在基于Unix的系统上产生了一个很好的回溯
- 用
kill -QUIT pid
发送 - 或按
CTRL-
- 不适用于Windows
- 使用http调试处理程序
- 使用web浏览器或curl检索回溯
- 在所有平台上工作