
前言
在現實中檢視程式錯誤方法有很多, 比如添加日志、使用 gdb 調試 和分析 core 檔案等
一、 産生coredum的一些條件
産生 coredump 的條件,首先需要确認 目前會話 的 ulimit –c,若
core file size
為0,則不會産生對應的coredump,需要進行修改和設定。
使用方法:ulimit -c unlimited (可以産生coredump且不受大小限制)
二、coredump産生的幾種可能情況
造成程式coredump的原因有很多,這裡總結一些比較常用的經驗吧:
-
記憶體通路越界
1、由于使用錯誤的下标,導緻數組通路越界。
2、搜尋字元串時,依靠字元串結束符來判斷字元串是否結束,但是字元串沒有正常的使用結束符。
3、使用strcpy, strcat, sprintf, strcmp,strcasecmp等字元串操作函數,将目标字元串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。
- 多線程程式使用了線程不安全的函數
-
多線程讀寫的資料未加鎖保護。
對于會被多個線程同時通路的全局資料,應該注意加鎖保護,否則很容易造成coredump
-
非法指針
1、使用空指針
2、随意使用指針轉換。一個指向一段記憶體的指針,除非确定這段記憶體原先就配置設定為某種結構或類型,或者這種結構或類型的數組,否則不要将它轉換為這種結構或類型的指針,而應該将這段記憶體拷貝到一個這種結構或類型中,再通路這個結構或類型。這是因為如果這段記憶體的開始位址不是按照這種結構或類型對齊的,那麼通路它時就很容易因為bus error而core dump。
-
堆棧溢出
不要使用大的局部變量(因為局部變量都配置設定在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導緻出現莫名其妙的錯誤。
如何調試 Core dump 檔案
失敗原因:上述代碼中,使用 free 釋放字元常量區的 pStre 會出現程式 core dump;
如何分析:在實際開發中可以使用 core 檔案檢視系統崩潰原因,那麼怎麼使用該工具呢?
如何編譯:在使用 gcc / gdb 編譯時需要加上 -g 參數,将會在可執行檔案中生成相應的調試資訊,加完 -g 編譯的檔案,比不加要大上許多,原因就在于此。
使用方式:gdb coreFile.編号
使用 backtrace (bt)檢視調用堆棧
以下列舉 gdb 常用指令:
backtrace:檢視調用堆棧
run:運作程式
break:添加斷點
list:顯示附近行
next:執行下一條語句
set args:設定輸入參數
info threads:檢視線程
info breakpoints:檢視目前斷點
step :執行下一條,如果是函數,則進入
gdb attach pid:運作時加載執行檔案
總結
在程式設計中,往往會遇到各種各樣的錯誤,那麼面對錯誤使用合理切快捷的方法找到錯誤并改正錯誤是至關重要的。