无法调试 C++ 可执行文件 ("The breakpoint will not currently be hit")
Unable to debug C++ executable ("The breakpoint will not currently be hit")
我在 Windows 10 Visual Studio 2019 (16.4.2) 中有一个测试可执行文件 linking 一个 C++ 静态库。当我启动调试器时,测试中的所有断点cilent 和库代码显示为空心,并带有无法定位 PDB 的工具提示:
"The breakpoint will not currently be hit. No symbols have been loaded for this document."
启动调试器后,在 "No Symbols Loaded" 屏幕上从 link 手动浏览可执行 PDB 也失败,并显示消息:
"A matching symbol file could not be found in this folder"
文件在那里,这很奇怪,它是最新的,PDB 浏览器让我 select 它。它是正确的 PDB(在链接器 > 调试设置中指定),而不是小得多的中间文件夹。
我正在构建 Debug|x86 并在 Debug|x64 中遇到同样的问题。我的测试可执行文件正在使用 Google 测试版本 1.8.1.2.
我尝试删除所有中间文件和输出,closed/reopened IDE 并重建解决方案,但这没有帮助。 PDB 未被来自其他项目的同名 PDB 覆盖。
我的项目设置如下:
测试可执行文件和静态库:
C/C++ > 通用:调试信息格式=程序数据库(/Zi).
测试可执行文件:
链接器 > 调试:生成调试信息 = 生成调试信息 (/DEBUG)
链接器 > 调试:生成程序数据库文件 = $(OutDir)$(TargetName).pdb
第 3 方 Google 测试 PDB 存在于输出文件夹中,由我使用的 NuGet 包的构建复制。我已经检查过这些是正确的 PDB。我不认为我需要这些,因为我没有尝试调试任何 Google 测试代码。
我已经尝试创建一个新的 "Hello world" 测试可执行文件并且可以毫无问题地调试它。
经过反复试验,我找到了答案。
具有可执行目标(EXE 或 DLL)的项目生成 两个 个 PDB:
- Intermediate PDB:只针对项目的代码,写入中间文件夹
在配置属性中指定 > C/C++:程序数据库文件名
- 输出 PDB:对于整个可执行文件,包括静态 linked 库,写入输出文件夹
在配置属性 > 链接器 > 调试中指定:生成程序数据库文件
问题是由于覆盖可执行文件的 中间 PDB 的名称,将其从默认值更改为项目(a.k.a.target)名称引起的。输出 PDB(更大并写入输出文件夹)共享相同的文件名。
中间 PDB 名称覆盖继承自与静态库项目共享的公共 属性 页面。后者需要此覆盖,因为它是与其 PDB 一起分发的。保留默认名称 (vc142.pdb) 可能会与其他默认名称的 PDB 发生冲突。
修复是恢复可执行项目中中间 PDB 的默认名称:
- 打开项目属性。
- 展开配置属性 > C/C++
- 还原程序数据库文件名的值:从值下拉列表中选择 < 从项目或父级默认值继承 >。单击应用。
这会将值设置回类似 $(IntDir)vc$(PlatformToolsetVersion).pdb.
Cliffs:任何 DLL/EXE 项目都应避免为其中间和最终(输出)PDB 指定相同的 PDB 文件名。
linker 在这方面可能会更有帮助,也许是在发生用户生成的冲突时发出 link 时间警告。
我在 Windows 10 Visual Studio 2019 (16.4.2) 中有一个测试可执行文件 linking 一个 C++ 静态库。当我启动调试器时,测试中的所有断点cilent 和库代码显示为空心,并带有无法定位 PDB 的工具提示:
"The breakpoint will not currently be hit. No symbols have been loaded for this document."
启动调试器后,在 "No Symbols Loaded" 屏幕上从 link 手动浏览可执行 PDB 也失败,并显示消息:
"A matching symbol file could not be found in this folder"
文件在那里,这很奇怪,它是最新的,PDB 浏览器让我 select 它。它是正确的 PDB(在链接器 > 调试设置中指定),而不是小得多的中间文件夹。
我正在构建 Debug|x86 并在 Debug|x64 中遇到同样的问题。我的测试可执行文件正在使用 Google 测试版本 1.8.1.2.
我尝试删除所有中间文件和输出,closed/reopened IDE 并重建解决方案,但这没有帮助。 PDB 未被来自其他项目的同名 PDB 覆盖。
我的项目设置如下:
测试可执行文件和静态库:
C/C++ > 通用:调试信息格式=程序数据库(/Zi).
测试可执行文件:
链接器 > 调试:生成调试信息 = 生成调试信息 (/DEBUG)
链接器 > 调试:生成程序数据库文件 = $(OutDir)$(TargetName).pdb
第 3 方 Google 测试 PDB 存在于输出文件夹中,由我使用的 NuGet 包的构建复制。我已经检查过这些是正确的 PDB。我不认为我需要这些,因为我没有尝试调试任何 Google 测试代码。
我已经尝试创建一个新的 "Hello world" 测试可执行文件并且可以毫无问题地调试它。
经过反复试验,我找到了答案。
具有可执行目标(EXE 或 DLL)的项目生成 两个 个 PDB:
- Intermediate PDB:只针对项目的代码,写入中间文件夹
在配置属性中指定 > C/C++:程序数据库文件名
- 输出 PDB:对于整个可执行文件,包括静态 linked 库,写入输出文件夹
在配置属性 > 链接器 > 调试中指定:生成程序数据库文件
问题是由于覆盖可执行文件的 中间 PDB 的名称,将其从默认值更改为项目(a.k.a.target)名称引起的。输出 PDB(更大并写入输出文件夹)共享相同的文件名。
中间 PDB 名称覆盖继承自与静态库项目共享的公共 属性 页面。后者需要此覆盖,因为它是与其 PDB 一起分发的。保留默认名称 (vc142.pdb) 可能会与其他默认名称的 PDB 发生冲突。
修复是恢复可执行项目中中间 PDB 的默认名称:
- 打开项目属性。
- 展开配置属性 > C/C++
- 还原程序数据库文件名的值:从值下拉列表中选择 < 从项目或父级默认值继承 >。单击应用。
这会将值设置回类似 $(IntDir)vc$(PlatformToolsetVersion).pdb.
Cliffs:任何 DLL/EXE 项目都应避免为其中间和最终(输出)PDB 指定相同的 PDB 文件名。
linker 在这方面可能会更有帮助,也许是在发生用户生成的冲突时发出 link 时间警告。