go 程序也可以开启类似 C++ coredump 功能,这样有时可以方便我们定位问题。
示例代码:
package main
func main() {
var a map[int]string
a[1] = "hello world"
}
注意:我们使用dlv 结合core文件查看时,需要编译出来的可执行文件带有符号信息。
一次性开启coredump 功能
有时候,我们只需要一次性使用coredump功能,那么直接按照如下方法即可:
GOTRACEBACK=crash ./main
如果需要永久的开启coredump,那么需要按照如下方法:
开启core文件功能
- 设置core文件限制大小
使用ulimit -c可以查看core文件限制大小,一般来说,默认为0,这种是不能生成core文件的。
使用下面的命令改为无限制。# ulimit -c unlimited # 针对当前终端此次会话有效 - 设置 GOTRACEBACK 环境变量值为 crash
# export GOTRACEBACK=crash # 针对当前终端此次会话有效 # env | grep GOTRACEBACK # 查看 GOTRACEBACK=crash
如果需要针对当前用户一直生效,那么需要在 ~/.bash_profile 追加上述内容。
如果需要针对所有用户生效,那么需要在 /etc/profile 追加上述内容。
然后再对应执行source ~/.bash_profile 或者 source /etc/profile
systemd 服务配置文件中
很多时候,我们的服务是以systemd 来管理的,那么我们可以在中的配置文件中的Service节中加入:
[Service]
LimitCORE=infinity
Environment="GOTRACEBACK=crash"
...
控制core文件格式
在 /proc/sys/kernel/core_pattern 可以设置格式化的core文件保存位置和文件名。
比如:core-%e-%p-%t 表示在当前目录生成 "core-命令-pid-时间戳" 为文件名的core文件
比如:/cfg/core-%e-%p-%t 表示在/cfg下生成 "core-命令-pid-时间戳" 为文件名的core文件
注意:/proc/sys/kernel/core_pattern 不能直接编辑,可以用 echo core-%e-%p-%t > /proc/sys/kernel/core_pattern
| 符号 | 意义 |
|---|---|
| %p | insert pid into filename 添加 pid |
| %u | insert current uid into filename 添加当前 uid |
| %g | insert current gid into filename 添加当前 gid |
| %s | insert signal that caused the coredump into the filename 添加导致产生 core 的信号 |
| %t | insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间戳 |
| %h | insert hostname where the coredump happened into filename 添加主机名 |
| %e | insert coredumping executable name into filename 添加命令名 |