linux 应用程序调试初步

 

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值