25

因此,我在 C#(以及一般的 .NET/Visual Studio)中迈出了第一步,首先编写了一个简单的拼图作为可移植库,并为不同的目标平台编写 UI。我从控制台 UI 开始,然后转到 WPF 应用程序。然后我尝试了“Windows Store”,在大多数情况下,我可以复制 WPF 代码并更改一些命名空间和方法签名。

但是有些东西的行为确实有点不同,我花了一个多小时的谷歌搜索才得到它给我关于我所遇到的坠机的任何信息。因此,例如,如果我在传统的 WPF 应用程序中做这样的事情:

Storyboard.SetTargetProperty(animation, 
     new PropertyPath("{Canvas.MispelledProperty}"));

我在引发异常的确切位置得到一个 .NET 异常。如果我在 Windows Store App 中犯了同样的错误,我看到的就是这个

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException += (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
#endif

(编辑:这是在一个名为的文件中App.g.i.cs

然后我必须仔细查看输出才能找到

WinRT information: Cannot resolve TargetProperty (Canvas.MispelledProperty) on specified object.

现在在某些情况下,这可能就足够了,但是我真的很难相信这就是你所能得到的。我遇到了一些与 Storyboar 工作方式中的细微差别有关的问题,很容易解决(直接附加到动画的已完成事件,而不像 WPF 对应项中那样被触发),但现在我对这个错误完全一无所知:

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred

只是由于疯狂点击造成的,这也会导致整个应用程序崩溃。

PointerPressed现在我的应用程序真的很琐碎,它可能与我处理PointerReleased事件的方式有关,但没有更好的开始真的很令人沮丧。

所以我想实际的问题是:它真的应该是这样的还是我可以配置调试器来给我更多有用的信息?如果不是那么:你们在开发 Windows 应用商店应用程序时使用什么样的调试技术/解决方法?

更新:

好吧,起初我认为这只发生在与 WinRT 相关的异常上,即发生在 CLR 之外的地方以及没有正确包装的地方,但事实证明,所有未处理的异常都将您带到 App.g.i.cs而不是它们发生的地方。例如,我故意尝试在一个方法中访问其范围之外的列表,以查看在引发异常时 Visual Studio 是否会将我带到那里,但它却再次将我带到App.g.i.cs. 在当地人中,我得到了这个Windows.UI.Xaml.UnhandledExceptionEventArgs消息字符串有一些看起来几乎像堆栈跟踪但没有行号的信息。这是我故意错误的示例:

System.ArgumentOutOfRangeException
   at System.ThrowHelper.ThrowArgumentOutOfRangeException()
   at System.Collections.Generic.List`1.get_Item(Int32 index)
   at StorePuzzle.PuzzleRenderer.HandleTileReleased(Object sender, PointerRoutedEventArgs e)

我想要的只是 Visual Studio 立即将我带到引发异常的地方,而不是App.g.i.cs像在“非商店应用程序”中那样带我去。现在,那个编译器预处理器指令让它看起来我可以关闭它(#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION)但是谷歌搜索它并没有向我展示任何这样做的方法。

4

4 回答 4

4

当您知道要查找的特定异常类型时,在代码中调试异常很容易。

Debug然后Exceptions从菜单中选择(或Ctrl+D Ctrl+E

搜索您的特定异常并检查thrown.

调试器将在发生异常的代码行处停止。

我通常会打开大多数异常以尽早发现问题。

不过,XAML 中的错误是另一回事,有时很难找到。

于 2014-04-12T08:26:31.487 回答
4

我自己有一个关于获取堆栈跟踪和转储的非常相似的问题,我在这里问过:如何从用 C# 编写的 WinRT 应用程序获取崩溃日志和堆栈跟踪?.

与 Android 相比,Microsoft 使得从 WinRT 应用程序获取崩溃信息变得非常困难。与 Android 不同,没有像 logcat 这样的内置日志,您可以在其中通过简单的堆栈跟踪查看应用程序崩溃的原因。Android 将其提供给开发人员,并且不要求他们编写任何代码!

对于 WinRT 应用程序 看起来我们都必须推出自己的解决方案来解决这个问题。有很多不同的地方可能会发生异常,如果您想将它们全部记录下来——如果你不把它们全部记录下来,那么记录异常的意义何在——看起来这将是很多工作!

本文对如何捕获 XAML 异常进行了一些解释,以便您可以记录它们:

本文解释了为什么需要使用 try/catch 将所有代码包装在异步事件回调中:

这个库看起来是进行日志记录的好选择,虽然它看起来有点重,因为它依赖于 SQLite,如果有一个更轻的选择确实需要一个可能是首选的数据库。

更新:

Microsoft 在 Windows 8.1 中宣布了一些新的日志记录功能,文档现在在这里:

http://msdn.microsoft.com/en-us/library/windows/apps/windows.foundation.diagnostics.loggingchannel

于 2013-04-26T20:34:04.427 回答
1

关于 ArgumentOutOfRangeException:Visual Studio 中的调试器对不同类型的异常有特殊选项,您需要确保为您的异常类型选中“抛出”(您可以在您的情况下选择所有公共语言运行时异常)http://msdn .microsoft.com/en-us/library/d14azbfh.aspx

关于 WinRT:对于 WinRT,我想情况会有所不同。我不是真正的 WinRT 专家,但在我看来,Windows 实际上以不同于 WPF 的方式使用 XAML。Windows 执行大多数异步工作(例如生成控件、解析 XAML 等)。因此,这就是为什么大多数情况下您会从 XAML 中获取异常,而不是在您尝试设置属性的地方,而是作为未处理的异常。

于 2013-04-01T15:51:29.313 回答
-1

VS2012中的本地人

如果您查看 Visual Studio 2012 中的“Locals”窗格,您会在调用异常时注意到一个名为 $exception 的值。如果您深入研究它,您可以找到有关该问题的各种信息。

于 2013-01-28T04:11:56.747 回答