“为ngen二进制文件跳过加载符号”for C#dll

我试图从本机C ++可执行文件调试C#DLL。 我有一个C#COM对象,通过IDispatch从本地代码加载并运行。 所有内容都以Debug,C#和C ++代码构建。 虽然我可以看到所有的c ++代码,并且所有的c ++ dll都有它们的符号加载并可用于调试,断点等,但C#代码拒绝播放。

我所看到的是,C#dll都拒绝加载它们的符号pdbs,在模块窗口中报告“ngen二进制的加载符号跳过”。

顺便说一句,我在这里调试C#解决方案,我已经将本机可执行文件设置为COM项目的调试设置中的“启动外部程序”。

现在我可以启动C ++可执行文件,然后附加到它,然后按我的预期工作 - 符号加载并可以在C#中设置断点。

这是使用Visual Studio 2013u4。 有没有启用混合模式调试的设置? 一个小问题是本机代码是用VS2010编译的。


在调试外部进程时输出模块

这里是模块窗口 - 注意所有的pdbs和dll都在一个目录中,你可以看到加载的c ++ dll,但不是C#的。

模块在附加处理后输出

这里是模块窗口 - 注意EvCom dll(COM对象)的第三个条目,我认为它是启用调试的条目。

在输出窗口中没有任何兴趣,当涉及到加载COM DLL时,我看到以下内容(在附加到运行进程的情况下,另一个只有2个加载行而不是3个)。

'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'. 
'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'. 
'Explorer.exe' (Win32): Unloaded 'C:...libdebugEvCom.dll'
'Explorer.exe' (Win32): Loaded 'C:Dev...libdebugEvCom.dll'. 

感兴趣的一件事 - 我检查了调试设置中的“使用托管兼容模式”,并认为它在启动调试时仍然不加载我的符号,它只在模块列表中显示1个条目。 这次说C#dll的“符号文件中没有本地符号”。

看起来问题是无法在VS2013(或2012)中选择调试器类型。 这篇连接文章提出了其“通过设计”以及一些解决方法。


事实证明,这完全取决于.NET 4.0的调试引擎的变化

.NET 4和更高版本使用与.net 3.5及更低版本不同的调试引擎,当您开始调试本机应用程序时,调试器将为您选择一个.net调试器(默认为.net 4.0),并且如果.net dll是使用这个平台,一切都会很好 - 断点会受到打击。

如果你的加载的dll是.net 3.5,那么调试引擎将不理解加载的dll,并且会拒绝加载符号或调试。

这些解决方案要么重建为.net 4,要么启动本机可执行文件并附加到它(您可以在其中选择调试器类型,既可以是'old'.net也可以是'new'.net),或者您可以从可执行文件并将其调试设置设置为指定正确的调试器。

我发现令人讨厌的是,微软可以很容易地使用您正在调试的项目中指定的.NET框架类型启动调试器(毕竟,在调试dll并指定外部程序时,您仍然想调试dll,重新按F5键,所以你知道使用什么调试器!)(更令人讨厌的是,一旦托管调试开始在一个加载的DLL,然后你可以步入到使用旧的.net框架构建的项目没有问题)。

有关此Microsoft连接文章的更多详细信息


(如果您的可执行文件尚不在您的解决方案中,请点击文件>添加>现有项目,然后右键单击并将其设置为启动项目。)

用鼠标右键单击您的启动项目,属性,调试,调试器类型=混合。


在我的情况下,我有自己的符号服务器和TFS,所以我启用了选项工具>选项>调试>常规>“启用源服务器支持”和三个子选项。

链接地址: http://www.djcxy.com/p/74535.html

上一篇: "skipped loading symbols for ngen binary" for C# dll

下一篇: PDB Files won't load for some projects