网站免费建站 网页不需要备案,新网站怎么运营,自动化产品的网站建设,wordpress 整站语言一.问题及原因 有这样一种调用逻辑:A.exe调用B.dll.现在想要在B的源代码中打断点,从A发起进行调试,却给出了当前不会命中断点.还没有为该文档加载任何符号的提示.感觉十分奇怪,各种重新生成,重启VS都没啥用,最后不得以网上搜了一番,找到了问题的根源. 原来我把旧的…一.问题及原因 有这样一种调用逻辑:A.exe调用B.dll.现在想要在B的源代码中打断点,从A发起进行调试,却给出了当前不会命中断点.还没有为该文档加载任何符号的提示.感觉十分奇怪,各种重新生成,重启VS都没啥用,最后不得以网上搜了一番,找到了问题的根源. 原来我把旧的B.dll文件拷到了A.exe所在的目录下,导致A.exe调试时直接去调用旧的B.dll文件,而旧的dll文件对应的.pdb文件早已经不存在了,因此无法进行调试.(.pdb文件中存储着调试信息.dll文件源代码修改后,重新生成就生成了新的.pdb,和旧的dll文件不再匹配.) (以下是参考资料) 二..pdb的更多介绍 在 Windows 系统中符号文件以 .pdb 为扩展名.每个模块被载入的时候(EXE和DLL都可以称之为模块)其相同名字的PDB文件同时被载入。所以Debug模式下不仅因为代码没有优化同时因为要载入PDB文件所以Debug模式下的程序执行速度非常慢。 每个模块只会生成一个相同名字的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. PDB文件中记录了源文件路径的相关信息所以在载入PDB文件的时候就可以将相关调试信息与源码对应。这样可以可视化的实时查看调试时的函数调用、变量值等相关信息。模块当中记录的PDB文件是绝对路径。所以只要模块在当前电脑上载入调试器自然地会根据模块当中的路径信息找到相应PDB文件并载入。同样PDB文件中记录的源文件路径也是绝对路径所以PDB文件只要在当前电脑上载入调试进入相应模块时都能够匹配到记录的源文件然后可视化地查看相应信息。 如果源文件找不到那么依然能够查看调试信息只是这个时候只能查看汇编代码不能通过源文件可视化查看信息。一般情况下绝大多数C程序员不具备阅读汇编代码的能力。所以完全通过PDB文件调试意义与作用均没有多大。如果要让其他人能够调试自已的代码PDB文件和源码都应该提供只提供PDB文件的意义不大。如果确实有类似的需求可以保留相应生成的PDB文件。微软的很多库默认是不提供PDB文件的但是近来微软逐渐开放了一些库的PDB文件。 三.利用.pdb调试dll 1. 写一个调用Dll中函数的控制台测试程序test。2. 设置test将debug下编译连接生成dll和lib复制到.exe所在路径使得test能够运行起来。3. 将与dll一同产生的debug文件夹下的pdb文件复制到sln所在路径下运行调试testF11就能够进入所调用的dll中的函数。 参考资料: 1.https://blog.csdn.net/wqfhenanxc/article/details/80674223 2.https://blog.csdn.net/u011595231/article/details/17244109转载于:https://www.cnblogs.com/Stephen-Qin/p/10458810.html