gdb除錯(檢視函式棧 除錯coredump檔案)

2021-07-10 19:56:29 字數 1397 閱讀 7398

檢視函式棧用在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...