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.?
去掉后就可以正常調試,提示出錯位置了。
轉載于:https://www.cnblogs.com/lao9/archive/2009/12/19/1627961.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Segment fault之痛的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dedecms 文章回收站 记得及时清理
- 下一篇: Linux网络协议栈(四)——链路层(2