【问题标题】:"skipped loading symbols for ngen binary" for C# dllC# dll 的“跳过加载 ngen 二进制文件的符号”
【发布时间】:2015-01-25 23:39:14
【问题描述】:

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

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

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

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

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


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

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

Output 窗口中没有任何有趣的内容,在加载 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'. 

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

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

【问题讨论】:

  • 右击你的C++项目,属性,调试,调试器类型=混合。
  • 没有C++项目,我在VS2013中调试我的C#项目,那里没有这样的设置,原生项目是外部构建的,没有在VS内部作为项目引用。
  • “我可以看到所有的 c++ 代码”是......那么奇怪。您必须已经启用了混合模式调试,这是查看 C++ 代码的唯一方法。专注于有关 ngen 二进制文件的怪异警告,这是不正常的。你永远不应该调试代码。运行 ngen /uninstall 以摆脱它。
  • 我知道,并且 c# 代码没有生成。注意 vs2013 将调试 C# 代码,只要我附加到 exe 而不是自动启动它。我假设它以本机调试模式启动,因为即使我只调试 C# 项目,启动程序也是本机的,但我看不出为什么或如何改变它。
  • @HansPassant 谢谢,看起来您在开始调试时无法再选择调试器类型。 .NET 4.0 引入的更改。

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


【解决方案1】:

事实证明,这完全取决于 .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 框架没有问题)。

更多详情请参阅this Microsoft connect 文章

【讨论】:

  • 连接链接不再有效
【解决方案2】:

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

右击你的启动项目,Properties,Debugging,Debugger Type = Mixed。

【讨论】:

  • 您是否阅读了比 Hans Passant 的评论更多的内容?查看接受的答案,了解您的答案不正确的原因。
  • @gbjbaanb - 我遇到了问题。我用谷歌搜索了它。我找到了这个页面。 对我有用的解决方案在评论中。评论是暂时的,因此我将其复制到答案中,以确保将来可供人们使用。您的回答在很大程度上涉及为什么,但修复的实际症结尚不清楚。现在再读一遍,我发现答案是“设置它的调试设置以指定正确的调试器”,但如果没有 Hans Passant 的评论,我不知道在哪里设置调试设置或“正确的调试器”是什么。跨度>
  • 也许我的情况与你的情况略有不同(因为我已经从可执行文件创建了一个项目)我应该问一个新问题并在上面发布这个答案。但我认为这会浪费大家的时间。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    对我来说是在 Xamarin Forms 中调试 UWP 应用:

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

    解决方案: 取消选中 Debugging => General => Enable Just My Code

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      相关资源
      最近更新 更多