一、获取内核转储
大多数Linux发行版默认关闭内核转储功能,可使用 ulimit -c 查看,-c 表示内核转储文件的大小限制,如果为0,表示未开启。
1、可设置为 ulimit -c unlimited 表示无限制,或设置为其它数值,单位是字节,立即生效。
2、修改 /etc/security/limits.conf 文件,重启后生效。
开启该功能后,当程序异常终止时,会在当前目录下生成 core.pid 的内核转储文件。通过 gdb -c core.pid ./a.out 就可以启动调试。
修改 coredump 的路径和格式:
1、修改配置文件/etc/sysctl.conf (重启后生效,也可以使用 sysctl -p 命令使其立即生效),如:
kernel.core_pattern = corekernel.core_uses_pid = 0 #是否给 core 文件增加 pid 值的后缀名,为 1 表示增加,为 0 表示不增加
2、使用命令直接改写内存(可立即生效,但重启后失效),如:
echo "core" > /proc/sys/kernel/core_patternecho "0" > /proc/sys/kernel/core_uses_pid
注:core_pattern 可以设置为 /var/core/%e_%t.core ,从而定制了 core 文件的统一路径和命令规则(%e:执行文件名称;%t:产生 core 文件时间戳)
二、gdb 附加到正在运行的进程
attach pid ,调试完之后,使用 detach 即可以和进程分离。
加上 -g 选项编译生成的可执行文件(如 a.out),运行后在挂掉时,会向 /var/log/message 文件中写入地址信息(即 IP 指向的值,如 40052e ),通过 addr2line -e a.out 40052e 就可以输出错误发生在哪个文件的哪一行中。注:如果没有向 /var/log/message 写入信息,请查看 syslog 服务有没有启动,CentOS6.4 下,需要 /etc/init.d/rsyslog restart
gcc -pg test.cpp -o test //编译和链接时都需要加上 -pg 参数
./test //生成 gmon.out 文件
wget http://gprof2dot.jrfonseca.googlecode.com/git/gprof2dot.py
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.34.0.tar.gz
gprof ./test gmon.out >report.txt //生成报告文件
gprof2dot report.txt > test.dot //生成 dot 文件
dot test.dot -Tpng -o test.png //将 dot 文件生成图片