【问题标题】:Visual Studio 2015: I can't debug and use breakpoints in Release modeVisual Studio 2015:我无法在发布模式下调试和使用断点
【发布时间】:2017-02-15 17:36:37
【问题描述】:

我开发了一个 UWP 应用,它使用了很多 NuGet 包MvvmLight、SQLite、...)和其他 >资源Syncfusion 控件)。

我在 Store 应用程序中遇到了一个错误,该应用程序已发布用于测试,当我在“Debug”模式下构建应用程序时不存在该错误。 p>

所以,我尝试在“Release”模式下进行调试,选中“Compile with .NET Native tool chain”和“Optimize”选项代码”。构建成功结束,但我在应用程序的主页上遇到了 Syncfusion 控件 (SfDataGrid) 的异常。我想使用断点来了解会发生什么,但是当我在“发布”模式下构建应用程序时它们被停用了。

如果我在“调试”模式下构建应用程序,并选中相同的选项(“使用 .NET Native 工具链编译”和“优化代码” "),我没有遇到与 Syncfusion 控件相同的错误,并且定义的 断点 保留得很好。

所以我不知道如何解决我的问题:

  • 如果我创建一个新解决方案并在“发布”模式下构建它,断点会得到很好的保留,我可以调试代码
  • 如果我在“发布”模式下构建 Syncfusion 示例,结果是一样的:断点保存完好,我可以调试代码
  • 我比较了应用的“构建”参数和其他的:它们是一样的
  • 我还查看了 Visual Studio“options”中的“Just-in-Time”页面。我收到以下错误:“另一个调试器已将自己注册为即时调试器。要修复,请启用即时调试或运行 Visual Studio 修复。”。我试图“修复”Visual Studio,但总是一样的......

这里是“选项”设置:

在解决方案中,断点被禁用的结果:

你有什么解释吗?如何在“发布”模式下调试我的应用程序?

[编辑 1]:在进一步调查后添加一些细节

我的应用基于一个类似 Template10 的“模板”,名为 Nentang。项目的结构是相同的,它们共享很大一部分引用或 NuGets 包。 但是,如果我比较“空白”Nentang 的构建结果和我的解决方案,会有一些我不明白的差异:

  • 如上所述,在我的应用程序中,断点和调试在“发布”模式下不起作用,我可以看到几乎所有模块都没有任何“符号文件”:

=> 只有“ntdll.dll”和“KernelBase.dll”链接到本地​​目录中的 pdb 文件:“C:\Users \myname\AppData\Local\Temp\SymbolCache"

  • 在“空白”Nentang 应用程序上,断点和调试在“发布”模式下运行良好,我可以看到几乎所有模块都有一个“符号文件”:

=>所有一半的模块都链接到“project”目录中的同一个文件:“C:\Projects\Samples... \Nentang.UWP\bin\x64\Release\AppX\Nentang.UWP.pdb"

=> 另一个 四分之一的模块 链接到“system”目录的同一文件:“C:\Program Files (x86)\ Microsoft SDKs\Windows Kits\10\ExtensionSDKs\Microsoft.NET.Native.Framework.1.3\1.3\x64\ret\Native\SharedLibrary.pdb"

=> 其他模块未链接到符号文件:“ntdll.dll”和“KernelBase.dll

就是这种情况

如何恢复我的项目的“符号文件”?

我还在我的解决方案的属性中注释了一个“奇怪”的参数,不存在的是 Nentang 属性: 有这个参数:“f:\dd\ndp\fxcore\CoreRT\src\System.Private.CoreLib\src\System\Runtime\ExceptionServices\ExceptionDispatchInfo.cs

这是什么意思?它可以解释我的问题吗?

【问题讨论】:

  • 当您将鼠标悬停在禁用的断点上时,IDE 将显示带有附加信息的工具提示。我猜你没有生成调试信息(PDB 文件)。 PDB 需要将源代码位置映射到二进制文件中的地址。
  • 感谢您的反馈@IInspectable。错误是“当前不会命中断点。没有为此文档加载任何符号。”。但是这怎么可能,知道构建参数在不同的项目中是相同的呢?
  • 如果未加载调试符号,则它们要么位于调试器不查找它们的位置,要么不存在。发布配置通常不会构建调试信息。请参阅Specify Symbol (.pdb) and Source Files in the Visual Studio Debugger 了解更多信息。
  • 我尝试清理解决方案,并删除每个项目的 bin/object 文件夹,但问题始终相同。我会看看你的链接,看看它是否有助于我理解问题。
  • @IInspectable 我无法解决我的问题,但我在主要描述中添加了一些关于“模块”的详细信息。这能帮助你给我回复吗?

标签: c# debugging uwp release breakpoints


【解决方案1】:

调试优化代码始终是一项挑战——对于 .NETNative 更是如此。以下是您可以尝试的一些方法:

  • 仅禁用我的代码
  • 抑制 JIT 优化:这对使用 .NETNative 工具链构建的模块没有帮助。如果在没有 .NETNative 的发布版本中出现异常,请检查名为“Suppress JIT optimization on module load (Managed Only)”的调试器选项。顾名思义,这将导致 CLR JIT 编译未优化的代码,这将允许您设置断点并检查本地。
  • 查看“输出”窗口以获取有关问题所在的线索。异常消息将在那里,前面的消息可能有助于诊断原因。
  • 使用本机调试引擎调试您的应用程序。您可以通过选中项目属性的“调试”选项卡下的“本机”复选框来执行此操作。
  • 最后的手段是调试程序集。

【讨论】:

  • 感谢您的反馈。关于你的建议。 Just my code 已被禁用。我已经使用Native toolchainDebug 模式下进行了调试,并且在Store 应用程序上遇到的问题不一样:这对我没有帮助。在Release Output windows 并没有真正提供有关我的问题的更多详细信息:Loaded 'C:\Windows\SysWOW64\globinputhost.dll'. Skipped loading symbols. Module is native, and native debugging is currently disabled. Unhandled exception at 0x103773C8 (Windows.UI.Xaml.dll)
  • 如果 .NET Native toolchain 未选中,则在 Release 模式下不会发生异常:在这种情况下,断点也可用。所以抑制JIT Optimizations不是有用吗?
  • 正确,此问题仅在使用 .NETNative 工具链的发布版本中出现。不幸的是,您唯一的选择是使用本机引擎和/或程序集级调试进行调试。祝你好运。
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 2018-04-28
  • 1970-01-01
相关资源
最近更新 更多