Golang: Troubleshooting

9th December 2021 at 3:57pm

卡住的程序

如果你的 Go 程序看起来卡住了(stuck / hang),有这些可能性(当然不仅这些):

  • 等待获取一个锁
  • 等待一个 channel 关闭,比如用了 for range channel,或者向一个 channel 读取数值
  • syscall 卡住

Pprof 中有一类 block profile,可以把这里面各种 block 都统计出来。

但是实际上假如你仅是一个 goroutine 卡住,从统计数据上可能很难看出问题来。

另外一个方法是,向你的程序发送 ABRT 信号:

kill -ABRT <pid>

Go 程序会退出,并把各 goroutine 的 stack trace 都打出来。要注意在启动程序时重定向你的 stderr,以避免这个信息没有被捕捉到。

另外一个可能性是使用 runtime/trace,还在调研中。