c++ - 为什么在同一个 Visual Studio 解决方案中生成 C++ 调试符号不匹配?
问题描述
我的 Visual Studio 2019 项目配置有问题,我已经没有办法检查了。我有 3 个本机 C++ 共享库(A、B、C),它们都按顺序堆叠在一起。B 取决于 A。C 取决于 B。然后我将所有 3 个链接到一个可执行文件。所以最终的堆栈看起来像 A->B->C->Executable。所有库和可执行文件都存在于同一个 Visual Studio 解决方案中。所有的代码都是我的。解决方案文件由 CMake 生成。
我可以设置断点并调试到 A、B 和可执行文件就好了。我无法进入库 C,因为符号文件不会加载。模块窗口显示“无法找到或打开 PDB 文件”。搜索路径确实包括项目输出文件夹。当我手动尝试加载自动生成的 library_c.pdb 文件时,我看到一个弹出错误,指出“在此文件夹中找不到匹配的符号文件”。
我尝试删除所有内容并从头开始重新创建环境。我比较了库 C 和其他可调试库之间的所有项目设置,但没有发现明显的差异。我的互联网搜索都说如何手动加载符号或指示错误是因为符号不匹配。我没有找到任何建议自动生成的 pdb 在构建时如何或为什么与相应的 lib 或 dll 不匹配。
鉴于这种情况,您接下来会调查什么?什么可能导致生成的符号文件不匹配?
编辑:drescherjm 建议我仔细检查时间戳。Windows 资源管理器将“修改日期”列为相同。但是,如果我右键单击每个文件并打开属性,我会得到一个有趣的异常。良好工作文件的“已创建”时间戳都有日期和时间 (HH:MM:SS)。坏 library_c.pdb 列出了一个没有时间戳的日期。它不是时间戳,而是“XX 分钟前”。我不确定这意味着什么,但这是有区别的。
解决方案
库 C 的 CMake 文件(foo_client
在此处调用)具有此代码段。
add_library(foo::foo_client ALIAS foo_client)
set_target_properties(foo_client PROPERTIES EXPORT_NAME client)
CMake 中可执行文件的目标名称是foo_client_exec
. 由于我不知道的原因,这会触发损坏的foo_client.pdb
文件。通过使用dbh,我转储了文件dbh foo_client.pdb src
中引用的所有源文件 (),.pdb
并确认该列表缺少foo_client
库中的所有内容。但是,它以某种方式引用了可执行文件中的文件。让我重复一下这个奇怪的东西来强调它。可执行文件的文件以某种方式在库的.pdb.
,中被引用foo_client.pdb
。我不知道如何将二进制文件链从可执行文件向后传播回库。
如果我将可执行文件重命名为不以“foo_client”作为前缀开头的任何内容,则该.pdb
文件已正确生成并且仅引用了这些foo_client
文件。似乎 Visual Studio 2019 和/或 CMake 3.15 正在进行某种命名模式匹配,导致可执行文件的源文件替换生成的.pdb
.
尽管文件损坏.pdb
,但当链接到任何可执行文件时,该库的执行没有问题。无论问题的根本原因是什么,它似乎都与.pdb
文件的生成无关。据我所知,其他一切正常。
推荐阅读
- c++ - c++中的“@”是干什么用的
- node.js - 虽然我删除了数据,但除非我刷新页面,否则我看不到它被删除
- google-cloud-platform - 没有名为 providers.google.cloud.operators.pubsub 的模块:Google Cloud Composer
- postgresql - 选择多行时Postgres慢
- sql - SQL 2014 - 如何为非标识列的每一行添加增量值
- python - 如何对 vaex 中的列进行 json 规范化?
- spring - java.sql.SQLException:不正确的字符串值:'\xCFC\xFB\xC3\xD4U...'
- api - 蒸汽 API 2020
- php - 致命错误:未捕获 PrestaShopException PrestaShop 1.7
- php - Symfony 4 Doctrine 2 findby dosent apply Join 和 custom join 不起作用