C++(Qt)软件调试---无法校验pdb时间戳(23)
C++(Qt)软件调试—无法校验pdb时间戳(23)
文章目录
- C++(Qt)软件调试---无法校验pdb时间戳(23)
- @[toc]
- 1、概述🐜
- 2、前期准备🪲
- 3、开始分析🦧
- 4、相关地址🐐
文章目录
- C++(Qt)软件调试---无法校验pdb时间戳(23)
- @[toc]
- 1、概述🐜
- 2、前期准备🪲
- 3、开始分析🦧
- 4、相关地址🐐
更多精彩内容 |
---|
👉内容导航 👈 |
👉C++软件调试 👈 |
1、概述🐜
windows中使用windbg调试程序时需要使用到源代码、可执行程序、pdb符号表;
而加载pdb符号表时有可能会失败,常见原因有两种:
- 名称错误:pdb符号表和可执行程序名称应该是相同的,如果随意改动会加载失败;
- 时间戳错误:加载pdb符号表时会校验pdb与exe的生成时间戳是否相同,如果不同也会失败,报错
WARNING: Unable to verify timestamp for TestCrash_1.1.0.exe
;本文中主要讲解pdb时间戳校验失败如何加载。
演示环境:
-
系统:
- Windows11
-
开发环境:
- Qt
-
编译器:
- msvc2022-64
2、前期准备🪲
- 演示代码
- 使用debug模式编译第一次,将生成的pdb符号表复制到其他地方;
- 使用debug模式编译第二次,将第一次生成的pdb符号表替换第二次生成的符号表,这样pdb和exe时间就不会相同了。
- 运行TestCrash程序,生成dmp文件。
3、开始分析🦧
-
将生成的pdb文件拖进windbg中;
-
使用
.sympath+ E:\test\bin64
命令设置pdb符号表路径; -
使用
lm
命令查看pdb符号表加载情况,如下图所示未加载; -
使用
.reload /f Test*
命令加载TestCrash_1.1.0.exe
的符号表,显示信息如下,加载失败,校验时间戳错误; -
打开
Call Stack
窗口; -
输入
.excr
命令显示与当前异常关联的上下文记录,发现因为没有加载符号表,无法定位异常位置; -
方法一: 使用
.symopt+ 0x40
命令当尝试匹配符号时,此符号选项可降低符号处理程序的挑剔度。官方文档地址:- .symopt(设置符号选项) - Windows drivers | Microsoft Learn
- 符号选项 - Windows drivers | Microsoft Learn
- SYMOPT_LOAD_ANYTHING
-
方法二: 使用
.reload /i TestCrash_1.1.0.exe
命令,其中/i
忽略 .pdb 文件版本中的不匹配情况。TestCrash_1.1.0.exe
为需要加载的可执行程序名称。然后再次运行.excr
就可以进行分析了,官方文档地址:- .reload(重新加载模块) - Windows drivers | Microsoft Learn
4、相关地址🐐
- 演示代码
- .symopt(设置符号选项) - Windows drivers | Microsoft Learn
- 符号选项 - Windows drivers | Microsoft Learn
- SYMOPT_LOAD_ANYTHING
- .reload(重新加载模块) - Windows drivers | Microsoft Learn