VisualGDB可視化調試STL

本文中的VisualGDB開發調試環境爲Visual Studio 2015加VisualGDB 5.4R12版本,並且使用了筆者改進過的STL可視化調試庫CSTLTypeVisualizer.dll,原版的STLTypeVisualizer.dll不支持字符串轉碼,不支持Clang的STL調試。

一、 Windows項目

VisualGDB的Windows項目可以使用MinGW或者Cygwin作爲開發環境,它們默認都是使用的GCC編譯器,所以配置上沒什麼差別。筆者使用VisualGDB官方出的SysGCC 9.1作爲示例來說明(如果想使用更新一些的工具集,可以使用msys2中的MinGW32/MinGW64,它不僅支持GCC,還支持clang,目前最新的GCC版本爲9.2,GDB爲8.3.1,Clang爲9.0)。

由於是Windows項目,控制檯默認是使用的本地編碼,簡體中文使用的GBK,所以需要在編譯時加上-fexec-charset=GBK參數,這樣在控制檯的輸出才能正常顯示,如果控制檯是其它編碼,編譯時設置爲一樣的編碼即可。但是這樣設置後,調試字符串時會看到是亂碼。所以還需要運行GDB的命令:

set charset UTF-8
set target-charset GBK

在這裏插入圖片描述
其中:
set charset UTF-8是設置主機(host)字符編碼爲UTF8
set target-charset GBK是設置目標程序的編碼爲GBK。

這樣設置後,GDB會將目標程序編碼自動轉換爲主機(host)字符編碼,即由GBK轉爲UTF-8,然後CSTLTypeVisualizer.dll會以UTF-8編碼解析這個字符串(爲了兼容性,CSTLTypeVisualizer.dll默認GDB的host-charset爲UTF-8,即只接受以UTF-8編碼的字符串)。如果是使用命令行GDB直接調試,則需要把charset與target-charset都設置爲GBK,否則調試字符串時會顯示亂碼
另外,由於GDB默認的輸出字符串有長度限制,默認是200,如果字符串比較長,想要全部顯示(會影響性能),可以使用命令:

set print element 0

需要注意的是:不是所有Windows發行版本的GDB都完全支持這些命令,筆者使用的這個發行版本是完全支持的。

二、 Linux項目

Linux平臺的下可以選擇的組合就比較多了,構建方式VisualGDB支持Makefile以及CMake等,CMake又支持GNU make和ninja兩種,編譯器支持GCC以及Clang,所以喜歡怎麼用就怎麼用。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
這裏需要注意的是:
1.如果使用Clang編譯器進行編譯,如果使用的是clang的libc++庫,調試版需要定義宏:

_LIBCPP_DEBUG=1

如果使用的是GCC的libstdc++庫,調試版需要定義宏:

_GLIBCXX_DEBUG

否則調試時看不到字符串的值。當然如果使用GCC編譯器,調試版也建議加上。
2.如果使用CMake時,在建立好項目後,點Underlying build system右邊的按鈕重新選擇使用GNU Make還是Ninja時,下面一行的構建命令不會自動更新,需要手動設置。這一點也適用於Windows項目。
在這裏插入圖片描述
上面所示即是沒有更新構建命令,需要如下圖所示的更改:在這裏插入圖片描述
關於編碼及亂碼處理:
由於Linux平臺下默認是UTF-8編碼,GCC、Clang以及GDB也默認使用的是UTF-8編碼,所以只有源碼使用的不是UTF-8編碼的情況下容易出現亂碼。GCC以及Clang在不指定任何源文件編碼的情況下(即不使用-finput-charset參數指定源文件編碼),是將源碼中的字符串原樣處理的,即如果源碼中的字符串是GBK編碼,編譯後還是GBK編碼。所以我們可以用以下方式進行處理:
1.只要源文件能完全編譯通過,有非法字符串編碼的警告:

warning : illegal character encoding in string literal [-Winvalid-source-encoding]

可以不用管。在調試時設置GDB目標字符串編碼(target-charset)爲GBK即可,但是VisualGDB控制檯輸出字符串會是亂碼。
在這裏插入圖片描述
下圖是查看GDB的target編碼與host編碼,默認都是UTF-8,通過上面的設置後target-charset會變爲GBK。在這裏插入圖片描述

2.GCC可以使用參數進行設置,比如源碼是GBK編碼,可以添加編譯參數:

-finput-charset=GBK

至於Clang,目前不支持除UTF-8外的編碼,所以最好是將所有使用了ANSI編碼外的源文件轉爲UTF-8編碼(如果是隻有註釋使用了非ANSI編碼就可以不用轉了)。

三、運行效果圖

下面是Windows測試用例的運行效果圖:

string字符串:
在這裏插入圖片描述
const char*字符串:
在這裏插入圖片描述在這裏插入圖片描述
set:
在這裏插入圖片描述
map:
在這裏插入圖片描述
vector:
在這裏插入圖片描述
unique_ptr:
在這裏插入圖片描述
shared_ptr:
在這裏插入圖片描述
控制檯的正常輸出:
在這裏插入圖片描述

下面是Linux項目的運行圖:
Clang的string字符串
在這裏插入圖片描述
Clang的map:在這裏插入圖片描述

發佈了62 篇原創文章 · 獲贊 21 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章