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

windows系统下主要的调试器:

  • CDB ,只能调试用户程序,只有控制台界面,以命令行形式工作
  • NTSD, 只能调试用户程序,只有控制台界面,以命令行形式工作
  • KD,主要用于内核调试,有时候也用于用户态调试,只有控制台界面,以命令行形式工作
  • WinDbg,在用户态、内核态下都能够发挥调试功能,采用了可视化的用户界面

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

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

PDB(Program Database),是微软开发的用于存储程序调试信息的文件格式。pdb文件是由源码在编译期生成,存储了源文件名称,变量名,函数名,FPO(帧指针),对应行号等信息。由于体积庞大,同时出于安全性考虑,可运行程序exe或者dll文件都是无符号的。

说白了,符号文件可以帮助你调试程序,可以追踪到编译器提供的库和操作系统本身的代码;调试符号就是这些代码内的符号;调试符号数据库,记录了变量,函数这一类符号和内存定位的关系,从而可以用地址相关信息追踪到变量名,函数名;方便调试。总之,符号文件包含大量的数据,这些数据在运行二进制文件时实际上并不需要,但在调试代码时很有用。

四、QtCreator中配置CDB

1、Qt官网有介绍:Setting Up Debugger | Qt Creator Manual

  • 打开 Tools >Options > DebuggerCDB 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.

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

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

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

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

欢迎访问姊妹篇

Windows平台的Windbg/x64dbg/OllyDbg调试器简介以及符号文件*.pdb总结

VC++内存泄漏检测方法(5):使用强大的Windbg工具

---

参考文献:

[Windbg基础]-了解Symbols 

[Windbg基础]-了解Symbols_在线笔记-CSDN博客

关于qtcreator+vs2008+CDB调试太卡的问题研究

关于qtcreator+vs2008+CDB调试太卡的问题研究_翟冬狼_Trump-CSDN博客

微软符号服务器下载符号总结

微软符号服务器下载符号总结_fishmai的专栏-CSDN博客_微软符号服务器

使用CDB调试Qt代码

使用CDB调试Qt代码_大道曙光的博客-CSDN博客

解决CDB调试速度慢的问题_sanqima的专栏-CSDN博客

  • 9
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值