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 行處設置斷點:
在 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)命令,可以打印基本類型,也可以打印復合類型,例如:
很不幸,如果程序出錯甚至崩潰,我們應該勇敢地面對它,使用 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:
在 PC 機上則直接輸入 gdb 命令啟動 GDB 調試工具,然后指定 ip 和端口,連接到設備端進行遠程調試:
(gdb) target remote 192.168.3.100:1234接下來就會出現與之前的本地調試一樣的提示畫面了,后續的操作和本地調試也是一樣的,Bingo!
【參考】
https://blog.csdn.net/zzymusic/article/details/4815142
總結
以上是生活随笔為你收集整理的GDB 调试工具使用指南的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度、网易有道、科大讯飞“掘金”教育智能
- 下一篇: mac连不上airpods