非常遗憾的是,目前没有类似pstack/jstack的工具可以使用。
网上有一些办法,需要在源程序里面预先添加代码,例如debug.PrintStack(),然后外面触发信号,打印stack内容;可是现实情况下运行程序并没有这些专门为调试而设置的代码。
例如正常运行的程序,线上程序,突然死锁了,如何查看各个goroutine都在干什么呢?
目前我了解的唯一办法就是给进程发送SIGQUIT信号:
kill -SIGQUIT <pid>
go进程在收到SIGQUIT信号后,会往标准错误(stderr)打印出所有goroutine的stack信息。
但是遗憾的是,此时go进程也就退出了。
如果既想打印出所有gorouotine的stack,又不杀掉进程本身,好像没有办法唉。
另外pstack对于go进程根本不管用,pstack能打印出操作系统级别的thread信息,但是goroutine并没有和thread有对应关系,特别是GOMAXPROCS=1时,pstack只打印出一个线程的stack信息,没有任何goroutine的stack信息。
有疑问加站长微信联系(非本文作者)