linux 应用程序调试
最近调试linux下面的应用程序被干的很惨
两个BUG干翻我了
首先是bus error,总线错误,非对齐访问引起的
在板子上调试了半天,没有结果
程序里总共用了2个结构体
用各种__attribute__(());来搞还是不行
aligned(2),aligned(4)都不行,packed都不支持……直接被ignore掉了……
郁闷的不行
然后想产生core dump文件来调试,但是板子上没有gdb,没有gdbserver,没有jtag……要了亲命了,但是我发扬调程序比追女生简单的大无畏精神继续研究
ulimit -c 来查看是否开启了core dump功能。
如果结果是0则说明没有开
ulimit -c 1024 表示core文件大小设置为1024K
ulimit -c unlimited 就是无限制,受硬盘大小限制了
然后产生段错误就会产生core文件
但是bus error死活在板子上没有产生core文件……
没法啊,只有虚拟机上有gdb,于是编译成pc版本的程序,放到gdb里面去调
结果没有bus error了,发生的是segment fault
这个东西好啊……比bus error亲切多了
gdb下产生的segment fault是不会产生core文件的,要直接./program运行才会产生core文件。
然后生成了一个core.xxx 后面加了一堆数字的文件
然后就执行gdb ./program core.xxx
然后就直接可以定位到错误了#0后面的就是
指出了出错的地方,当然不一定就是程序中出错的根源所在,是执行到这一句的时候出错了,不一定就是这句有错。
core文件里定位到一个函数调用,然后函数参数的地址都给出来了,然后我对比了一下地址,发现一个指针被改动了。
OK,然后到处找哪里可能动了我的指针。
谁动了我的指针!!!
后来发现,一个*ptr的操作变成了ptr的操作,直接对指针地址进行了加减而不是对指针的内容……
我承认错误非常的低级,也够隐蔽的,让我调试了接近一个上午
现在改动之后,至少目前还没有出现问题……谢天谢地
另外,即使程序中使用了signal函数屏蔽掉了SIGPIPE信号,但是用gdb的时候gdb本身还是会捕获gdb信号的。可以在gdb中用handle SIGPIPE nostop来屏蔽信号,还有个noprint阻止打印捕获信号信息的。
我现在对core.xxx的崇敬之情犹如滔滔江水连绵不绝于掩耳盗铃之势……
O(∩_∩)O~ (⊙o⊙)… ╭(╯3╰)╮
参考链接
6. 观察堆栈, GDB Manual 6
http://wiki.chinaunix.net/index.php?title=GDB_Manual_6&diff=next&oldid=4050
[转载]Linux 编程段错误(segmentation error)总结
http://blog.chinaunix.net/space.php?uid=20565550&do=blog&cuid=1870714
Linux下的段错误产生的原因及调试方法
http://blogold.chinaunix.net/u3/94284/showart_2052200.html
linux socket 程序 SIGPIPE 和GDB的问题
http://hi.baidu.com/yatusiter/blog/item/e03142a92c7eccf01e17a2bd.html
由SIGPIPE导致程序退出想到的
http://www.wuzesheng.com/?p=205