Linux基礎入門 GDB除錯工具

2021-10-01 16:25:10 字數 2423 閱讀 7692

gnu的偵錯程式稱為gdb,該除錯工具是乙個互動式工具,在字元模式下工作。gdb作為功能強大的除錯工具,可完成如下的除錯任務。

(1)設定斷點

(2)監視程式變數的值

(3)程式的單步執行

(4)修改變數的值

為了使用gdb除錯工具,在編譯原始檔時必須使用-g選項(即gcc -c -g *.c)加上除錯資訊。另外使用makefile檔案,還可以在makefile中定義cflags變數(cflags = -g)。

下來以乙個簡單的例項來演示gdb的除錯方法。此示例源**如下:

#include #include static char buff[256];

static char* string;

int main()

這個程式目的是接受使用者的輸入,並將使用者的輸入列印出來。但是程式的第8行使用了未初始化的字元指標string,因此,編譯並執行之後,將出現斷錯誤。

[root@localhost swz] # gcc -o bug -g bug.c

[root@localhost swz] # ./bug

please input a string:hello

segmentation fault

下面利用gdb工具查詢該程式**現的問題,具體步驟如下。

(1)執行gdb bug命令,裝入bug可執行檔案

(2)使用list命令檢視**

(3)使用run命令執行程式

(4)使用where命令檢視程式出錯位置

(5)使用print命令檢視變數

(6)使用quit命令退出gdb偵錯程式

最後得出結果是由於string變數未賦初值導致

1.在gdb中,你可以隨時檢視以下三種變數的值:

全域性變數(所有檔案可見的), 靜態全域性變數(當前檔案可見的), 區域性變數(當前scope可見的),另外變數衝突的情況下可以用域操作符「::」,可以檔案指定或類、函式指定,例如:

file::variable

function::variable

2.固定長度列印陣列資訊

(gdb) p *array@3

$1 =

(gdb) p *array@10

$2 =

3.修改.gdbinit檔案,該檔案是gdb啟動時讀的乙個配置項,提供了介面定義

4.檢視記憶體

使用examine命令(簡寫是x)來檢視記憶體位址中的值,語法如下(n、f、u時可選引數):

n:表示顯示記憶體的長度。

f:表示顯示的格式。

u:表示從當前位址往後請求的位元組數。

n/f/u三個引數可以一起使用。例如:

命令:x/3uh 0x54320 表示,從記憶體位址0x54320讀取內容,h表示以雙位元組為乙個單位,3表示三個單位,u表示按十六進製制顯示。

其實用的最多的也最簡單的,就是直接後面帶上數字,每次顯示乙個4位元組的資訊,從低位元組開始數,例如:

(gdb) x /4 0x400670

0x400670: 0x34333231 0x38373635 0x00003039 0x00000000

1.info thread --> 檢視執行緒資訊

(gdb) info thread                  檢視執行緒資訊;

4 thread 4109917088 (lwp 4853) 0xffffe410 in __kernel_vsyscall ()

3 thread 4118309792 (lwp 4852) 0xffffe410 in __kernel_vsyscall ()

2 thread 4126702496 (lwp 4851) 0xffffe410 in __kernel_vsyscall ()

* 1 thread 4156778160 (lwp 4695) 0xffffe410 in __kernel_vsyscall ()

(gdb)

如上,前面有「*」號的就是當前執行緒,同時可以使用thread ***進行程序切換:

(gdb) thread 2                    切換執行緒;
2.多執行緒中加斷點(其實和單執行緒一樣,只要記牢各個執行緒的id就可以輕鬆切換各個斷點)

(gdb) b tnotifyusertask::process() --> 直接對**上進行斷點,無須強調程;
3.多執行緒除錯要記住,多用tbreak來斷點程式,善用watch來跟蹤變數。

4.多執行緒的coredump,多為段錯誤,一般都涉及記憶體非法讀寫,對於core檔案的檢視,上述執行緒操作也是適用的。如果都看不出來,就仔細檢視**,看看是不是在if,return,break,continue這種語句操作是忘記解鎖,還有巢狀鎖的問題,都需要分析清楚了。

linux除錯工具GDB

gdb偵錯程式除錯的物件是可執行檔案,使用gcc或者g 編譯器編譯源 時,必須加上 g才能使目標可執行檔案包含可被除錯的資訊。比如 gcc g o helloworld helloworld.c 編譯並連線程式,使之包含可被除錯資訊 gdb helloworld 使用gdb偵錯程式開啟hellowo...

linux除錯工具gdb用法

1 編譯選項 1.1 gcc g 名 g 付 行 gdb 可能 為 情報 増 生成 実行 大 2.除錯命令 2.1.gdb programname 2.2.gdb args programnmae arg1 arg2 2.3.gdb b n n 行數 break point 設定 gdb b 関數名...

Linux下GDB除錯工具

1.常用的除錯 的方法 不管你使用哪種方法除錯 都需要有足夠的耐性 方法一 在 中加入列印語句 在關鍵語句的前後 函式呼叫 關鍵變數 方法二 使用gdb除錯 原理也是讓程式分步執行,列印關鍵變數的值 1 使用gdb在編譯程式的時候必須加上 g選項 將程式的除錯資訊新增到生成的可執行程式中 gcc m...