一.问题及原因

有这样一种调用逻辑: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所在路径下,运行调试test,F11就能够进入所调用的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

遇到Visual Studio 当前不会命中断点.还没有为该文档加载任何符号的情况相关推荐

  1. 关于Visual Studio 当前不会命中断点.还没有为该文档加载任何符号的解决方法

    在使用vs的过程中,有些工程可以编译通过正常运行,但是在下断点调试时会显示"当前不会命中断点.还没有为该文档家在任何符号". 如下图1 图1 这并不是vs的bug,而是在设置选项中 ...

  2. “当前不会命中断点 还没有为该文档加载任何符号”解决方法

    "当前不会命中断点 还没有为该文档加载任何符号"解决方法 参考文章: (1)"当前不会命中断点 还没有为该文档加载任何符号"解决方法 (2)https://ww ...

  3. vs关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法

    vs关于"当前不会命中断点 还没有为该文档加载任何符号"的解决方法 参考文章: (1)vs关于"当前不会命中断点 还没有为该文档加载任何符号"的解决方法 (2) ...

  4. VS当前不会命中断点 还没有为该文档加载任何符号

    最近一不小心遇到vs断点无法使用问题,当前不会命中断点 还没有为该文档加载任何符号,查了好久终于查到解决办法.. 有这么几种方法可以尝试去解决此问题: 1.工具"-->选项" ...

  5. 当前不会命中断点.还没有为该文档加载任何符号解决

    图参考: https://blog.csdn.net/u010797208/article/details/40452797 在使用vs的过程中,有些工程可以编译通过正常运行,但是在下断点调试时会显示 ...

  6. [转]当前不会命中断点 还没有为该文档加载任何符号

    相信很多人在网页编程时都遇到过这个问题,就是设置断点时给出提示,之后不能选中.我今天也碰到这个问题了,足足折磨了我一天.设置是debug没错,我也没有找到"C/C++->常规-> ...

  7. “当前不会命中断点。还没有为该文档加载任何符号“解决方案

    最近在调试公司已开发好的项目时遇到一个无法命中断点的问题,试过了网上的许多方法,依旧无法解决, 后来问了公司另外一位同事,在他的帮助下才得以解决,解决方法如下: 1.检查是否在Debug下,然后是否为 ...

  8. 当前不会命中断点还未为文档加载任何符号——问题探究

    今天在调试牛腩网页的时候遇到了一个问题需要用到断点调试来解决,可是加了断点之后出现了下面的情况: 然后就郁闷了,查了百度之后得到了如下的结果: 断点调试是VS中的一大利器,有了它我们可以快速定位到代码 ...

  9. Visual Studio 2013 中如何设置断点

    翻了下以前的草稿, 拿出来贴一贴! -------------------------------------- VS 2013 代码调试 [如何设置断点] 一. 直接用鼠标在界面选定断点 打开VS, ...

最新文章

  1. 微信小程序引入Vant组件库
  2. 1、spring的概述
  3. 大数据使用及现状调研报告
  4. 使用所有对象共有的方法
  5. java面向对象的三大特征是6_Java面向对象的三大特征
  6. AZURE kinect 深度相机配置ubuntu16.04
  7. 栈的基本操作(数组/链表)
  8. windows访问linux下samba无需密码设置
  9. python import 类如何捕获clrt c_Python3 与 C# 扩展之~基础衍生
  10. mysql join 实践
  11. 结构体定义LNode,*LinkList和typedef struct
  12. 64位mysql 和32位区别_32位和64位哪个好 区别的对比分析
  13. 计算机病毒如何彻底去除,电脑中病毒最彻底的清除方法 彻底清理删除电脑病毒的几种简单方法...
  14. 如何使用PS修改图片中的数字
  15. python elif invalid syntax_Python错误集锦:if和elif语句提示:SyntaxError: invalid syntax
  16. android 虚拟按键root,(免root)虚拟按键手动修改方法
  17. 数据恢复必备宝典—BMP文件详解
  18. 终于还是对闲鱼下手了。闲鱼爬虫,idlefish spider来了
  19. C#:实现公历转农历算法(附完整源码)
  20. PostgreSQL row number

热门文章

  1. jquery ajax 上传文件 demo,Jquery+AJAX上传文件,无刷新上传并重命名文件
  2. java 如何去掉http debug日志_你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?...
  3. epic怎么添加本地游戏_游戏日报:原神公测无法上架多家安卓渠道;Epic投资布局游戏UGC平台...
  4. puppet enc mysql_精通Puppet配置管理工具
  5. python游戏循环设置_Pygame:游戏循环前的初始菜单
  6. python中int是什么的缩写_python中int是什么类型
  7. oracle sga pga mysql_修改Oracle数据库SGA和PGA大小
  8. 努比亚z17s刷原生安卓_电脑运行手机APP,不会没关系,我推荐你使用显卡服务器运行安卓模拟器...
  9. 力扣删除排序数组中的重复项 II
  10. xilinx-arm-linux交叉编译链安装