程式在執行一段時間才出錯,而且是記憶體錯誤。可能是指標訪問錯誤。這種情況下,查詢錯誤比較困難,可以使用core檔案幫助查詢錯誤。
$ uname -a
linux dev 2.4.21-9.30axsmp #1 smp wed may 26 23:37:09 edt 2004 i686 i686 i386 gnu/linux
再看看預設的一些引數,注意core file size是個0,程式出錯時不會產生core檔案了。
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
需要修改引數,才能使出錯時產生core檔案。
沒有找到core檔案,我們改改ulimit的設定,讓它產生。1024是隨便取的,要是core檔案大於1024個塊,就產生不出來了。
$ ulimit -c 1024 ulimit -c unlimited
$ ulimit -a
core file size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) 4
max memory size (kbytes, -m) unlimited
open files (-n) 2048
pipe size (512 bytes, -p) 8
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 7168
virtual memory (kbytes, -v) unlimited
產生core檔案,可以使用gdb除錯:
可執行程式是叫做bin(通常core檔案就叫做bin.core),使用下面命令
1.gdb ./bin ./bin.core
2.使用bt命令看frames,假定在n
3.使用frame n調整frame
4.這個時候可以p任何argument或者local variable
除錯p string這樣的物件的值,可能由於過長,可以p string 的私有成員,如果p arg1.dat,這樣可以通過p arg1.dat+100這樣進行偏移。
這樣獲得了這些資料以後,我們可以將這些資料取出來,構造core的條件,單步跟蹤,今天我就用這樣的方法找到了乙個bug。
主要使用到第二條,就可以發現錯誤出現位置。在core檔案內容中,顯示的 第乙個出現在某個檔案的 行數,就為該行出現的錯誤。仔細檢視該行。之後的一些資訊就是函式呼叫的 逐行退出。而且每個都有位置標誌。
GDB除錯命令以及GDB除錯段錯誤
一 gdb的除錯命令。c語言是 cc g tst.c o tst c 是g g o 生成的檔案 file.cpp c 除錯程式命令 gdb file 啟動,羅列 行數ist 1,break 行數 info break,run r 除錯執行,step s 單步除錯,檢視變數 print p 變數名,檢...
gdb 除錯段錯誤
開發嵌入式linux的時候經常會遇到segmentation fault,也就是段異常錯誤,一般是使用錯誤的指標訪問記憶體導致。這種錯誤可以通過開啟核心的異常資訊輸出,再用gdb對發生段異常的位址進行定位。1.開啟核心的異常資訊輸出 mips的核心 關閉了arch mips mm fault.c的d...
gdb 除錯段錯誤
利用執行時產生core檔案,再利用gdb除錯找出段錯誤在哪一行 ulimit c unlimited使用該bash命令,可以使執行時段錯誤產生core檔案。1.gcc g 編譯 gcc g o a a.c2.執行檔案,便會產生乙個core.檔案 a3.除錯core檔案 gdb a core.便可以直...