gdb檢視指標指向資料

2021-09-11 08:15:28 字數 2739 閱讀 8293

示例**如下:

#include#includeint main()

i = 0;

for (; i < 10; i++)

free(p);

return 0;

}

編譯命令gcc -g -omain memlook.c然後執行gbd ./main進入除錯。

(gdb) list 15

10        }

11        i = 0;

12        for (; i < 10; i++)

13        

16        free(p);

17        return 0;

18    

19    }

在free(p)處設定斷點break 16

(gdb) break 16

breakpoint 1 at 0x74e: file memlook.c, line 16.

然後執行

(gdb) run

starting program: /mnt/hgfs/linux/cpp/gdblearn/main 

breakpoint 1, main () at memlook.c:16

16        free(p);

接下來檢視指標p指向的資料

int *array = (int *) malloc (len * sizeof (int));

在gdb除錯過程中這樣顯示出這個動態陣列的值:

p *array@len

示例:(gdb) print *p@10

$1 = "\000\001\002\003\004\005\006\a\b\t"

(gdb) print *(char*)p@10

$2 = "\000\001\002\003\004\005\006\a\b\t"

(gdb) print *(int*)p@10

$3 =

(gdb) 

方式二:

x/表示乙個記憶體位址。「x/」後的n、f、u都是可選的引數,n 是乙個正整數,表示顯示記憶體的長度,也就是說從當前位址向後顯示幾個位址的內容;f 表示顯示的格式,如果位址所指的是字串,那麼格式可以是s,如果位址是指令位址,那麼格式可以是i;u 表示從當前位址往後請求的位元組數,如果不指定的話,gdb預設是4位元組。u引數可以被一些字元代替:b表示單位元組,h表示雙位元組,w表示四位元組,g表示八字節。當我們指定了位元組長度後,gdb會從指定的記憶體位址開始,讀寫指定位元組,並把其當作乙個值取出來。n、f、u這3個引數可以一起使用,例如命令「x/3uh 0x54320」表示從記憶體位址0x54320開始以雙位元組為1個單位(h)、16進製制方式(u)顯示3個單位(3)的記憶體。

print的輸出格式包括:

x 按十六進製制格式顯示變數。

d 按十進位制格式顯示變數。

u 按十六進製制格式顯示無符號整型。

o 按八進位制格式顯示變數。

t 按二進位制格式顯示變數。

a 按十六進製制格式顯示變數。

c 按字元格式顯示變數。

f 按浮點數格式顯示變數。

示例如下:

(gdb) x/10db p

0x555555756260:    0    1    2    3    4    5    6    7

0x555555756268:    8    9

(gdb) x/10dh p

0x555555756260:    256    770    1284    1798    2312    0    0    0

0x555555756270:    0    0

(gdb) 

x/10db p 表示檢視p指標指向的記憶體中往後10個位址的資料,並以十進位制格式顯示變數,以單位元組讀寫指定位元組。

(gdb) print *(int*)p

$5 = 50462976

*(int*)p表示將按照整型指標處理。

例子:main()

我們在char *c = "hello world";

(gdb) l

1    main()

2   

(gdb) b 4

breakpoint 1 at 0x100000f17: file main.c, line 4.

(gdb) r

starting program: /users/songbarry/main

reading symbols for shared libraries +. done

breakpoint 1, main () at main.c:4

4        printf("%s\n", c);

可以通過多種方式看c指向的字串:

方法1:

(gdb) p c

$1 = 0x100000f2e "hello world"

方法2:

(gdb) x/s 0x100000f2e

0x100000f2e:     "hello world"

方法3:

(gdb) p (char *)0x100000f2e

$3 = 0x100000f2e "hello world"

將第乙個字元改為大寫:

(gdb) p *(char *)0x100000f2e='h'

$4 = 72 'h'

再看看c:

(gdb) p c

$5 = 0x100000f2e "hello world"

指向指標資料的指標

練習一使用指向指標資料的指標變數輸出指向的字串 樣例 follow me basic great wall fortran computer design process exited after 0.02186 seconds with return value 0 請按任意鍵繼續.使用指向指標資...

GDB資料檢視

檢視棧資訊 當程式被停住了,首先要確認的就是程式是在哪兒被斷住的。這個一般是通過檢視呼叫棧資訊來看的。在gdb中,檢視呼叫棧的命令是backtrace,可以簡寫為bt。gdb bt 0 pop at stack.c 10 1 0x080484a6 in main at main.c 12也可以通過i...

指向資料成員的指標

指向資料成員的指標 收藏 指向資料成員的指標 指向資料成員的指標,是乙個有點神秘又頗有用處的語言特性,特別是如果你需要詳細調查class members的底層布局的話。這樣的調查可以用於決定vptr是放在class的起始處或者尾端。另外乙個用途是可以用來決定class中的access section...