golang的debug方式

协程

协程是轻量级的线程,在Go语言中对应着goroutine,由Go Runtime管理。由于Go在运行的过程中,如果多个goroutine在同时运行,当且仅当运行这个goroutine的线程被阻塞的时候,调度器也才会运行另外的goroutine。

这就意味着

1
2
3
4
go func() {
for {
}
}()

这种函数被调用之后,这个goroutine会长期霸占着线程,而其它goroutine就只能饿死在内存中。
这种情况下,通过strace -f去跟踪系统调用的debug方式,是无法获取正确的信息。

kill大法

Go程序在默认的信号处理中,如果收到了SIGQUIT的信号时,会将正在运行时的goroutine的调用栈输出。即:

1
kill -3 ***

然后知道,自己是怎么坑自己的!