对于C#dll,"为ngen二进制文件跳过加载符号"

gbj*_*anb 10 c# debugging mixed-mode visual-studio-2013

我正在尝试从本机C++可执行文件调试C#dll.我有一个C#COM对象,通过IDispatch从本机代码加载和运行.一切都是在Debug中构建的,包括C#和C++代码.虽然我可以看到所有的c ++代码,并且所有的c ++ dll都加载了符号并可用于调试,断点等C#代码拒绝播放.

我所看到的是C#dll都拒绝加载它们的符号pdbs,在模块窗口中报告"跳过ngen binary的加载符号".

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

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

这是使用Visual Studio 2013u4.是否有启用混合模式调试的设置?一个问题是本机代码是使用VS2010构建的.


调试外部进程时输出模块

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

附加到进程后的模块输出

这是模块窗口 - 注意EvCom dll(COM对象)的第3个条目,我假设它是启用调试的条目.

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

'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Unloaded 'C:\...\lib\debug\EvCom.dll'
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
Run Code Online (Sandbox Code Playgroud)

有一点感兴趣 - 我在调试设置中检查了"使用托管兼容模式",并且在开始调试时仍然没有加载我的符号,它只在模块列表中显示1个条目.这次为C#dlls说"符号文件中没有原生符号".

看起来问题是无法在VS2013(或2012)中选择调试器类型.这篇连接文章通过一些解决方法建议其"按设计".

gbj*_*anb 7

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

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

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

解决方案要么重建为.net 4,要么启动本机可执行文件并附加到它(您可以选择调试器类型,'旧'.net或'新'.net)或者您可以从中创建项目可执行文件并设置其调试设置以指定正确的调试程序.

我觉得烦人的是,微软可以很容易地使用您正在调试的项目中指定的.NET框架类型启动调试器(毕竟,在调试dll并指定外部程序时,您仍然希望调试dll''重新按F5,所以你知道要使用什么调试器!)(更令人讨厌的是,一旦在加载的dll中启动了托管调试,你就可以进入使用旧版.net框架构建的项目而没有问题).

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