无法调试C ++可执行文件(“断点当前不会被击中”)

我有一个测试可执行文件,该文件链接了Windows 10上Visual Studio 2019(16.4.2)中的C ++静态库。启动调试器时,测试提示和库代码中的所有断点都被挖空了,并带有工具提示,即PDB找不到:

“该断点当前不会被命中。该文档尚未加载任何符号。”

启动调试器后,从“未加载任何符号”屏幕上的链接手动浏览可执行PDB也会失败,并显示以下消息:

“在此文件夹中找不到匹配的符号文件”

奇怪的是文件在那里,它是最新的,PDB浏览器允许我选择它。这是正确的PDB(在“链接器”>“调试”设置中指定),而不是较小的中间文件夹。

我正在构建Debug | x86,并在Debug | x64中遇到相同的问题。我的测试可执行文件正在使用Google Test 1.8.1.2版。

我尝试删除所有中间文件和输出,关闭/重新打开IDE并重建解决方案,但这并没有帮助。 PDB不会被其他项目中同名的PDB覆盖。

我的项目设置如下:

测试可执行文件和静态库:

C / C ++>常规:调试信息格式= 程序数据库(/ Zi)。

测试可执行文件:

链接器>调试:生成调试信息= 生成调试信息(/ DEBUG)

链接器>调试:生成程序数据库文件= $(OutDir)$(TargetName).pdb

第3方Google测试PDB存在于输出文件夹中,由内部版本从我正在使用的NuGet软件包中复制。我检查了这些是正确的PDB。我认为无论如何我都不需要这些,因为我没有尝试调试任何Google测试代码。

我尝试创建一个新的“ Hello world”测试可执行文件,并且可以对其进行调试而没有任何问题。

nb_sky 回答:无法调试C ++可执行文件(“断点当前不会被击中”)

经过反复尝试,我找到了答案。

具有可执行目标(EXE或DLL)的项目会生成两个 PDB:

  1. 中间PDB:仅用于项目代码,写入中间文件夹

配置属性> C / C ++:程序数据库文件名

中指定
  1. 输出PDB:对于整个可执行文件(包括静态链接的库),已写入输出文件夹

配置属性>链接器>调试中指定:生成程序数据库文件

此问题是由于覆盖可执行文件的中间 PDB的名称,将其从默认值更改为项目(也称为目标)名称而引起的。输出的PDB(更大并且写入输出文件夹)共享相同的文件名。

中间PDB名称覆盖是从与静态库项目共享的公共属性页继承的。后者需要此覆盖,因为它随其PDB一起分发。保留默认名称(vc142.pdb)可能会与该行之后的其他默认名称PDB冲突。

解决方法是恢复可执行项目中中间PDB的默认名称:

  1. 打开项目属性。
  2. 展开配置属性> C / C ++
  3. 还原程序数据库文件名的值:从值下拉列表中选择 。点击“应用”。

这会将值重新设置为 $(IntDir)vc $(PlatformToolsetVersion).pdb

悬崖:任何DLL / EXE项目都应避免为其中间和最终(输出)PDB指定相同的PDB文件名。

在这方面,链接器可能会更有帮助,也许是在用户产生此类冲突时发出链接时警告。

本文链接:https://www.f2er.com/2643258.html

大家都在问