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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

GDB 调试工具使用指南

發布時間:2024/3/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 GDB 调试工具使用指南 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

GDB 概述

  GDB 是 GNU 開源組織發布的一個強大的 UNIX 下的程序調試工具。也許大多數開發人員比較喜歡那種圖形界面方式的,像 VC 、 BCB 等 IDE 的調試,但如果你是在 UNIX 平臺下做軟件開發,你會發現 GDB 這個調試工具有比 VC 、 BCB 的圖形化調試器更強大的功能。所謂 “ 寸有所長,尺有所短 ” 就是這個道理。
  一般來說, GDB 可以幫助你完成以下幾個方面的功能:

  • 啟動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
  • 可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
  • 當程序被停住時,可以檢查此時你的程序中所發生的事。
  • 動態的改變你程序的執行環境。

  從上面看來, GDB 和一般的調試工具沒有什么兩樣,基本上也是完成這些功能,不過在細節上,你會發現 GDB 這個調試工具的強大,大家可能比較習慣了圖形化的調試工具,但有時候,命令行的調試工具卻有著圖形化工具所不能完成的功能。下面我們一一來看。

基礎操作

  要使用 GDB 調試,需要在編譯程序的時候加上 -g 參數,例如:

$ gcc -g test.c -o test

  啟動 GDB 調試 test 程序:

$ gdb test

  執行 run(簡寫 r)運行程序,但是通常,你的命令行程序需要帶上參數,那么就需要指定參數運行,例如:

(gdb) run -d /dev/mtd2

  另一種方法是使用 set args,例如:

(gdb) set args -d /dev/mtd2

  幾乎每一次調試,我們都會設置斷點,單步運行。GDB 設置斷點的方式很靈活,使用 break(簡寫 b)。
  例如,在源程序第 232 行處設置斷點:

(gdb) break 232

  在 function() 函數入口處設置斷點:

(gdb) break function

  如果程序包含多個文件,我們還需要指定源文件,例如在 main.c 文件的第8行設置斷點:

(gdb) break main.c:8

  查看斷點信息:

(gdb) info break

  刪除斷點使用 delete(簡寫 d),其后的數字可以通過 info break 查看,例如刪除第1個斷點:

(gdb) delete 1

  執行單條語句,也就是單步運行使用 next(簡寫 n)命令。
  繼續運行程序,使用 continue(簡寫 c)命令。
  使用 finish 命令退出函數。
  當程序在斷點處停下來后,我們可能需要打印變量的值, 使用 print(簡寫 p)命令,可以打印基本類型,也可以打印復合類型,例如:

(gdb) print count

  很不幸,如果程序出錯甚至崩潰,我們應該勇敢地面對它,使用 backtrace(簡寫 bt)命令查看函數堆棧。例如,我剛遇到了一個“Program received signal SIGSEGV, Segmentation fault.”錯誤:

(gdb) backtrace #0 0x4007fc13 in _IO_getline_info () from /lib/libc.so.6 #1 0x4007fb6c in _IO_getline () from /lib/libc.so.6 #2 0x4007ef51 in fgets () from /lib/libc.so.6 #3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10 #4 0x40037f5c in __libc_start_main () from /lib/libc.so.6

  通常,我們只關心自己的代碼,因此使用 frame 命令切換到3號堆棧幀(stack frame3),看看程序到底是在哪里崩潰的:

(gdb) frame 3 #3 0x80484b2 in main (argc=1, argv=0xbffffaf4) at segfault.c:10 10 fgets(buf, 1024, stdin)

  這樣我們就可以定位到程序在 fgets() 函數處遇到了麻煩,對于這個例子,顯然我們需要關注 fgets() 的參數,特別是指針類型的變量,因為這很可能是由于訪問非法內存導致的。
  程序調試完,可以使用 kill(簡寫 k)殺死當前程序,或者使用 quit(簡寫 q)退出 gdb 調試。

遠程調試

  前面例子是使用 gdb 調試本機程序,但是對于嵌入式開發,通常我們使用的是交叉編譯環境,這樣就會給調試帶來一定的麻煩。
  有時候我們需要在成品機上進行調試,然而成品機把調試串口裁剪掉了。
  另外,嵌入式設備的存儲容量有限,但是 gdb 調試過程需要配合源代碼進行,因為 gdb 會加載對應的源代碼來輔助調試,比如對于要查看一個結構體變量的內部數據時,就會去尋找該結構體在源代碼中的具體定義,從而更好地解析每個數據域的內容。
  當然我們可以把源代碼拷貝到嵌入式設備上,然后調試、修改、調試…… 很快我們就會發現這實在太抓狂了!
  因此,我們需要遠程調試,通過 gdbserver 工具直接在嵌入式設備中調試程序。為了能夠實現遠程調試,需要將設備與 PC 連接到同一個網絡。
  然后在設備端使用 gdbserver 啟動一個遠程調試會話,還是以我們的 test 程序為例,指定端口為 1234:

# gdbserver :1234 test

  在 PC 機上則直接輸入 gdb 命令啟動 GDB 調試工具,然后指定 ip 和端口,連接到設備端進行遠程調試:

(gdb) target remote 192.168.3.100:1234

  接下來就會出現與之前的本地調試一樣的提示畫面了,后續的操作和本地調試也是一樣的,Bingo!


【參考】

https://blog.csdn.net/zzymusic/article/details/4815142

總結

以上是生活随笔為你收集整理的GDB 调试工具使用指南的全部內容,希望文章能夠幫你解決所遇到的問題。

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