使用delve和coredump对golang进行调试

coredump是一个包含程序意外终止时的内存快照的文件。它可以用于事后调试,以了解崩溃发生的原因以及其中涉及的变量。通过GOTRACEBACK,Go提供了一个环境变量来控制程序崩溃时产生的输出。这个变量可以强制生成coredump,便于调试。

让golang程序生成core文件
a. ulimit -c unlimited 修改 core 文件的大小
b. 环境变量export GOTRACEBACK=crash 说明golang程序产生coredump

可以使用gdb对coredump进行查看,delve对golang的兼容更好

  1. 编译delve
# git clone https://github.com/derekparker/delve.git
# cd delve/cmd/dlv/
# go build
  1. 将 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值