天天看點

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

windows系統下主要的調試器:

CDB ,隻能調試使用者程式,隻有控制台界面,以指令行形式工作

NTSD, 隻能調試使用者程式,隻有控制台界面,以指令行形式工作

KD,主要用于核心調試,有時候也用于使用者态調試,隻有控制台界面,以指令行形式工作

WinDbg,在使用者态、核心态下都能夠發揮調試功能,采用了可視化的使用者界面

Qt Creator使用調試器可以是gdb和cdb,本篇文章隻介紹cdb。

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

一、安裝CDB

CDB(command line debugger)是給控制台調試代碼用的,CDB是WinDbg的小兄弟。因為VS的VC++用的調試器是C:\Windows\System32\vsjitdebugger.exe,是以安裝Visual Studio是沒有cdb的。必須從WDK裡面安裝Debugging Tools for Windows。

Windows SDK archive - Windows app development

下載下傳 Windows 驅動程式工具包 (WDK) - Windows drivers | Microsoft Docs

安裝完成後,在C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86或者x64路徑下可以找到cdb.exe和gdb.exe。

總之,qtcreator是不支援vsjitdebugger調試器的,隻能使用cdb。

二、關注Qt官網的一些要素,摘錄以下幾點 Qt Creator Windows Debugging - Qt Wiki

1、32位版本的cdb.exe隻能調試32位可執行檔案。 64位版本可以調試64位和32位可執行檔案,但是使用64位調試器中斷32位可執行檔案可能會導緻顯示Wow64 32位仿真層的堆棧跟蹤。

2、Qt Creator通過加載擴充庫(qtcreatorcdbext.dll)來擴充指令行調試器。 必須為檔案夾libs\qtcreatorcdbext64或libs\qtcreatorcdbext32中的32位和64位版本的調試器提供此庫。

D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreatorcdbext32\qtcreatorcdbext.dll

D:\Qt\Qt5.9.8\Tools\QtCreator\lib\qtcreatorcdbext64\qtcreatorcdbext.dll

3、首次啟動調試時,系統會提示您設定Symbol伺服器,該伺服器會在調試器的符号路徑中添加一個特殊條目。 Symbol Server提供作業系統和編譯器運作時庫的調試資訊。 初始下載下傳可能非常耗時。

使用符号進行調試 - Win32 apps | Microsoft Docs

Symbols for Windows debugging (WinDbg, KD, CDB, NTSD) - Windows drivers | Microsoft Docs

4、過時的.pdb檔案可以減慢調試速度。 幹淨的建構可以提供幫助。 此外,增量連結可能會影響調試(在日志中檢查“無法驗證子產品的校驗和...”)。可以通過添加禁用增量連結,在.pro工程檔案加入:

QMAKE_LFLAGS_DEBUG += /INCREMENTAL:NO

三、什麼是symbols?它是幹什麼用的?

Symbols用于程式調試的資料,它包含了調試中需要用到的各種資料,例如:全局變量、本地變量、函數名、函數類型、源代碼行、程式入口位址.....,這些所有的東西都叫做Symbol,Symbol Files中文名叫符号檔案。

    在windows系統中,windows2000将這些資訊儲存在.pdb和.dbg這些的檔案中,而windowsXP和以後的版本都将這些資訊儲存在.pdb檔案中。

    Symbol一般分為兩種:Public和Private,其實我們應該很容易了解他們,就是允許公開的資料和私有的資料。我們在釋出産品的時候,可以同時釋出Symbol資料,對于Symbol資料釋出的粒度,我們也是可以去檢視和控制的(下面會介紹PDBCopy和Symchk)。

    在NET中,我們也可以看到VS生成的Symbols,在VS生成的DLL目錄下面,我們除了DLL外,還可以看到另外的一類檔案.pdb(如下圖),VS能提供給我們這麼大的調試能力和它是分不開的。

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

PDB(Program Database),是微軟開發的用于存儲程式調試資訊的檔案格式。pdb檔案是由源碼在編譯期生成,存儲了源檔案名稱,變量名,函數名,FPO(幀指針),對應行号等資訊。由于體積龐大,同時出于安全性考慮,可運作程式exe或者dll檔案都是無符号的。

說白了,符号檔案可以幫助你調試程式,可以追蹤到編譯器提供的庫和作業系統本身的代碼;調試符号就是這些代碼内的符号;調試符号資料庫,記錄了變量,函數這一類符号和記憶體定位的關系,進而可以用位址相關資訊追蹤到變量名,函數名;友善調試。總之,符号檔案包含大量的資料,這些資料在運作二進制檔案時實際上并不需要,但在調試代碼時很有用。

四、QtCreator中配置CDB

1、Qt官網有介紹:Setting Up Debugger | Qt Creator Manual

打開 Tools >Options > Debugger> CDB Paths

在Symbol Paths面闆中, 選擇 Insert

Select the directory where you want to store the cached information. Use a subfolder in a temporary directory, such as

srv*D:\Qt\symbolcache*http://msdl.microsoft.com/download/symbols

Select OK.

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

srv*D:\Qt\symbolcache*http://msdl.microsoft.com/download/symbols這句話的意思是:

指定用于符号解析的符号路徑為本地路徑D:\Qt\symbolcache,如果找不到就去

http://msdl.microsoft.com/download/symbols

下載下傳。是以第一次斷點調試時,需要下載下傳等很久,第二次以後就不會了。下載下傳下來的檔案夾如圖所示:

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

2、教你如何一次性的完整下載下傳所有 Symbol Files(不推薦)

平常我們都隻是在檢視 Ntdll 的函數, 或者檢視 Service Descriptor Table,這樣CDB隻會下載下傳 ntdll.pdb 和 ntkrnlmp.pdb 或者 win32k.pdb 到 :\<使用者路徑>\Symbol。但其它的呢, 萬一哪天要用到而 Microsoft 又停止支援怎辦, 嗯~把它一次性通通下載下傳到 :\<使用者路徑>\Symbol 好了。啟動 DOS Command Line, 也就是 cmd.exe,先跳進CDB安裝目錄,在DOS輸入

cd C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86

然後再輸入

symchk.exe /r C:\Windows\system32 /s SRV*D:\Qt\Symbols*http://msdl.microsoft.com/download/symbols

表示查找C:\windows\system32檔案夾和所有子檔案夾中的所有符号檔案,從微軟官網下載下傳到D:\Qt\Symbols。

整個過程可能會持續N多個小時,因為win32下的動态庫太多,個人感覺無需全部下載下傳。在下載下傳完成以後

Qt Creator->Tools->Options->Debugger->CDB Paths->Symbol Paths

将D:\Qt\Symbols添加到符号路徑,這樣debug過程中所需要的符号都會從本地搜尋不會再連結符号伺服器,也就不會再卡了。

五、個人技巧與建議

1、編譯器使用MSVC 32bit時,CDB調試可以選擇64bit,據說64bit調試更快?沒有親測,待觀察。

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定

2、CDB斷點調試,解決無法檢視QString值。打開“工具->選項->調試器->CDB”,把“Use Python dumper”選項勾選去掉,儲存即可。

3、嫌CDB調試速度慢,解決辦法如下:

Qt Creator->Tools->Options->Debugger->CDB Paths->Symbol Paths -> 清空Symbol Paths。缺點是關閉了符号伺服器,在調試到系統的運作庫的時候會無法跟蹤。

4、之前下載下傳的符号檔案儲存在D:\Qt\Symbols,注意,不要以為這些檔案是通用的,不同作業系統(大系統有WinXP/Win7/Win10,而大系統又有細分很多小版本)對應的pdb檔案是不同的,是以要求不同系統自己下載下傳自己的符号檔案。此外,當作業系統更新或更新後,很可能出現以前的符号檔案就過時了的情況。

5、VS調試符号檔案(.pdb)的設定

設定添加系統環境變量_NT_SYMBOL_PATH和_NT_ALT_SYMBOL_PATH的值為:

_NT_SYMBOL_PATH=C:\Symbols;srv*C:\Symbols*http://msdl.microsoft.com/download/symbols

_NT_ALT_SYMBOL_PATH=cache*C:\Symbols

這樣啟動VS的時候它會自動查找這個變量,然後去相應的url位址上下載下傳對應系統的符号檔案,最後下載下傳的符号檔案儲存在C:/Symbols路徑下。這個路徑必須是C:/Symbols。當然,可以根據需求自己改路徑,使用mklink指令。用管理者權限打開CMD(windows開始菜單-所有程式-附件-指令提示符-右鍵,以管理者身份運作),輸入指令:

mklink /D C:\Symbols E:\software\Qt\symbolcache

Qt Creator的CDB調試器--使用技巧與解決調試很慢的心得,重點是Symbols Path設定