遇到Visual Studio "当前不会命中断点.尚未为该文档加载任何符号"的状况

一.问题及缘由程序员

有这样一种调用逻辑:A.exe调用B.dll.如今想要在B的源代码中打断点,从A发起进行调试,却给出了"当前不会命中断点.尚未为该文档加载任何符号"的提示.感受十分奇怪,各类从新生成,重启VS都没啥用,最后不得以网上搜了一番,找到了问题的根源.函数

原来我把旧的B.dll文件拷到了A.exe所在的目录下,致使A.exe调试时直接去调用旧的B.dll文件,而旧的dll文件对应的.pdb文件早已经不存在了,所以没法进行调试.(.pdb文件中存储着调试信息.dll文件源代码修改后,从新生成就生成了新的.pdb,和旧的dll文件再也不匹配.)测试

 


 

(如下是参考资料) 优化

二..pdb的更多介绍ui

在 Windows 系统中,符号文件以 .pdb 为扩展名.每一个模块被载入的时候(EXE和DLL均可以称之为模块),其相同名字的PDB文件同时被载入。因此Debug模式下,不只由于代码没有优化,同时由于要载入PDB文件,因此Debug模式下的程序执行速度很是慢。spa

每一个模块只会生成一个相同名字的PDB文件,而且模块生成的同时,会校验PDB文件生成GUID记录在模块内。这是由于调试时,调试器强制要求每一个模块必须和PDB文件保持一致。实验过程当中,用以前生成的PDB文件替换当前生成的PDB文件时,Debug窗口会显示No symbols loaded. MSDN也作了相应的说明:The debugger will load only a PDB for a binary that exactly matches the PDB that was created when the binary was built..net

PDB文件中记录了源文件路径的相关信息,因此在载入PDB文件的时候,就能够将相关调试信息与源码对应。这样能够可视化的实时查看调试时的函数调用、变量值等相关信息。模块当中记录的PDB文件是绝对路径。因此只要模块在当前电脑上载入,调试器天然地会根据模块当中的路径信息找到相应PDB文件并载入。一样PDB文件中记录的源文件路径也是绝对路径,因此PDB文件只要在当前电脑上载入,调试进入相应模块时,都可以匹配到记录的源文件,而后可视化地查看相应信息。debug

若是源文件找不到,那么依然可以查看调试信息,只是这个时候只能查看汇编代码,不能经过源文件可视化查看信息。通常状况下,绝大多数C++程序员不具有阅读汇编代码的能力。因此彻底经过PDB文件调试,意义与做用均没有多大。若是要让其余人可以调试自已的代码,PDB文件和源码都应该提供,只提供PDB文件的意义不大。若是确实有相似的需求,能够保留相应生成的PDB文件。微软的不少库默认是不提供PDB文件的,可是近来微软逐渐开放了一些库的PDB文件。调试

三.利用.pdb调试dllblog

1. 写一个调用Dll中函数的控制台测试程序test。
2. 设置test,将debug下编译链接生成dll和lib复制到.exe所在路径,使得test可以运行起来。
3. 将与dll一同产生的debug文件夹下的pdb文件复制到sln所在路径下,运行调试test,F11就可以进入所调用的dll中的函数。

 

四.其余可能的缘由:

1.没有附加到正确的进程

2. 

 

 

参考资料:

1.https://blog.csdn.net/wqfhenanxc/article/details/80674223

2.https://blog.csdn.net/u011595231/article/details/17244109

相关文章
相关标签/搜索