混合模式程序集未加载本机 C++ pdb 的符号

Posted

技术标签:

【中文标题】混合模式程序集未加载本机 C++ pdb 的符号【英文标题】:Mixed mode assembly not loading symbol for native C++ pdbs 【发布时间】:2011-03-20 12:41:47 【问题描述】:

我正在使用 C++/CLI 中的混合模式程序集。所有托管模式组装的 pdb 在混合模式组装成功时都会被加载,但是即使本地 pdb 的信息显示在模块窗格中(即在 VS Debug->Windows->Modules 中),本地 dll 和 pdb 也不会加载。

我正在使用本机 dll 并在 C++/CLI 代码的混合程序集中调用它的导出函数。在这里,函数被成功调用,但原生 pdb 符号没有加载,原生代码中的所有断点都显示为空心圆圈,并且工具提示说没有为此加载任何符号。

我已经完成了所有工作,将 pdb 放置在托管进程启动的当前目录中;删除所有 obj 和 debug 文件夹并同时重新编译每个项目;我什至使用了 ChkMatch 实用程序,它显示 Exe 中的符号和相应的 pdb 匹配。

在从托管(C++/LCI 混合模式)代码调用时,有什么方法可以启用本机代码的断点?

问候,

乌斯曼

【问题讨论】:

删除标签“winpdb”。 winpdb 是一个 python 调试器——名字特别容易混淆。 【参考方案1】:

混合模式调试可能会被击中和错过,主要是错过。首先检查您是否确实启用了混合模式调试。在 C# 项目中,它是项目 + 属性、调试、启用非托管代码调试复选框。接下来,64 位进程不启用混合模式调试。如果您在 64 位操作系统上运行,请确保强制 .exe 在 32 位模式下运行。项目 + 属性,构建选项卡,平台目标 = x86。

接下来验证调试器在何处查找 .pdb 文件。在 Debug + Windows + Modules 窗口中,右键单击 DLL 并选择“符号加载信息”。最后的喘息是在非托管代码中使用 __debugbreak()。


更新:最新版本的 VS(从 VS2012 开始)有一个新的托管调试引擎,它与非托管调试引擎的兼容性不够。工具 > 选项 > 调试 > 常规,勾选“使用托管兼容模式”。它启用了旧版调试引擎,这是 VS2010 中最后使用的引擎。

【讨论】:

64 位混合模式调试从 .NET Framework 4 开始工作。

以上是关于混合模式程序集未加载本机 C++ pdb 的符号的主要内容,如果未能解决你的问题,请参考以下文章

未加载符号:未​​加载 libmex.pdb(throw_segv_longjmp_seh_filter() = EXCEPTION_CONTINUE_SEARCH:C++ 异常)

无法在 GlowCode x64 中加载符号

C++了解PDB

部分无法查找或打开 PDB 文件

“断点目前不会被击中。没有为此文档加载任何符号。” - .pdb 从错误的地方加载?

在 Visual Studio 中卸载/重新加载符号/pdb