首页 > 编程知识 正文

gdb调试core文件详解,如何使用gdb调试程序

时间:2023-05-04 08:24:37 阅读:37576 作者:170

文章的目录写在前面

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 /

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。