日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

發布時間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【软件开发底层知识修炼】十六 快速学习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的数据断点监测变量是否改变的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。