GDB GDB的斷點除錯

2021-08-20 17:37:53 字數 3516 閱讀 6435

那麼我們應該如何使用gdb呢?gdb為我們提供了什麼樣的功能呢?我們可以參照圖形介面偵錯程式的基本功能,使用gdb來實現。例如:

問題:我們如何使用gdb設定斷點,刪除斷點的操作?

-通過函式名設定斷點

1. break func_name [ if var = value ]

2. tbreak func_name [ if var = value ]

-通過檔名行號設定斷點

注意:gdb中的斷點除錯分為軟體斷點和硬體斷點兩種型別:

- 軟體斷點:由非法指令異常實現(軟體實現)

- 硬體斷點:由硬體特性實現(數量有限)

- 資料斷點:有硬體特性實現(數量有限)

通常情況下,我們使用的都是軟體斷點。那麼,什麼情況下我們需要用到硬體斷點和資料斷點呢?

1. 當**位於唯讀儲存器(flash)時,只能通過硬體斷點除錯。

2. 硬體斷點需要硬體支援,數量有限

3. gdb中通過hbreak命令支援硬體斷點

4. hbreak與break使用方式完全一致

問題:在圖形介面中我們常常使用到的操作有:檢視特定變數的值,執行下一步**,直接執行**等等的操作。gdb中相關命令是怎麼樣的呢?

gdb操作過程:

ps c:\workspace\exercise\vscode> gcc -g .\test.c .\func.c -o .\test.exe

ps c:\workspace\exercise\vscode> gdb < ----------啟動gdb

gnu gdb (gdb) 7.6

.1license gplv3+: gnu gpl version 3

or later this is free software: you are free to change and redistribute it.

there is no warranty, to the extent permitted by law. type

"show copying"

and"show warranty"

for details.

this gdb was configured as "mingw32".

for bug reporting instructions, please see:

.(gdb) file test.exe < ------------------ 指定gdb檢測這個可執行檔案

reading symbols from c:\workspace\exercise\vscode\test.exe...done.

(gdb) set args shaw < ----------設定主函式輸入引數args

(gdb) info break < ----------列印程式斷點資訊

no breakpoints or watchpoints.

(gdb) break test.c:37

< ----------設定斷點

breakpoint 1 at 0x4014ba: file .\test.c, line 37.

(gdb) info break

num type disp enb address what

1 breakpoint keep y 0x004014ba

in main at .\test.c:37

(gdb) start < ------------啟動**

temporary breakpoint 2 at 0x401442: file .\test.c, line 25.

starting program: c:\workspace\exercise\vscode/test.exe shaw

[new thread 10792.0x300c]

[new thread 10792.0x3798]

temporary breakpoint 2, main (argc=2, argv=0x651560) at .\test.c:25

25(gdb) continue < ------------- 繼續執行**

continuing.

main() : begin...

argv[0] = c:\workspace\exercise\vscode/test.exe

argv[1] = shaw

breakpoint 1, main (argc=2, argv=0x651560) at .\test.c:37

37 }

(gdb) next

< ------------- 執行下一步

test_1() : 004013e0

38(gdb) next

35 fa[i%3]();

(gdb) next

breakpoint 1, main (argc=2, argv=0x651560) at .\test.c:37

37 }

(gdb) next

test_2() : 004013fc

38(gdb) print i < -------------- 列印變數值

$1 = 1

(gdb) set var i=100

< ----------------- 設定變數值

(gdb) countinue

program received signal sigsegv, segmentation fault.

0x00401539

in func () at .\func.c:7

問題:start和run有什麼區別呢?

從實驗現象我們可以知道:start後會在程式開始的時候打乙個斷點,而run則是直接執行**。

問題:addr2line 和 gdb 也可以發現同樣的段錯誤。那麼兩者有什麼區別麼?

實際上,addr2line是靜態分析工具,在之前的實驗我們也知道,我們使用addr2line列印錯誤位置時,需要用到core檔案。這是一種事後分析的方式。

但是,gdb關注的是記憶體中正在執行的程序。所以gdb屬於動態分析工具。所以gdb比addr2line使用更加方便。

列印所有堆疊資訊 gdb GDB除錯C 類

linux上除錯常用的工具就是gdb了。借助學習c 虛函式表和記憶體布局的機會順便學習下gdb常規除錯技巧。一,測試用例 1,c 標頭檔案 szyu test gdb.h ifndef szyu gdb define szyu gdb include class base base int v no...

PHP 斷點除錯

我使用的xamp 搭建的的php整合環境。預設情況下,xamp沒有開啟xdebug功能,但是x debug dll及配置檔案均已寫入php.ini 中了。1.啟用x debug php.ini 去掉1008行注釋 zend extension d program files xampp xampp ...

Xcode 斷點除錯

lldb 常用命令 po print object 物件 p print 基本資料型別 int之類 bt 列印最後一次呼叫堆疊 expr exchange parameter expression 動態修改變數 假如有乙個loginwithusername 方法,需要兩個引數 username,pa...