go 程序也可以開(kāi)啟類(lèi)似 C++ coredump 功能屯吊,這樣有時(shí)可以方便我們定位問(wèn)題寝殴。
示例代碼:
package main
func main() {
var a map[int]string
a[1] = "hello world"
}
注意:我們使用dlv 結(jié)合core文件查看時(shí)敷鸦,需要編譯出來(lái)的可執(zhí)行文件帶有符號(hào)信息。
一次性開(kāi)啟coredump 功能
有時(shí)候万矾,我們只需要一次性使用coredump功能伤疙,那么直接按照如下方法即可:
GOTRACEBACK=crash ./main
如果需要永久的開(kāi)啟coredump烦衣,那么需要按照如下方法:
開(kāi)啟core文件功能
- 設(shè)置core文件限制大小
使用ulimit -c
可以查看core文件限制大小,一般來(lái)說(shuō)掩浙,默認(rèn)為0,這種是不能生成core文件的秸歧。
使用下面的命令改為無(wú)限制厨姚。# ulimit -c unlimited # 針對(duì)當(dāng)前終端此次會(huì)話有效
- 設(shè)置 GOTRACEBACK 環(huán)境變量值為 crash
# export GOTRACEBACK=crash # 針對(duì)當(dāng)前終端此次會(huì)話有效 # env | grep GOTRACEBACK # 查看 GOTRACEBACK=crash
如果需要針對(duì)當(dāng)前用戶一直生效,那么需要在 ~/.bash_profile
追加上述內(nèi)容键菱。
如果需要針對(duì)所有用戶生效谬墙,那么需要在 /etc/profile
追加上述內(nèi)容。
然后再對(duì)應(yīng)執(zhí)行source ~/.bash_profile
或者 source /etc/profile
systemd 服務(wù)配置文件中
很多時(shí)候经备,我們的服務(wù)是以systemd 來(lái)管理的拭抬,那么我們可以在中的配置文件中的Service節(jié)中加入:
[Service]
LimitCORE=infinity
Environment="GOTRACEBACK=crash"
...
控制core文件格式
在 /proc/sys/kernel/core_pattern
可以設(shè)置格式化的core文件保存位置和文件名。
比如:core-%e-%p-%t
表示在當(dāng)前目錄生成 "core-命令-pid-時(shí)間戳" 為文件名的core文件
比如:/cfg/core-%e-%p-%t
表示在/cfg下生成 "core-命令-pid-時(shí)間戳" 為文件名的core文件
注意:/proc/sys/kernel/core_pattern
不能直接編輯侵蒙,可以用 echo core-%e-%p-%t > /proc/sys/kernel/core_pattern
符號(hào) | 意義 |
---|---|
%p | insert pid into filename 添加 pid |
%u | insert current uid into filename 添加當(dāng)前 uid |
%g | insert current gid into filename 添加當(dāng)前 gid |
%s | insert signal that caused the coredump into the filename 添加導(dǎo)致產(chǎn)生 core 的信號(hào) |
%t | insert UNIX time that the coredump occurred into filename 添加 core 文件生成時(shí)的 unix 時(shí)間戳 |
%h | insert hostname where the coredump happened into filename 添加主機(jī)名 |
%e | insert coredumping executable name into filename 添加命令名 |