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

如何调试用golang编写的死锁进程,go,Go,我有一个用golang编写的进程,它作为守护进程运行 几天后,它毫无理由地停止了生产。我认为这可能是内部僵局。如果我做一个strace-p我可以看到这条线 futex(0x9aaba0, FUTEX_WAIT, 0, NULL 很明显,这个电话永远不会结束。我想使用已经运行的进程(因为我不知道如何/何时再次触发bug)来调试问题 我怎样才能看到goroutines在运行什么以及它们在哪里?如何从进程中转储可能有助于调试问题的任何其他信息?您可以向任何go程序发送一个退出信号,它将以完整堆栈跟踪

我有一个用golang编写的进程,它作为守护进程运行

几天后,它毫无理由地停止了生产。我认为这可能是内部僵局。如果我做一个
strace-p
我可以看到这条线

futex(0x9aaba0, FUTEX_WAIT, 0, NULL
很明显,这个电话永远不会结束。我想使用已经运行的进程(因为我不知道如何/何时再次触发bug)来调试问题


我怎样才能看到goroutines在运行什么以及它们在哪里?如何从进程中转储可能有助于调试问题的任何其他信息?

您可以向任何go程序发送一个退出信号,它将以完整堆栈跟踪退出,显示所有Goroutine的状态以及它们是如何被阻止的


至于
strace
,go程序总是多线程的,因此您总是需要添加
-f
选项,这非常相关:我认为,如果不使用一些调试输出重新编译,这将非常困难。From:“GDB不太了解围棋程序。”。。。“因此,尽管GDB在某些情况下很有用,但它不是Go程序的可靠调试器,尤其是并发性很强的程序。此外,解决这些困难的问题并不是Go项目的优先事项。简言之,以下说明仅应作为GDB工作时如何使用的指南,而不是可能有用。不幸的是,守护进程捕获退出信号进行一些清理,然后调用
exit(0)
。使用
-f
选项很好。恐怕我需要重新编译带有一些附加调试功能的守护进程,然后希望错误再次发生:-(