“为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