如何调试用golang编写的死锁进程



我有一个用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检索回溯
    • 在所有平台上工作

相关内容

  • 没有找到相关文章