GDB除錯之watch變數跟蹤

2021-09-20 06:53:55 字數 1862 閱讀 5724

開發中經常遇到某個變數明明已經賦值了,但是最後得到的結果卻並非賦予的值。解決這樣問題讓人很頭疼,原因我們可能都知道,可能是記憶體越界導致這部分值被覆蓋掉了,但是什麼時候被覆蓋掉的呢?總不能在每個懷疑的地方列印這個值吧?這樣效率很低,而且定位不一定準確。這個時候使用gdb除錯中的watch就可以輕鬆搞定。

顧名思義跟linux中的watch命令類似:實時的監視你需要檢視的內容。比如下面程式:

#include int main()

執行上面的程式會發現 b和c的值都是0,從**中看很容易發現是memset越界了,將a以外的記憶體也清零了,接下來再用watch看看:

首先用gdb引導程式

root@ubuntu:/home/test# gdb ./test

gnu gdb (ubuntu/linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04

license 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 "i686-linux-gnu".

for bug reporting instructions, please see:

...reading symbols from /home/test/test...done.

(gdb)

接下來watch變數的時候要注意,watch命令執行的時間節點變數必須存在,比如還沒進入某個函式你就無法watch這個函式中的區域性變數。要是全域性變數呢?當然就沒有這個限制了,原因顯而易見:watch的前提是目標存在的。比如:

(gdb) b main 

breakpoint 1 at 0x80483ed: file test.c, line 7.

(gdb) watch b

no symbol "b" in current context.//現在還有變數b

(gdb) r

starting program: /home/test/test

breakpoint 1, main () at test.c:7

7 a = 1;

(gdb) watch b

hardware watchpoint 2: b//已經進入main函式,變數b存在

watch之後,繼續執行,變數如果被改變,程式會被停下來:

(gdb) c

continuing.

hardware watchpoint 2: b

old value = 134513753//沒有初始化b是隨機值

new value = 2

main () at test.c:9

9 c = 3;

(gdb) c

continuing.

hardware watchpoint 2: b

old value = 2

new value = 0

0x08048416 in main () at test.c:10

10 memset(&a,0,4*sizeof(int));//這裡越界導致b,c被修改

(gdb) c

continuing.

0 0

是不是很方便。編譯時記得加上-g選項方便除錯。

gdb 跟蹤除錯

要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下 此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤 執行 gdb gdb 啟動常用的引數 從指定檔案中讀取符號表資訊,並把...

gdb 跟蹤除錯命令整理

內容源自於陳浩csdn部落格的用gdb除錯程式一系列文章 要進行除錯程式首先要生成乙個含有除錯資訊的執行程式命令如下 此時便會生成乙個含有除錯資訊的可執行檔案,然後便可以用 gdb 去除錯這個程式了,進入除錯程式命令,但是如果用 gdb 去除錯乙個未包含除錯資訊的可執行檔案則會發生錯誤 執行 gdb...

Linux下使用gdb除錯跟蹤程序

可以使用gdb strace命令 推薦gdb 本文主要介紹使用gdb在linux下直接對程序進行跟蹤除錯 若想使用gdb對程序除錯,需要在編譯程式時加入相關的選項 set cmake build type debug set cmake cxx flags debug env o0 wall g2 ...