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

时间:2014-11-27 11:25:26

标签: c# debugging visual-studio-2013 mixed-mode

我试图从本机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构建的。


Modules output when debugging external process

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

Modules output after attach to process

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

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

'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'. 

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

看起来问题是无法在VS2013(或2012)中选择调试器类型。 This connect article建议"按设计"有一些解决方法。

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

有关this Microsoft connect文章

的更多详情

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对我来说,正在调试Xamarin Forms中的UWP应用程序:

原因: 调试器正在跳过不在.NET环境中的文件。

解决方案: 取消选中调试=>一般=>启用我的代码