golang的coredump调试入门
core dump 概念 core dump文件实际上是进程在某个时间点时的内存映像,当时进程使用的内存是啥样就会被原样保存下来存在文件系统的某个位置上,这个时间点一般是触发了SIGSEGV或者SIGABRT这两个信号的时候,当进程的内存映像保存完毕后进程就会异常终止,也就是大家喜闻乐见的“程序崩了”和“段错误:核心已转储”。 因此 coredump 就像是程序出错崩溃后的“第一现场”,是用来排查错误的主要资源。 golang 程序生成 coredump 方法 设置环境变量和在代码里调用相关的标准库接口 在这之前先用ulimit命令检测下系统当前能不能生成coredump: 1 2 $ ulimit -c unlimited 如果是unlimited就表示可以,如果是0那就不会生成,需要修改ulimit的设置。 修改GOTRACEBACK环境变量 GOTRACEBACK是用来控制panic发生时golang程序行为的,值是字符串,具体内容如下: 值 行为 none 不打印任何堆栈跟踪信息,不过崩溃的原因和哪行代码触发的panic还是会打印 single 只打印当前正在运行的触发panic的goroutine的堆栈以及runtime的堆栈;如果panic是runtime里发出的,则打印所有goroutine的堆栈跟踪信息 all 打印所有用户创建的goroutine的堆栈信息(不包含runtime的) system 在前面all的基础上把runtime相关的所有协程的堆栈信息也一起打印出来 crash 打印的内容和前面system一样,但还会额外生成对应操作系统上的 coredump 文件 将这个环境变量设置成crash就可以获得信息最全面的coredump文件。 设置编译参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package main import ( "fmt" "math/rand" ) func main() { arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} for { index := rand.Intn(11) fmt.Println(arr[index]) } } 1 go build -gcflags="all=-N -l" main.go ...