为啥在同一个 Visual Studio 解决方案中生成 C++ 调试符号不匹配?

Posted

技术标签:

【中文标题】为啥在同一个 Visual Studio 解决方案中生成 C++ 调试符号不匹配?【英文标题】:Why are C++ debug symbols mismatched when generated in the same Visual Studio solution?为什么在同一个 Visual Studio 解决方案中生成 C++ 调试符号不匹配? 【发布时间】:2021-07-05 15:55:17 【问题描述】:

我的 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 分钟前”。我不确定这意味着什么,但这是不同的。

【问题讨论】:

我的猜测是查看 dll 上的时间戳和它所抱怨的 pdb 文件。 我的第二个猜测是确保如果文件具有相同的名称,您不会将多个配置的输出放入同一个文件夹中。我正在讨论 lib、pdb 和 dll 文件。 @drescherjm 时间戳匹配并同时生成。只是为了确保我已经删除了所有内容并从头开始重新编译了几次。没有运气。所有的库和可执行文件都有唯一的名称。 dll的Release配置是否与其调试版本有不同的名称,或者它们在不同的文件夹中,所以没有机会混合调试和发布? 它们位于单独的 Debug 和 Release 文件夹中。文件名也是唯一的。调试文件都有_d 附加到它们的文件名。 【参考方案1】:

库 C 的 CMake 文件(此处称为 foo_client)有这个 sn-p。

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,我转储了.pdb 文件中引用的所有源文件(dbh foo_client.pdb src),并确认该列表缺少foo_client 库中的所有内容。但是,它以某种方式引用了可执行文件中的文件。让我重复一下这个奇怪的东西来强调它。可执行文件的文件以某种方式在库的.pdb.foo_client.pdb 中被引用。我不知道如何将二进制文件链从可执行文件向后传播回库。

如果我将可执行文件重命名为不以“foo_client”作为前缀开头的任何内容,则正确生成了.pdb 文件并且仅引用了foo_client 文件。似乎 Visual Studio 2019 和/或 CMake 3.15 正在进行某种命名模式匹配,导致可执行文件的源文件替换生成的 .pdb 中的库文件。

尽管.pdb 文件已损坏,但库在链接到任何可执行文件时都可以正常执行。无论问题的根本原因是什么,它似乎都与.pdb 文件的生成无关。据我所知,其他一切正常。

【讨论】:

以上是关于为啥在同一个 Visual Studio 解决方案中生成 C++ 调试符号不匹配?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 nuget dll 显示在 Visual Studio 2019 的项目根目录中?

如何确定为啥 Visual Studio 在构建解决方案时可能会跳过项目

为啥 Visual Studio 认为我需要构建项目?

为啥 Visual Studio 2012 找不到我的测试?

为啥 Visual Studio 2010 (msbuild?) 构建速度不快?

Visual Studio Code - 为啥使用工作区而不是标准文件夹?