C++应用GDB分析CoreDump文件

勿忘初心2018-09-27 16:05

本文来自网易云社区

作者:陶奎


最近测试的时候遇到一个问题,C++开发的应用,一发起压力就崩溃(Segmentation fault):

通过下面的方法定位解决。采用的是使用GDB对coreDump分析的方式:

第1步:配置:core file size
配置core文件的大小,默认大小是0,也就是不会生成。通过命令ulimit -a可以查看:
    
使用ulimit -c ulimited可以指定不限制大小。也可以ulimit -c 102400,表示设置为100M,一般建议设置为unlimited,否则可能定位不到堆栈信息。
调整后(unlimited):


第2步:重现问题生成core文件
再次测试,在程序崩溃的时候会自动生成core文件
         
    如果设置的是ulimit -c 102400,生成文件大小就是100MB
 
第3步:使用gdb分析core文件(有时候需要加日志进一步定位)
gdb打开core文件:gdb ./voip_rtmp_server_x264_1026_6(C++编译的服务) core
提示退出原因:Program terminated with signal 6, Aborted.#0  0x00007f3ec80e2125 in raise () from /lib/x86_64-linux-gnu/libc.so.6  
bt查看更调用栈信息:
根据此信息到程序中检查,再加上日志打印进一步定位到问题。一般将此信息提供给开发,相信开发能从中找到端倪啦!
PS:注意!!!如果core file size设置过小会有如下提示,分析不出具体信息
    
第4步:根据分析结果修改调整代码
开发分析:此处 Close了编码器,但是没有把编码器指针置空,本来是enc_handle=NULL的,写成了enc_handle==NULL。 后面又用这个野指针进行其他操作,所以一直崩溃
    调整为:
    
第5步:验证调整结果
调整之后,复测了多次,没有再出现崩溃现象!!

以上是一次个人实践做的笔记记录。
GDB的功能很强大,支持对进程调试、打点;

网易云免费体验馆,0成本体验20+款云产品! 

更多网易研发、产品、运营经验分享请访问网易云社区