在VS Code中開啟gdb的pretty-printer功能

NO IMAGE

VS Code中開啟GDB的pretty-printer功能

準備pretty-printer

pretty-printer是幹什麼的

眾所周知,C 的STL容器的實現並不直觀,直接使用gdb之類的debugger檢視記憶體是需要週轉多次才能看到具體的內容的。
在Visual Studio之類的IDE中內建了一些指令碼,用來較為友好的顯示容器內的元素。

GDB的pretty-printer指令碼提供了類似的功能。

舉個例子:
假設我們有如下c 程式碼

std::vector<int> vec{1,2,3,4};
std::string s="this is my string.";

在關閉和開啟pretty-printer的情況下,我們使用GDB檢視vec和s的時候看到的會是諸如下面這樣的輸出。在前面關閉prety-printer時,現實的是它們的具體實現中用到的成員變數,而開啟之後顯示的是具體的內容。

(gdb) disable pretty-printer 
163 printers disabled
0 of 163 printers enabled
(gdb) p vec
$1 = {<std::_Vector_base<int, std::allocator<int> >> = {
_M_impl = {<std::allocator<int>> = {<__gnu_cxx::new_allocator<int>> = {<No data fields>}, <No data fields>}, _M_start = 0x615c20, _M_finish = 0x615c30, 
_M_end_of_storage = 0x615c30}}, <No data fields>}
(gdb) p s
$2 = {static npos = 18446744073709551615, 
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x615c40 "this is my string."}, 
_M_string_length = 18, {
_M_local_buf = "\022\000\000\000\000\000\000\000-\[email protected]\000\000\000\000", 
_M_allocated_capacity = 18}}
(gdb) enable pretty-printer 
163 printers enabled
325 of 325 printers enabled
(gdb) p vec
$3 = std::vector of length 4, capacity 4 = {1, 2, 3, 4}
(gdb) p s
$4 = "this is my string."

安裝pretty-printer

很遺憾雖然pretty-printer是GDB官方提供的,但是並沒有預設安裝/開啟。所以需要手動安裝。
需要注意的是,這個指令碼是使用python開發的,所以需要7.0及以後的版本的GDB。

可以很方便的通過gcc官網下載 :
https://gcc.gnu.org/svn/gcc/trunk/libstdc -v3/python/
然後配置.gdbinit檔案,開啟它。

官網並沒有自動打包,所以直接下載需要下載很多檔案,推薦使用svn下載,或者解壓我打包好的這個檔案。
https://pan.baidu.com/s/11mWDYO60CsSNt8hcz66zOw

推薦將下載好的檔案放在 ~/.gdb 目錄下,如果沒有可以自行建立。

# 使用svn下載的方法示例(前提是已經安裝了svn)
mkdir ~/.gdb
cd ~/.gdb
svn co svn://gcc.gnu.org/svn/gcc/trunk/libstdc  -v3/python stlprettyprinter

.gdbinit檔案的配置也很簡單(它要放在home目錄下,如果沒有配置過gdb那麼很可能需要自己建立):
其中“/home/xxx/”為當前使用者的home目錄。

python
import sys
sys.path.insert(0, '/home/xxx/.gdb/stlprettyprinter')
from libstdcxx.v6.printers import register_libstdcxx_printers
register_libstdcxx_printers (None)
end

配置成功之後,它就是預設開啟的了,不需要再像我在演示中那樣在GDB中使用enable/disable pretty-printer命令控制。

其他

早期的pretty-printer指令碼不支援Python 3.0,但是現在已經沒有這個問題了,無論你配置的預設python版本是什麼,它都可以正常執行。
所以不要按照你在網上搜到的舊文章的指導去修改它。

在VS Code中自動開啟pretty-printer

VS Code的Variables視窗預設顯示的是記憶體映像,即使你的GDB已經開啟了pretty-printer。

此時如果pretty-printer配置正常,在VS Code的debug console中輸入-exec print vec命令是可以看到處理後的輸出的。

在VS Code的debug console中輸入-exec -enable-pretty-printing命令,可以臨時開啟pretty-printer,但是下次除錯的時候需要重新輸入。

使用VS Code的launch.json的setupCommands,可以自動執行這句指令。在MIMode同一級新增一個setupCommands。它可能是第一級的(和name在同一級),也可能是在特定平臺的配置下(一般為linux下)。

"setupCommands": [
{ "text": "-enable-pretty-printing", "description": "enable pretty printing", "ignoreFailures": true }
]

注意:在VS Code中,這個配置的名字叫做pretty-printing,而不是pretty-printer。

Configuring launch.json for C/C debugging: https://github.com/Microsoft/vscode-cpptools/blob/master/launch.md
一個相關的issue:
https://github.com/Microsoft/vscode-cpptools/issues/69