【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变
- 上一篇文章我們學習了如何使用GDB進行軟件斷點調試和硬件斷點調試:【軟件開發底層知識修煉】十五 快速學習GDB調試二 使用GDB進行斷點調試
- 本篇文章繼續上一篇文章的學習,如何使用GDB的數據斷點監測內存中的變量是否被改變
文章目錄
- 1 GDB的數據斷點
- 1.1 利用查看內存的x命令進行系統大小端的判斷
- 2 使用GDB進行監視變量的改變與查看內存實際代碼案例分析
- 3 總結
1 GDB的數據斷點
先來了解一下什么是GDB中的數據斷點:
- 在GDB中設置數據斷點用于監測一個內存中的變量,在程序運行的時候,如果該變量被改變,則程序就會被GDB終止執行,并顯示變量被改變的地方。
- 數據斷點的本質是硬件斷點
- 在GDB中使用watch命令來設置數據斷點
- watch命令的用法為:watch var_name
可以使用watch進行設置數據斷點,我們還可以查看程序運行中的所有內存中的數據。
命令語法為:
- x /Nuf address
其中/Nuf中的N、u、f三個位置的含義是:
- N - 需要打印的單元數
- u - 每個單元的大小,比如字節,字,雙字等
- f - 數據打印的格式 ,如八進制,十六進制等
如下圖示例是顯示4個單元,每個單元為1字節,以十六進制數顯示:
-
x 命令中參數u對應的幾種單位:
-
打印格式對應的幾種選項:
1.1 利用查看內存的x命令進行系統大小端的判斷
學會了x命令的用法,可以按如下圖的方式判斷系統大小端:
2 使用GDB進行監視變量的改變與查看內存實際代碼案例分析
watch.c程序
#include <stdio.h> #include <pthread.h> #include <unistd.h>int g_var = 0;void* thread_func(void* args) {sleep(5);g_var = 1; }int main() {int i = 0;pthread_t tid = 0;pthread_create(&tid, NULL, thread_func, NULL);for(i=0; i<10; i++){printf("g_var = %d\n", g_var);sleep(1);} }上面的程序非常的簡單,就是在main函數中創建一個線程thread_func,然后在thread_func函數中改變一個全局變量
首先我們先編譯運行上述程序:
- gcc -g -lpthread watch.c -o test.out
運行結果如下動態圖:
-
我們可以看出,我們程序跑著跑著g_var變量就變了。假設這個變量我們不想讓它改變,但是有時候你調用了其他人寫的接口函數,很有可能就把我們不想改變的變量改變了,所以這個時候需要找到變量在什么時候被改變,以及在哪里被改變。
-
上述是一個小程序所以我們很容易知道是在thread_func函數中改變的g_var變量,而且也能夠知道在什么時候變量被改變。但是如果在一個大型程序中,就很難查找。
-
此時GDB的數據斷點就派上用場了。
我們可以使用GDB對變量g_var進行數據斷點的設置,當g_var發生變化時,程序就會自動停止運行,此時我們就可以知道程序運行到哪里了。
首先依次輸入以下命令:
- gdb tset.out
- start
進入到GDB調試模式并啟動程序后再程序入口處停止。
然后使用watch命令對g_var變量設置數據斷點:
-
watch g_var
-
并使用info breakpoints 查看斷點是否設置成功
上述步驟如下圖所示:
-
打好數據斷點后讓程序執行,輸入continue命令即可,顯示如下動態圖所示:
-
上述動態圖中,運行著運行著就停止了,停止后顯示如下:
-
從上述圖中我們可以知道在watch.c程序的thread_func函數中的12行,導致了g_var的改變,是從Old value=0改變到New value=1的。我們很容易就找到了發生改變的地方,如果在大型程序中,這是很快。
-
當然,我們還可以使用上面學習的 x 命令,來查看g_var所在內存的內容。首先我們需要查看g_var變量的的內存地址:
-
print /a &g_var 輸入這條命令,顯示如下:
-
得到g_var的地址后,使用 x 命令查看它的內存,查看方式是4單元,1字節,16進制方式,如下圖:
-
很明顯,我們顯示了g_var內存地址的連續4字節的內容。
- 到此,我們已經通過這個簡單的示例,學會了如何檢測程序運行過程中的內存變化。例子隨簡單,但是也能夠提現內存監測的重要性。
3 總結
- 本文學會使用GDB 進行內存監測
- 學會如何使用GDB數據斷點調試程序
本文章參考狄泰軟件學院相關課程
想學習的可以加狄泰軟件學院群,
群聊號碼:199546072
學習探討加個人(可以免費幫忙下載CSDN資源):
qq:1126137994
微信:liu1126137994
學習交流資源分享qq群:962535112
總結
以上是生活随笔為你收集整理的【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全套思源黑体合集(含ttf/ttc版/行
- 下一篇: Qt:windows下Qt安装教程