Linux下coredump调试3:补录

原创 2016年05月31日 22:53:55

本篇文章记录在coredump调试过程中记录的其它事项。

一般地,调试的方式多种多样,不可能将其一网打尽。就笔者而言,一般喜欢用print大法,分段注解法,版本回退法,等等。实在无招,则用coredump文件调试了。在笔者“众多”经验中,程序挂掉原因多种多样,像内存泄漏造成无内存可用,文件/socket打开未关闭被耗尽。所以编程的规范还是很关键的,这不单单是说编码命名风格,还有整体编程的设计和细心程度,比如指针的判断,数组范围不要越界,自己申请的内存要记得释放,等等。

嵌入式ARM Linux使用注意事项

在嵌入式上进行调试的方法很多,网上很多文章介绍了gdbserver的方式,同时结合codeblock则可以达到IDE调试目的。但可惜往往是些简单例子。实际中,嵌入式设备运行的程序,可能和驱动模块实时交互,还和网络密切频繁通信,另外还开了N个线程,M个进程,在如此庞大的系统中,一旦出现段错误,除了靠打印信息外,还可以靠开发人员自身的经验,靠对系统的熟悉程度进行排查。而coredump作为事后分析手段,也大量被应用在日常工作中。

但是,嵌入式的调试还是比较困难的。因为,要么设备所用的系统是只读的,要么存储介质的容量很小,当大型系统崩溃时,产生的coredump文件体积很大,无法在存储介质上保存,则会丢失很多信息,无法用gdb调试。
另外一个因素是看门狗。很多系统都有看门狗机制,一旦程序崩溃则会即刻复位,无法拿到coredump进行分析。

下面说说笔者的经验:

1、设置ulimit,可以在程序代码中设置,也可以在启动脚本中设置,只要保证在程序运行环境中设置就行了。比如,你是telnet到系统中手动执行程序的话,一定要telnet终端中设置ulimit后再运行程序。

2、将看门狗禁止掉或延长时间。有的设备可以短接主板的排针禁止狗,有的则可以通过代码禁止狗。比如我移植的系统,直接用echo就可以把狗禁止掉。

3、使用NFS挂载,以便存储生成的coredump文件。

4、编译器和调试器版本一定要对应起来。否则会出现很多莫名其妙的问题,如下文将讲述到的问题。


用bt查看函数为问号(???)

1、使用-O2优化,或者strip过后的二进制程序,是无法产生调试信息的,此时用gdb查看不到函数名称。所以要用-g编译选项,使其产生调试信息,同时不要将程序strip。

2、库版本不对。可能是真的库版本不正确,也可能是路径不正确。遇到库不对应的问题,可以先打开gdb,使用set solib-absolute-prefix 和set solib-search-path来设置库路径。示例如下(按实际路径填写):

#gdb
#set solib-absolute-prefix "/home/latelee/cross/arm-linux/lib"
#set solib-search-path "/home/latelee/cross/arm-linux/lib"
#file a.out
#core-file core

网上有文章对此做了介绍:《gdb调试coredump文件,函数名称是问号》,本文就不展开讨论了。

编码的一些心得

1、一般在函数内申请内存的,要在本函数内释放掉,如果申请空间少,建议直接用数组,以免忘记申请造成内存泄漏。如果实在要使用二级指针来存储函数内申请的空间,则要在函数声明处注明其用法。

2、任何时候,一定要判断指针的有效性。另外要特别注意多级指针情况。比如onvif获取编码参数时,有一项是获取IP地址的代码片段示例:resp.Configuration->Multicast->Address->IPv4Address。这个示例中,一定要逐级判断指针是否合法。

3、使用printf、scanf等函数时,要注意参数一致性。默认的C库在GCC中是有检查的,注意编译警告可减小其段错误概率。但如果是自己写的打印log函数,未尽能检查。笔者的这篇文章可参考:《一个可变参数类型检查的示例

4、打开的资源要及时释放,特别是return、break、goto这些地方,很容易忘记关闭。资源包括但不限于:socket、普通文件句柄(文件描述符)、目录,等等。笔者的这篇文章可参考:《遇到一个因socket未关闭引发的文件句柄用完问题

5、建议使用cppcheck进行一次代码检查。笔者的这篇文章可参考:《使用cppcheck检测代码警告、错误


李迟 2016.5.31 周二 夜 

版权声明:本文为迟思堂主人李迟原创文章,如转载请注明出处,并附带原文超链接地址。用于商业用途请付稿费¥100/千字。谢谢。

Linux下coredump调试1:使用

李迟按: 调试是程序员的一项基本能力,经历过大大小小的实战,随着见识的增长,只要用心留意并做总结,相信调试的能力会越来越好。写程序不能没有bug,只是bug容易不容易被发现,bug的危害大不大。笔者使...
  • subfate
  • subfate
  • 2016年05月31日 21:38
  • 2661

arm-linux-gdb在调试core dump文件的用法

1·关于gdb调试 在网上能够搜索到很多关于gdb调试以及gdb命令的使用,在调试程序的时候非常的方便,但是对于嵌入式Linux上应用程序开发呢?可能很多都是在使用“printf”大法,的确pr...
  • ywyywyywy
  • ywyywyywy
  • 2014年03月12日 11:05
  • 452

Linux c 开发 - 常用Linux下c语言调试方法

本文主要总结一下Linux下调试c语言进程的常用方法。 1. dmesg dmesg主要用于在进程崩溃掉的时候,显示内核的相关信息。 dmesg | tail -f #打印当前信息 dmesg -...
  • initphp
  • initphp
  • 2016年01月05日 17:15
  • 1224

linux下生成core dump文件调试方法及设置

转自:http://andyniu.iteye.com/blog/1965571 core dump的概念: A core dump is the recorded state of the wo...
  • zzwdkxx
  • zzwdkxx
  • 2017年06月27日 13:23
  • 849

gdb调试coredump(使用篇)

什么是coredump   Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运...
  • sunxiaopengsun
  • sunxiaopengsun
  • 2017年06月10日 09:35
  • 1432

gdb调试coredump(使用篇)

什么是coredump,ulimit,Windows下miniDump和FullDump的设置,gdb 调试coredump的简单示例,生成core文件,自定义core文件的文件名,设置永久保存,gd...
  • u014403008
  • u014403008
  • 2017年01月07日 15:20
  • 3641

没打开coredump,利用dmesg调试core的方法

线上的机器为防止coredump把机器打死,通常都会把core关闭。如果线上机器出现core等问题,该怎样进行调试呢?   通过dmesg可以解决上面的问题。   首先输入dmesg看相应的输出信息,...
  • tl_sunshine
  • tl_sunshine
  • 2017年03月05日 16:23
  • 282

gdb 调试coredump文件中烂掉的栈帧的方法____本人备注

原文地址::http://blog.csdn.net/muclenerd/article/details/48005171 相关文章 1、无符号和栈破坏情况下coredump的分析方法----ht...
  • xqhrs232
  • xqhrs232
  • 2016年10月24日 18:03
  • 469

gdb调试coredump(原理篇)

上一篇博客里我们通过3个例子介绍了gdb调试coredump的时候,比较常用到的一些命令和定位方法。这篇内容里,我们将尝试去探讨gdb调试coredump的原理,以及它们背后的一些东西。   Co...
  • u014403008
  • u014403008
  • 2017年01月22日 08:46
  • 822

2016年元月份腾讯测试开发补录面试总结

补录信息来自qq部落中的qq茶馆。。。 因本人一直都是做安卓开发的,投递的是测试开发,因我之前有做过单片机开发,嵌入式开发,你叫适合MIG无线终端研发部门测试的工作,所有就给我安排了进三次技...
  • u011644473
  • u011644473
  • 2016年03月07日 13:42
  • 746
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下coredump调试3:补录
举报原因:
原因补充:

(最多只允许输入30个字)