GDB使用簡明教程

2021-07-12 07:51:50 字數 2528 閱讀 9950

一、在編譯的時候為什麼要加-g

如果沒有-g就看不見函式名,變數名,所代替的全是執行時的記憶體位址。

二、如何檢視和使用core檔案

首先通過指令ulimit -a檢視系統是否允許生成core檔案,可以通過指令ulimit -c unlimited取消系統對core檔案的限制,ulimit -c 1024指定core檔案的大小。

首先,我先編寫乙個會導致core dump的程式:

#include void f(char* a)

int main()

注意:編譯的時候需要加上-g選項,否則gdb不知道程式符號。

執行程式,提示「段錯誤(核心已轉儲)」。

ls檢視當前目錄發現多了乙個core檔案

使用gdb解析core檔案:gdb ./core_dump --core=core

[new lwp 7783]

core was generated by `./core_dump'.

program terminated with signal sigsegv, segmentation fault.

#0  0x00000000004004fd in f (a=0x4005b4 "1") at core_dump.c:5

5   a[2] = '2';

這樣就可以檢視到段錯誤的地方了~

三、設定斷點、監控點和單步除錯

(1)break + 函式名 或者 break + 行號 break filename:linenum,設定斷點

info breakpoints(info b),顯示當前程式的所有斷點情況

(2)watch + expr 為表示式expr設定乙個觀察點,一旦表示式值有變化,馬上停止

rwatch +expr 當expr被讀時,停止程式

awatch + expr 當expr被讀或寫時,停止程式

info watchpoints 列出當前所設定的所有觀察點

(3)catch 捕捉點

(4)disable + 斷點號,不寫斷點號則disable所有斷點

enable 使斷點工作一次,之後又無效

delete + 斷點號,刪除某個斷點

clear + 行號,清除該行的斷點

(5)continue 恢復程式執行直到程式結束

step: 單步(進入函式呼叫)f11

next: 單步(不進入函式呼叫)f10

stepi和 nexti: 執行程式直到退出迴圈體

until(u):執行程式直到退出迴圈體; until+行號: 執行至某行 。需要把游標停止在迴圈的頭部,然後輸入u這樣就自動執行全部的迴圈了

finish: 執行程式,直到當前函式完成返回再停止,並列印函式返回時的堆疊位址和返回值及引數值等資訊。例如進入的單步執行如果已經進入了某函式,而想退出該函式返回到它的呼叫函式中,可使用命令finish.

call 函式(引數):呼叫「函式」,並傳遞「引數」,如:call gdb_test(55)

kill:輸入kill終止正在除錯的程式

(6) break thread no. 在指定執行緒上設斷點,否則所有執行緒都被中止

四、檢視當前的呼叫堆疊

backtrace(bt)

五、多執行緒如何除錯

(1)info threads 顯示當前可除錯的所有執行緒,每個執行緒會有乙個gdb為其分配的id,後面操作執行緒的時候會用到這個id。 前面有*的是當前除錯的執行緒。

(2)thread id 切換當前除錯的執行緒為指定id的執行緒。

(3)break file.c:100 thread all 在file.c檔案第100行處為所有經過這裡的執行緒設定斷點。

(4)set scheduler-locking off|on|step,這個是問得最多的。在使用step或者continue命令除錯當前被除錯執行緒的時候,其他執行緒也是同時執行的,怎麼只讓被除錯程式執行呢?通過這個命令就可以實現這個需求。 off 不鎖定任何執行緒,也就是所有執行緒都執行,這是預設值。 on 只有當前被除錯程式會執行。 step 在單步的時候,除了next過乙個函式的情況(熟悉情況的人可能知道,這其實是乙個設定斷點然後continue的行為)以外,只有當前執行緒會執行。

六、列印資訊

(1)print + 表示式:其中「表示式」可以是任何當前正在被測試程式的有效表示式,比如當前正在除錯c語言的程式,那麼「表示式」可以是任何c語言的有效表示式,包括數字,變數甚至是函式呼叫。

(2)display 表示式:在單步執行時將非常有用,使用display命令設定乙個表示式後,它將在每次單步進行指令後,緊接著輸出被設定的表示式及值。如: display a

watch 表示式:設定乙個監視點,一旦被監視的「表示式」的值改變,gdb將強行終止正在被除錯的程式。如: watch a

ABE使用簡明教程。

abe windows server 2003 access based enumeration 是伺服器的一種功能,是 windows 提供檔案和印表機的一種服務。它的工作方式是修改伺服器中一種名為列舉的功能,該服務基本上用於解決 指定的共享中存在哪些檔案和資料夾?abe不會把整個共享隱藏起來,a...

Manjaro 上手使用簡明教程

manjaro 是乙個非常好用的系統,在被很多朋友介紹過很多次以後,我終於試著開始使用這個系統了,今天就簡單記錄一下,方便從別的系統來的移民,尤其是聽說過 arch 大名,也曾嚮往之,然而因為它的安裝複雜而卻步的朋友。manjaro 是一款基於 arch linux 對使用者友好的linux發行版,...

Visual Unit 簡明教程

visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...