用 GDB 除錯程式並檢視dump檔案

2021-05-28 02:06:11 字數 4433 閱讀 3424

基本 gdb 命令. 

命   令        描  述

file        裝入想要除錯的可執行檔案.

kill        終止正在除錯的程式.

list        列出產生執行檔案的源**的一部分.

next        執行一行源**但不進入函式內部.

step        執行一行源**而且進入函式內部.

run        執行當前被除錯的程式

quit        終止 gdb

watch        使你能監視乙個變數的值而不管它何時被改變.

break        在**裡設定斷點, 這將使程式執行到這裡時被掛起.

make        使你能不退出 gdb 就可以重新產生可執行檔案.

shell        使你能不離開 gdb 就執行 unix shell 命令.

print       列印函式或變數值

info b      顯示所有的斷點

info display 顯示所有的display

disable 斷點號 暫停某個斷點

enable 斷點號 啟動某個斷點

delete (斷點號) 刪除某個斷點,不帶斷點號,全部刪除

在除錯到鏈結庫函式裡,s進行就可以了;不過如果鏈結庫原始檔不在同乙個目錄下的話,要用dir 命令把鏈結庫原始檔所在目錄加到gdb除錯路徑裡去,同時把原始檔放到lib目錄下

進入 gdb 及指定可執行檔:

1. 進入 gdb 並讀入可執行檔 (檔名為 'program'),準備進行除錯。

gdb program

指定程式**所在目錄及檢視程式**

1. 增加目錄 dir 到收尋程式**的目錄列表 (如果你的程式**和可執行檔放在同乙個目錄下,就不須指定程式**所在目錄。):

(gdb) directory dir

2. 檢視程式**,格式計有:

(gdb) list => 顯示目前執行程式**前後各五行的程式**;或是顯示從上次 list 之後的程式**

(gdb) list function => 顯示該程式開始處前後五行的程式**。

(gdb) list - =>上次顯示程式**的前面的十行。

斷點的設定與清除

1. 設定斷點(指令為 break,可簡寫為 (b),格式計有:

(gdb) break filename.c:30 => 在 filename.c 的第三十行處停止執行。

(gdb) break function => 在進入 function 時中斷程式的執行。

(gdb) break filename.c:function => 在程式**檔 filename.c 中的函式 function 處設定斷點。

(gdb) break => 在下乙個將被執行的命令設定斷點。

(gdb) break ... if cond => 只有當 cond 成立的時候才中斷。cond 須以 c 語言的語法寫成。

2. 顯示各個斷點的資訊。

(gdb) info break

3. 清除斷點(命令為 clear),格式同 break 。例如 :

(gdb) clear filename.c:30

4. 清除斷點,num 是在 info break 顯示出來的斷點編號。

(gdb) delete num

全速及逐步執行程式

1. 從程式開頭全速執行程式,直到遇到斷點或是程式執行完畢為止。

(gdb) run

2. 在程式被中斷後,全速執行程式到下乙個斷點或是程式結束為止 (continue 指令可簡寫為 c)。

(gdb) continue

3. 執行一行程式. 若呼叫函式, 則將該包含該函式程式**視為一行程式 (next 指令可簡寫為 n)。

(gdb) next

4. 執行一行程式. 若呼叫函式, 則進入函式逐行執行 (step 指令可簡寫為 s)。

(gdb) step

5. 執行一行程式,若此時程式是在 for/while/do loop 迴圈的最後一行,則一直執行到迴圈結束後的第一行程式後停止 (until 指令可簡寫為 u)。

(gdb) until

6. 執行現行程式到回到上一層程式為止。

(gdb) finish

檢視及更改變數值

1. print 敘述,顯示該敘述執行的結果 (print 指令可簡寫為 p)。如

(gdb) print a => 顯示 a 變數的內容.

(gdb) print sizeof(a) => 顯示 a 變數的長度.

2. display 敘述,在每個斷點或是每執行一步時顯示該敘述值。如

(gdb) display a

3. 更改變數值:

(gdb) print (a=10) => 將變數 a 的值設定為 10.

檢視程式執行狀態

1. 檢視程式執行到此時,是經過哪些函式呼叫的程式 (backtrace 指令可簡寫為 bt),也就是檢視函式呼叫堆疊。

(gdb) backtrace

讀取 core 檔案資訊

1. 讀入 program 及 program.core 檔,可檢視 core dump 時程式變數值及程式流程狀態 。

gdb program core

說明:'core' 檔案是由 program 檔執行後,遇到 core dump 時產生的 core 檔檔名。如果你還需要該 core 檔,我們建議你將該檔案檔名更改為 program.core。在輸入上述命令後,你可以用 gdb 提供的檢視變數值以及檢視程式執行狀態來讀取程式 core dump 時的狀態。

用clear清除斷點的時候要和break相對應

如果是用functionname設定的斷點就只能 clear functionname

用linenum設定的斷點就只能用clear linenum

delete 斷點號

刪除斷點號可以使用info break 得到

我也說說我的體會:

r (程式執行的引數) 可以設定執行時的引數

shell 執行shell環境的東西,比如shell make,完了以後直接r重新啟動程式,就可以帶上次已經加過的引數執行,不用再敲引數了

b 檔名:行號 有的時候很有用,嘿嘿

x/32uxb 指標 以16進製制顯示該指標指向的32個位元組的資料

core dump file

檢視coredump 檔案**於那個程序

file core.26140

core.26140: elf 32-bit lsb core file intel 80386, version 1 (sysv), svr4-style, from 'exhpdfmx'

首先要先驗證程序是否在執行

ps -ef | grep exhpdfmx

檢視coredump

gdb exhpdfmx core.26140

gdb --core=core.26140 exhpdfmx

(gdb) bt

#0  0x0053bd46 in malloc_consolidate () from /lib/tls/libc.so.6

#1  0x0053cf57 in _int_malloc () from /lib/tls/libc.so.6

#2  0x0053f0a1 in malloc () from /lib/tls/libc.so.6

#3  0xf600ae47 in operator new () from /usr/lib/libstdc++.so.6

#4  0xf600af59 in operator new () from /usr/lib/libstdc++.so.6

#5  0xf7165371 in erratomhelper_c::writetologfile (this=0x812ad20, location=0x0) at weratohelpermx.cc:1154

#6  0xf71652b6 in erratomhelper_c::writetologfile (this=0x812ad20) at weratohelpermx.cc:1108

#7  0xf7162fc7 in erratom_c::writetologfile (this=0x81364d0) at weratomx.cc:670

#8  0x0806f904 in std::operator==, std::allocator> ()

#9  0x08066b2a in std::operator==, std::allocator> ()

#10 0x0805ae3b in std::operator+, std::allocator> ()

#11 0x0804ecae in exhpdf::newhandler ()

#12 0x004eee93 in __libc_start_main () from /lib/tls/libc.so.6

#13 0x0804e345 in ?? ()

用GDB除錯程式

用gdb除錯程式 gdb概述 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。所謂 寸有所長,尺有所短 就是這...

用GDB除錯程式

七 設定顯示選項 gdb中關於顯示的選項比較多,這裡我只例舉大多數常用的選項。set print address set print address on 開啟位址輸出,當程式顯示函式資訊時,gdb會顯出函式的引數位址。系統預設為開啟的,如 gdb f 0 set quotes lq 0x34c78...

用GDB除錯程式

用gdb除錯程式 gdb概述 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。所謂 寸有所長,尺有所短 就是這...