GDB 記憶體斷點

2021-09-30 12:02:07 字數 2758 閱讀 3560

記憶體斷點可以幫助我們查詢一些記憶體的問題, 而記憶體問題往往都是比較棘手的問題。所以掌握gdb的記憶體除錯還是很有用的,下來我們就開始gdb的記憶體斷點之旅。

我們通過乙個程式來學些這個方法:

注意涉及的指令就是rwatch、watch和awatch,分別表示讀、寫、讀寫。需要注意的是我用的這個版本直接用位址是斷不下來的,

必須用*(char*)

之類來進行強制型別轉換

,不知道其它版本會不會也有同樣的問題。

**如下:

gdb memory break test code

#include 

#include 

int main()

printf("end");

}過程如下,我用的是cygwin模擬環境:

***x@97190913124f402 /cygdrive/f

$ gcc -g main.cpp -o main.out      //編譯,注意-g

***x @97190913124f402 /cygdrive/f

$ gdb main.out –nw              //-nw表示用文字模式

gnu gdb 5.0 (20010428-3)

gdb is free software, covered by the gnu general public license, and you are

welcome to change it and/or distribute copies of it under certain conditions.

type "show copying" to see the conditions.

there is absolutely no warranty for gdb. type "show warranty" for details.

this gdb was configured as "i686-pc-cygwin"...

(gdb) list

1       #include 

2       #include 

34       int main()

5       {

6               char buf[1024];

78               char* pp = buf;

9               printf("add buf = 0x%x/r/n",buf);

10(gdb) break 9 //第9行打斷點

breakpoint 1 at 0x40108a: file main.cpp, line 9.

(gdb) run        //執行

starting program: /cygdrive/f/main.out

breakpoint 1, main () at main.cpp:9

9               printf("add buf = 0x%x/r/n",buf);

current language: auto; currently c++

(gdb)display &buf//檢視buf的位址

1: &buf = (char (*)[1024]) 0x23f994

(gdb)watch *(int*)0x23fa00//寫斷點buf位址後的一點,保證其幾個迴圈後被改寫

watchpoint 2: *(int *) 2357760

(gdb) c    //繼續執行

continuing.

add buf = 0x23f994

addr = 0x23f994 ~~ 0x23f99d

addr = 0x23f99e ~~ 0x23f9a7

……addr = 0x23f9ee ~~ 0x23f9f7

addr = 0x23f9f8 ~~ 0x23fa01

watchpoint 2: *(int *) 2357760    //斷點觸發

old value = 2357808

new value = 2357760

0x6108bee3 in _libkernel32_a_iname ()

(gdb) info breakpoints         //刪掉這些斷點

num type           disp enb address    what

1breakpoint     keep y   0x0040108a in main at main.cpp:9

breakpoint already hit 1 time

2watchpoint     keep y              *(int *) 2357760

breakpoint already hit 1 time

(gdb) delete1

(gdb) delete2

(gdb) info breakpoints

no breakpoints or watchpoints.

(gdb) c    //繼續執行

continuing.

addr = 0x23fa02 ~~ 0x23fa0b

……addr = 0x23fd72 ~~ 0x23fd7b

endprogram exited normally.

(gdb)

關於gdb其他詳細命令,可以參考這裡 。

gdb 條件斷點

gdb 條件斷點 1.有時候,我們需要斷點在迴圈的某個條件處時,比如以下 include int main int argc,char argv return 0 2.開始編譯 cc g main.c將生成a.out 3.開始斷點 gdb a.out l l命令用於檢視 4.通過以上命令可以看到 m...

GDB 斷點設定

啟動gdb後,首先就是要設定斷點,程式中斷後才能除錯。在gdb中,斷點通常有三種形式 斷點 breakpoint 在 的指定位置中斷,這個是我們用得最多的一種。設定斷點的命令是break,它通常有如下方式 可以通過info breakpoints n 命令檢視當前斷點資訊。此外,還有如下幾個配套的常...

GDB(設定斷點)

啟動gdb後,首先就是要設定斷點,程式中斷後才能除錯。在gdb中,斷點通常有三種形式 斷點 breakpoint 在 的指定位置中斷,這個是我們用得最多的一種。設定斷點的命令是break,它通常有如下方式 可以通過info breakpoints n 命令檢視當前斷點資訊。此外,還有如下幾個配套的常...