碼農需要開花大量時間調試和維護項目代碼。代碼調試是每個碼農的最基礎技能之一。大多數人都喜歡IDE給你帶來的便利的可視化調試體驗,少數人則喜歡GDB式命令行的高效調試,那么有沒有什么方法能把兩者結合起來呢?
在本文中,蟲蟲要給大家介紹一個這樣的工具gdbgui,是gdb的一個Web可視化擴展,可以讓我們通過Web在線可視化的調試。
概述
GDB是GNU項目推出的強大開發調試利器,支持跨平臺操,跨語言的軟件調試。GDB和GCC、Emacs構成了GUN編程的宇宙最強組合。目前GDB可用于調試諸如C,C++,Golang,Rust等編譯語言,和Mac,windows,linux和BSD等幾乎所有的操作系統。GDB可以幫助我們:
發生錯誤時捕獲程序變量和上下文的概況;
如果由于崩潰或異常終止而引起core dump,可以找到什么表達式引起的;
在程序運行時暫停問題的程序部分;
在調試時測試和嘗試程序用來縮小或修復問題。
GDB常用的功能可總結如下:
盡管GDB很強大也很高效,但是需要在命令行下使用,對不熟悉命令行的人有些事不是很方便。
gdbgui是另一個基于gdb構建的調試工具。主要區別在于gdbgui向開發人員提供Web展示前端,因此可以在瀏覽器中實現斷點添加,堆棧查看跟蹤以及更改上下文和參數值等操作。
gdbgui體系結構
ddbgui庫利用了WebSockets的優勢。每當前端調試工具啟動時,都會建立WebSocket連接,用于瀏覽器與后端之間的通信通道。在每個已建立的WebSocket之后,后端都會啟動一個新的托管gdb子進程以解析輸出,同時生成一個單獨的子進程以不斷檢查其他子進程的輸出。最后,它使用相同的WebSocket將輸出傳輸到客戶端。
安裝
gdbgui的運行依賴于Python 3,所以首先得有一個Python 3環境,然后可以用pipx安裝 。
首先,安裝pipx
python3 -m pip install --user pipx
在用戶路徑添加新的路徑
python3 -m userpath Append ~/.local/bin
最后,安裝gdbgui
pipx install gdbgui
使用gdbgui進行調試
使用gdbgui調試一個簡單的C++程序,熟悉其功能。進入到源代碼目錄:
cd examples/c
make
運行這些命令后,調試器會在瀏覽器中彈出打開。
這樣會在本地瀏覽器打開,也可以通過執行gdbgui啟動一個gdbgui實例,默認是監聽127.0.0.1的本地5000端口。可以通過--port指定監聽端口,通過-r指定監聽0.0.0.0 這樣就可以遠程用IP:port訪問了(注意安全)。
gdbgui調試界面詳解
gdbgui的web界面有很多部件,包括頂部Load Binary條,右上角的調試控制器工具條、設置按鈕和信息菜單;
頁面中間是調試內容頁分左中右三塊,分別為文件樹,代碼區和右邊的調試信息窗口。
頁面的底部是信息輸出和最下面的DGB命令工具。
頂部工具欄
執行文件加載:gdbgui的web界面有很多選項。在頁面頂部,看到一個名為Load Binary的部分,可用于加載程序二進制文件(具有gdbgui運行所在的相對路徑),可以給它傳遞參數。請注意,這兒僅接受可執行文件。
調試控制器:
在頁面的右側,是gdbgui的控制器部分,控制器將允許開發人員控制調試的一些流程:比如從頭開始重新啟動程序,跳到下一個斷點,步進(循環單步模式),退出函數或退出到一個功能調用。所有控件也支持鍵盤快捷鍵。
系統設置
可以通過單擊頁面右上方的齒輪圖標來瀏覽調試器的設置部分。設置項的信息都很明確,不過需要懂英文。
"Add breakpoint to main after loading executable",加載可執行文件后給main函數添加斷點。
"Maximum number of source file lines to display":源文件顯示最大行數,設置數字。
"Pretty print dynamic variables (requires restart",美化動態變量顯示
"Refresh all components when a command is sent from the console",向終端發送命令時刷新組件,可以在每個命令之后刷新所有視覺視圖(例如輸入n下一行執行內容)。
"Print all sent commands in console, including those sent automatically by gdbgui",在控制臺中打印所有命令的這個復選項,選中后選就可以在信息輸出框顯示運行的所有命令,還會顯示gdbgui調試時候在后臺運行的所有命令。在大多數情況下,最好取消選中此選項,因為它會使終端控制臺輸出比較雜亂不好讀取。
"Add syntax highlighting to source files",對源文件語法高亮。
還可以設置調試器的主題(比如碼農們喜歡的深色模式monokai)。
調試內容頁
加載可執行文件時,會在頁面中間看到帶有已應用斷點的源代碼。此外,還有一個下拉部分,其中顯示了用于編譯可執行文件的所有源文件的列表。
一般無需通過下拉菜單中指定源文件,但是對于一些語言比如Rust和Golang需要從文件樹指定mail函數所在文件。
在最右側面板是最重要調試信息面板。
調用堆棧和局部變量:顯示了在某個斷點上的位置(文件和指令地址,這是指向斷點的代碼中的指針)。還可以探索與被攻擊的斷點有關的局部變量。通過單擊此處的語言環境,都可以看到詳細的樹狀視圖,該視圖可以以可視格式顯示變量之間的復雜關系。
下面接著是一個表達式部分,可以在程序的整個程序生命周期中持續觀察某個值。對于預期在程序的不同序列中發生變化的變量,這將很有用。
查看變量Tree
調試器的一個很酷的功能是它將內存地址轉換成超鏈接,因此可以單擊這些內存變量。然后可以在下面的內存框中查看它所指的字符。
調試器還有一個獨特的變量可視功能是可以根據時間監視圖表上某些變量的值。
如果單擊表達式部分中的圖表圖標,就可以顯示帶有X和Y線的圖形。如果表達式的值在調試器的運行時中發生變化,則可以在圖形上直觀地看到此變化。
接著下邊則是斷點信息框,信號框和寄存器信息框
我們可以可以很清晰的查看設置的斷點位置、斷點對應的代碼信息,寄存器信息也顯示很詳細。
信息輸出框和gdb命令欄
頁面底部是信息輸出框和gdb命令輸出部分。支持在此處輸出gdb的命令行指令,熟悉gdb命令的同學也可以大顯身手。
結論
本文蟲蟲給大家介紹了一個GDB的web插件gdbgui,通過該插件可以實現通過Web瀏覽器進行程序調試。同時支持遠程進行調試,調試界面優美,功能強大,就算是有好用的IDE,該工具也值得大家去嘗試一下。