coredump是一个包含程序意外终止时的内存快照的文件。它可以用于事后调试,以了解崩溃发生的原因以及其中涉及的变量。通过GOTRACEBACK,Go提供了一个环境变量来控制程序崩溃时产生的输出。这个变量可以强制生成coredump,便于调试。
让golang程序生成core文件
a. ulimit -c unlimited 修改 core 文件的大小
b. 环境变量export GOTRACEBACK=crash 说明golang程序产生coredump
可以使用gdb对coredump进行查看,delve对golang的兼容更好
- 编译delve
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
- 将 dlv 拷贝到线上有coredump的服务器。
分析coredump
GOTRACEBACK可以用于控制程序程序崩溃时输出内容的多少,它可以有以下一些取值:
none 不显示goroutine的堆栈调用的trace
single (默认值)显示当前goroutine的堆栈调用的trace
all显示用户创建的所有的goroutine的堆栈调用的trace
system显示包含运行时goroutine及其它所有goroutine的堆栈调用的trace
crash类似于system,不同的是,它同时也会产生coredump
最后一个选项使我们能够在程序崩溃时进行调试。如果你没有得到足够的日志,或者崩溃无法重现,这可能是一个不错的选择。让我们用下面的程序来举个例子:
代码如下
package main
import "math/rand"
func main() {
sum := 0
for {
n := rand.Intn(1e6)
sum += n
if sum%42 == 0 {
panic(":(")
}
}
}
go build test.go
运行./test
[root@bigc dlv]# ./dlv core ./test core.13488 --check-go-version=false
Type 'help' for list of commands.
(dlv) bt
0 0x000000000044dd51 in runtime.raise
at /usr/lib/golang/src/runtime/sys_linux_amd64.s:150
1 0x0000000000436dbb in runtime.dieFromSignal
at /usr/lib/golang/src/runtime/signal_unix.go:428
2 0x000000000043721d in runtime.sigfwdgo
at /usr/lib/golang/src/runtime/signal_unix.go:631
3 0x00000000004364a0 in runtime.sigtrampgo
at /usr/lib/golang/src/runtime/signal_unix.go:289
4 0x000000000044e043 in runtime.sigtramp
at /usr/lib/golang/src/runtime/sys_linux_amd64.s:357
5 0x000000000044e130 in runtime.sigreturn
at /usr/lib/golang/src/runtime/sys_linux_amd64.s:449
6 0x0000000000436f5a in runtime.crash
at /usr/lib/golang/src/runtime/signal_unix.go:520
7 0x00000000004251c4 in runtime.fatalpanic
at /usr/lib/golang/src/runtime/panic.go:874
8 0x0000000000424b82 in runtime.gopanic
at /usr/lib/golang/src/runtime/panic.go:722
9 0x0000000000453ff8 in main.main
at ./test.go:11
10 0x00000000004268ce in runtime.main
at /usr/lib/golang/src/runtime/proc.go:203
11 0x000000000044c3a1 in runtime.goexit
at /usr/lib/golang/src/runtime/asm_amd64.s:1357
(dlv) ls
> runtime.raise() /usr/lib/golang/src/runtime/sys_linux_amd64.s:150 (PC: 0x44dd51)
Warning: debugging optimized function
145: MOVL AX, SI // arg 2 tid
146: MOVL R12, DI // arg 1 pid
147: MOVL sig+0(FP), DX // arg 3
148: MOVL $SYS_tgkill, AX
149: SYSCALL
=> 150: RET
151:
152: TEXT runtime·raiseproc(SB),NOSPLIT,$0
153: MOVL $SYS_getpid, AX
154: SYSCALL
155: MOVL AX, DI // arg 1 pid