Segment fault之痛

自从学习在linux下开发以来,segment fault便是家常便饭了。对付此类问题,通常办法:

1、调试或看coredump文件,查看调用堆栈找出错点,通常能准确定位;

2、有些隐藏问题直接看调用堆栈是发现不了的,这时候用valgrind来看下哪里内存使用有问题,能发现更多的问题。

 

最近遇到的几个错误不那么明显,最后用valgrind找出毛病的案例:

1、代码写的逻辑有点复杂,中间有很多的return,造成了malloc和free不配对 ,由于是自动变量未初始化,结果free时也能正常走,但是到了其他地方就出错了,出错的地方跟这一点关系也没有,直接找无从下手。最后用valgrind一查,提示用了未初始化的变量,找到了问题所在。

2、 用sprintf构造字符串,结果字符串申请的空间计算错了,打印一个整数("%d"),却只申请了4个字节,结果测试时,循环跑,跑到999没问题,一到1000就出错。

3、C++程序,结构体里用string, 正常用也是没问题的,为了方便某些扩展,由外面new了char类型的空间,空间大小为sizeof结构体,然后传进来buffer指针,在内部用static_cast转成结构体指针后,给string字段赋值,问题就出在这了。C和C++混用时要特别注意啊。

 

总结下:

前两个是开发人员的低级错误,规范的代码写法(声明时初始化等)、做好代码评审工作,这些问题应该能避免。

最后一个是由于使用了开源代码库,对代码框架了解不深,修改时照葫芦画瓢添加功能,结果出了问题,用别人的东西一定要搞明白,不能随便照抄,不然风险很大啊。

 

另外在发现编译的共享库不能调试,valgrind出错也不提示行数,在makefile里加了-g选项也不好使, 后来一看原来链接时加了-Wl,-s选项,gcc上查了下,含义如下:

 

-s:Remove all symbol table and relocation information from the executable.

 

去掉后就可以正常调试,提示出错位置了。

posted @ 2009-12-19 22:25  lao9  阅读(696)  评论(0编辑  收藏  举报