Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C dll的“跳过ngen二进制文件的加载符号” 我试图从一个本地C++执行文件调试一个cdll。我有一个通过IDispatch从本机代码加载和运行的C COM对象。所有的东西都是在调试中构建的,C代码和C++代码都是。虽然我可以看到所有的C++代码,所有C++的DLL都有自己的符号,可以用于调试、断点等。C代码拒绝播放。_C#_Debugging_Visual Studio 2013_Mixed Mode - Fatal编程技术网

C# C dll的“跳过ngen二进制文件的加载符号” 我试图从一个本地C++执行文件调试一个cdll。我有一个通过IDispatch从本机代码加载和运行的C COM对象。所有的东西都是在调试中构建的,C代码和C++代码都是。虽然我可以看到所有的C++代码,所有C++的DLL都有自己的符号,可以用于调试、断点等。C代码拒绝播放。

C# C dll的“跳过ngen二进制文件的加载符号” 我试图从一个本地C++执行文件调试一个cdll。我有一个通过IDispatch从本机代码加载和运行的C COM对象。所有的东西都是在调试中构建的,C代码和C++代码都是。虽然我可以看到所有的C++代码,所有C++的DLL都有自己的符号,可以用于调试、断点等。C代码拒绝播放。,c#,debugging,visual-studio-2013,mixed-mode,C#,Debugging,Visual Studio 2013,Mixed Mode,我看到的是,C DLL都拒绝加载其符号PDB,并在“模块”窗口中报告跳过加载ngen二进制文件的符号 顺便说一句,我正在调试C解决方案,我已经在COM项目的调试设置中将本机可执行文件设置为“启动外部程序” 现在我可以启动C++可执行文件,然后附加到它,然后所有的工作都如我所期望的——符号加载,我可以在C.中设置断点。 这是使用Visual Studio 2013u4。是否有启用混合模式调试的设置?一个小问题是本机代码是用VS2010构建的 这里是模块窗口-注意所有PDB和DLL都在一个目录中,你

我看到的是,C DLL都拒绝加载其符号PDB,并在“模块”窗口中报告跳过加载ngen二进制文件的符号

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

现在我可以启动C++可执行文件,然后附加到它,然后所有的工作都如我所期望的——符号加载,我可以在C.

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

这里是模块窗口-注意所有PDB和DLL都在一个目录中,你可以看到C++的DLL加载,但不是C的。 这是模块窗口-注意EvCom dll的第三个条目COM对象,我假设它是启用调试的条目

输出窗口中没有任何有趣的内容,在加载COM dll时,我看到了以下内容:在“附加到正在运行的进程”的情况下,另一个只加载了2行,而不是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'. 
有趣的是,我在调试设置中检查了使用托管兼容性模式,虽然它在开始调试时仍然没有加载我的符号,但它在模块列表中只显示了一个条目。这一次表示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”,或者您可以从可执行文件创建项目并设置其调试设置以指定正确的调试器

我感到恼火的是,Microsoft可以轻松地使用您正在调试的项目中指定的.NET framework类型启动调试器毕竟,在调试dll和指定外部程序时,您仍然希望调试按F5键的dll,因此您知道要使用哪种调试器!更令人恼火的是,一旦在加载的dll中启动托管调试,您就可以毫无问题地进入使用旧的.net框架构建的项目


有关文章的更多详细信息

如果解决方案中还没有可执行文件,请选择“文件>添加>现有项目”,然后右键单击并将其设置为启动项目


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

在我的例子中,我有自己的符号服务器和TFS,所以
已启用选项工具>选项>调试>常规>启用源服务器支持和三个子选项。

对于我来说,is正在调试Xamarin表单中的UWP应用程序:

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

解决方案:
取消检查调试= > Geult= >启用我的代码< /P>右击您的C++项目、属性、调试、调试器类型=混合。没有C++项目,我正在调试VS2013中的C项目,并且没有这样的设置,原生项目是外部构建的,而不是作为项目在VS中引用的。我可以看到所有C++代码是…那就奇怪了。您必须已经启用混合模式调试,只能查看C++代码。关注关于ngen二进制文件的古怪警告,这是不正常的。您不应该删除调试代码。运行ngen/uninstall来摆脱它。我知道,c代码不是ngen。注意只要我附加到exe而不是自动启动它,vs2013就会调试C代码。我假设它是在本机调试模式下启动的,因为启动程序是本机的,即使我只调试C项目,但我看不出为什么或如何更改它。@HansPassant谢谢,看起来您在启动调试时不能再选择调试器类型了。.NET4.0引入了一个变化。您是否阅读了比Hans Passant更多的评论?请查看已接受的答案,了解您的答案不正确的原因。@gbjbaanb-我有一个问题。我用谷歌搜索了一下。我找到了这一页。对我有效的解决方案
他在评论中说。评论是暂时的,因此我将其复制到了一个答案中,以确保将来人们可以使用它。你的答案在很大程度上解释了原因,但解决问题的真正关键还不清楚。现在再看一遍,我发现答案是将其调试设置设置为指定正确的调试器,但是如果没有Hans Passant的评论,我不知道在哪里设置调试设置,也不知道正确的调试器是什么。也许因为我的情况与你的略有不同,因为我已经从可执行文件创建了一个项目,所以我应该问一个新问题,并在上面发布这个答案。但我认为那会浪费每个人的时间。