文章的目录写在前面
Go跟踪后退
戴尔
微信公众号:[double12fqdxy]
关注集装箱技术,关注Kubernetes。 问题和建议请向公众号留言。
上一篇文章基于谷歌戴尔1.4.1。
coredump是包含程序意外退出时的内存快照的文件。 可用于事后调试,以了解崩溃的原因及其相关变量。 通过GOTRACEBACK,Go提供了控制程序崩溃时产生的输出的环境变量。 该变量也可以强制生成coredump,从此可以进行调试。
GOTRACEBACK GOTRACEBACK可用于控制程序崩溃时的输出量,并提供以下值:
•none不显示goroutine的堆栈调用trace•single (默认)显示当前goroutine的堆栈调用trace•all显示用户创建的所有goroutine的堆栈调用
最后一个选项允许在程序崩溃时进行调试。 如果没有足够的日志记录,或者无法再现崩溃,这可能是一个不错的选择。 下面的步骤举例:
包主
import 'math/rand '
func main () }
sum :=0
for {
n:=rand.intn(1E6 ) )。
sum =n
if sumB==0 {
Panic(': ) ) ) )。
}
}
}运行上面的程序后,你很快就会发现程序错了。
f:(Hellogorunmain.go
panic: (
go routine1[运行] :
main.main ()
f :/hello/main.go :110 x 8f
关于exit status 2,问题是无法从堆栈调用的trace中确定具体是哪个值导致的崩溃。 当然,通过添加日志,可以一步一步地确定问题具体在哪里,但不一定知道应该将日志添加到哪里。 另外,如果问题无法再现,写测试用例使其得到修复也相当困难。
总结上述想法。 重复进行直到添加日志并运行APP应用程序,然后查看并运行可能的原因。
有其他方法吗? 答案是有的。
在GOTRACEBACK=crash上再次运行可获得更详细的输出。 这是因为当前打印了所有goroutines,包括运行时的。 另外,还生成了相应的coredump文件。 (coredump文件由SIGABRT触发器生成,win当前不支持coredump生成。 )。
f : (hellosetgotraceback=crash
f:(Hellogorunmain.go
panic: (
go routine1[运行] :
panic (0x 469600,0x 48 d7b0) ) ) ) ) )。
d :/go/src/runtime/panic.go :10640 x 470 FP=0xc 00002 BF 58 sp=0xc 00002 bea0PC=0x 42 FD 90
main.main ()
f :/hello/main.go :110 x 8f FP=0xc 00002 BF 88sp=0xc 0002 BF 58pc=0x 461 d8f
runtime.main (
d :/go/src/runtime/proc.go :2040 x 209 FP=0xc 00002 BF e0sp=0xc 0002 BF 88pc=0x 432929
runtime.goexit (
d :/go/src/runtime/ASM _ amd64.s :13740 x1 FP=0xc 00002 BF e8sp=0xc 0002 BF e0pc=0x 45 ABC 1
goroutine2[forceGC[idle]]:
runtime.go park (0x 47 cf 20,0x4d1b 20,0x 1411,0x1) )
d :/go/src/runtime/proc.go :3060 xf AFP=0xc 00027 fb0sp=0xc 00027 f90pc=0x 432 CFA
runtime.goparkunlock(…)
d :/go/src/runtime/proc.go :312
runtime.forcegchelper (
d :/go/src/runtime/proc.go :2550 xcd FP=0xc 00027 fe0sp=0xc 00027 fb0pc=0x 432 b8d
runtime.goexit (
d :/go/src/runtime/ASM _ amd64.s 336013740 x1 FP=0xc 00027 fe8sp=0xc 00027 fe0pc=0x 45 ABC 1
created by runtime.init.6
d :/go/src/runtime/proc.go :2430 x 3c
goroutine 3 [GC sweep wait]:
runtime.go park (0x 47 cf 20,0x 4d 1c 00,0x 140 c,0x1) )
d :/go/src/runtime/proc.go :3060 xf AFP=0xc 000029 fa8sp=0xc 00029 f88pc=0x 432 CFA
runtime.goparkunlock(…)
d :/go/src/runtime/proc.go :312
runtime.BGsweep(0xc000018070 )。
d :/go/src/runtime/MGC sweep.go :1630 xb2fp=0xc 00029 fd8sp=0xc 00029 fa8pc=0x41e 132
runtime.goexit (
d :/go/src/runtime/ASM _ amd64.s :13740 x1 FP=0xc 00029 fe0sp=0xc 00029 fd8pc=0x 45 ABC 1
创建by runtime.GC enable
d :/go/src/runtime/MGC.go :2170 x 67
go routine4[ gcscavengewait ] :
runtime.go park (0x 47 cf 20,0x 4d 1c 60,0x 140 d,0x1) )
d :/go/src/runtime/proc.go :3060 xf AFP=0xc 000037 f78sp=0xc 00037 f58pc=0x 432 CFA
runtime.goparkunlock(…)
d :/go/src/runtime/proc.go :312
runtime.BG scavenge (0xc 000018070 )。
d :/go/src/runtime/MGC scavenge.go :2650 xe5FP=0xc 000037 fd8sp=0xc 00037 f78pc=0x41c 105
runtime.goexit (
d :/go/src/runtime/ASM _ amd64.s :13740 x1 FP=0xc 000037 fe0sp=0xc 00037 fd8pc=0x 45 ABC 1
创建by runtime.GC enable
d :/go/src/runtime/MGC.go :2180 x 89
可以使用delve[1]或GDB[2]调试exit status 2生成的酷睿dump。
Delve Delve是用Go编写的Go程序调试器。 可以通过在用户代码和运行时的任何位置添加断点来逐步调试。 也可以使用以二进制文件和核心dump为参数的命令dlv core调试核心dump。
命令运行后,可以开始与核心转储进行交互。
外部链接[1] http://www.Sina.com/https://github.com/go-delve/delve
[2] http://www.Sina.com/https://www.GNU.org/software/gdb /