windbg 命令_4. windbg调试符号表1

本文介绍了程序调试中的pdb文件的作用及重要性。pdb文件包含了程序的符号表和其他详细信息,有助于开发人员在debug版本中重现问题并进行调试。此外,文章还提到了在release版本构建时也会生成pdb文件,并解释了其在解决实际问题中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们都知道,程序根据配置不同,可以build成release和debug两个版本。一般发布出去的是release版本,相比debug版本,release版本文件小,执行快,但相对的,其携带的信息也更少。所以开发人员在遇见问题时,都会build一个debug版本去重现场景,然后通过调试器去发现root cause,进而解决问题,而其原因就是debug版本,连接器在生成*.exe和*.dll时,还会生成带有关于程序详细符号信息pdb文件(Program Debug Database)。

符号表包含很多用于debug的内容,包括详细的类型信息,函数信息(函数名称以及入口地址),源代码行数,堆栈大小,优化信息,堆栈的信息......如果你想阅读pdb文件里面的信息,可以通过一些工具读取,比如微软自带的dbh.exe,通过执行命令""C:\Program Files(x86)\Windows Kits\10\Debuggers\x64\dbh.exe" -v demo.pdb dump",可以将pdb转化成可以阅读的文本。下图中红框的两行分别是源程序中main和fun的两个函数。关于dbh.exe更详细的用法,可以参考文档。

int fun(int x, int y){  x += y;  return x / y;}int main(){  int a = 2, b = 0;  fun(a, b);    return 0;}

4928c4bd525e6703d6ed2b96b0a150fd.png

为什么调试时我们需要符号表?

  • 链接器创建的可执行文件不包含任何变量信息和函数名称等;

  • 调试就是查看操作系统或应用程序的运行时内存;

  • 同样,内存也不包含任何变量或函数信息;

  • 调试器需要符号来将地址转换为名称;

所以,在调试时,调试器(windbg.exe)就像一个中介一样,可以将.exe中的内存地址与.pdb文件中的符号信息对应起来。

3bd3b73ffee72a8a6b1441508ddc4ec8.png

那pdb文件只有在构建debug版本时才创建吗?答案是NO。pdb文件在构建release版本时也会生成,只是相对debug版本,信息不太全面而已,但还是很重要的。

想象下,你的release版本遇见crash问题,如果用debug版本重现问题会非常耗时,而你需要快速定位问题,或者至少有相对正确的猜想和怀疑位置。此时,你可以直接将源代码attach到release版本,crash时你可以看到call stack(函数名),虽然没法查看源代码,但有了关注的位置,再用debug版本去查看具体的内存信息,解决问题就会快速很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值