Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置

简介: Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置

windows系统下主要的调试器:


CDB ,只能调试用户程序,只有控制台界面,以命令行形式工作

NTSD, 只能调试用户程序,只有控制台界面,以命令行形式工作

KD,主要用于内核调试,有时候也用于用户态调试,只有控制台界面,以命令行形式工作

WinDbg,在用户态、内核态下都能够发挥调试功能,采用了可视化的用户界面

Qt Creator使用调试器可以是gdb和cdb,本篇文章只介绍cdb。


image.png


一、安装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能提供给我们这么大的调试能力和它是分不开的。

image.png



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.


image.png


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


指定用于符号解析的符号路径为本地路径D:\Qt\symbolcache,如果找不到就去http://msdl.microsoft.com/download/symbols下载。所以第一次断点调试时,需要下载等很久,第二次以后就不会了。下载下来的文件夹如图所示:


image.png


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调试更快?没有亲测,待观察。


image.png


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

image.png





相关文章
|
2月前
|
IDE 开发工具 C++
qt creator + vs2019编译记录
本文记录了作者在使用qt creator和vs2019编译项目时遇到的困难和解决方案,包括编译环境设置、qt creator编译脚本的成功案例、不带Ninja的编译脚本问题、错误示范以及相关参考链接。
qt creator + vs2019编译记录
|
4月前
QT设置widget背景图片
该内容介绍如何在Qt中为控件添加背景图片。主要方法包括:1) 在样式表中使用`border-image`属性指定控件及其背景图片;2) 使用调色板`QPalette`设置图片,但可能导致窗口显示不下;3) 在`paintEvent`中绘制图片,适合自定义绘图但不适用于子窗口;4) 通过覆盖一个大小与窗口相同的`QLabel`来设置背景图片,可实现动态背景。推荐使用样式表设置背景,简单高效且适合子窗口。
230 3
|
3月前
|
网络协议
【qt】TCP的监听 (设置服务器IP地址和端口号)
【qt】TCP的监听 (设置服务器IP地址和端口号)
169 0
|
5月前
Qt安装之后添加或移除组件(Qt Creator 10.0.1)
Qt安装之后添加或移除组件(Qt Creator 10.0.1)
168 2
|
5月前
Qt之HelloWord(Qt Creator 10)
Qt之HelloWord(Qt Creator 10)
|
5月前
|
IDE 开发工具 数据安全/隐私保护
【干货】Qt Creator快速下载、安装、使用教程
【干货】Qt Creator快速下载、安装、使用教程
|
5月前
|
C++
使用Qt Creator 出现的一些错误
使用Qt Creator 出现的一些错误
|
6月前
|
数据可视化 开发工具 C++
Qt Creator 界面
Qt Creator 界面
|
4月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
169 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
3月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
70 0