gdb跟踪调试是linux环境下调试常用的方法,但在解决一些问题,如频繁创建线程,打印信息很多时,gdb调试会显得效率很低。这个时候,可以先生成内核转储文件,再针对生成的转储文件进行调试,从而大幅度提高调试效率。
1、生成内核转储文件
- # ulimit –a //查看默认的配置信息,第一项为内核转储文件大小,默认值为0
- # ulimit –c unlimited // ulimit –c 可指定内核转储文件大小,unlimited表示是最大值
- # ./filename //运行测试代码,直到出现段错误
2、用gdb对内核转储文件调试
运行完后,如果有段错误,就会在当前目录下生成core.pid(pid为进程号)文件
# gdb –c core.pid ./filename 或输入命令#gdb –core=core.pid./filename
//从生成的转储文件中读取断点处信息,然后自己调试,方法与gdb的相同
3、在特定目录下生成转储文件
1)/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。可通过以下命令修改此文件:
echo"1" > /proc/sys/kernel/core_uses_pid
2)/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件名格式。
可通过以下命令修改此文件:
echo"/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:%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 thefilename 添加导致产生core的信号
%t - insert UNIX time that the coredump occurred intofilename 添加core文件生成时的unix时间
%h - insert hostname where the coredump happened intofilename 添加主机名
%e - insert coredumping executable name into filename 添加命令名