檢視函式棧用在gdb中用bt,觀察變數值用watch(變數值發生變化時會暫停程式的執行)
一、除錯coredump檔案
什麼是core dump?
core的意思是記憶體, dump的意思是扔出來, 堆出來.一般以core.程序號的檔案呈現,可以知己設定, 這個檔案便是作業系統把程式down掉時的記憶體內容扔出來生成的, 它可以做為除錯程式的參考.
core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在乙個core檔案中, 叫core dump.
ulimit -c unlimited
core檔案生成的位置一般於執行程式的路徑相同, 檔名一般為core.程序號。生成的路徑和檔名都是可以設定的,下面舉例
下面有一檔案exception.c
#include int main()
編譯gcc -g -o exception exception.c
執行./exception
3段錯誤 (core dumped)
除錯gdb ./exception core.24392
這時只能看到出錯庫的提示
warning: can't read pathname for load map: 輸入/輸出錯誤.
reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
loaded symbols for /lib/libc.so.6
reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
loaded symbols for /lib64/ld-linux-x86-64.so.2
core was generated by `./exception'.
program terminated with signal 11, segmentation fault.
#0 0x00007fc944ddd8fb in _io_vfscanf () from /lib/libc.so.6
這時候輸入where命令
(gdb) where
#0 0x00007fc944ddd8fb in _io_vfscanf () from /lib/libc.so.6
#1 0x00007fc944de3d9d in __isoc99_scanf () from /lib/libc.so.6
#2 0x000000000040057a in main () at exception.c:6
便可以看到程式出錯的具體位置,exception.c檔案的第六行
gdb除錯時檢視記憶體
x n f u是可選的引數,表示乙個記憶體位址 1 n 是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容 2 f 表示顯示的格式 3 u 表示將多少個位元組作為乙個值取出來,如果不指定的話,gdb預設是4個bytes,如果不指定的話,預設是4個bytes。當我們指定了位元...
GDB除錯 陣列檢視技巧
gdb是在linux上開發的必備除錯工具,也是乙個強大的除錯工具,在檢視陣列的值時,可以檢視陣列中的多個值。如 我定義的乙個陣列變數如下 char monophonestrs 如果用gdb檢視,如下 gdb p monolookup monophonestrs 8 0x627ec0 aa gdb 這...
gdb除錯時檢視記憶體
x nfu addr n f u是可選的引數,表示乙個記憶體位址 1 n 是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容 2 f 表示顯示的格式 3 u 表示將多少個位元組作為乙個值取出來,如果不指定的話,gdb預設是4個bytes,如果不指定的話,預設是4個bytes...