如何在C#Windows Store(Metro)应用程序崩溃时获取有用信息(如堆栈跟踪)?

Fed*_*ico 25 c# windows-store-apps

所以我在C#(以及一般的.NET/Visual Studio)中完成了我的第一步,并开始编写一个简单的瓷砖拼图作为可移植库,并为不同的目标平台编写UI.我从Console UI开始,转移到WPF应用程序.然后我尝试了"Windows Store",在大多数情况下,我可以复制WPF代码,只需更改一些名称空间和方法签名.

但有些事情确实表现得有点不同,我花了一个多小时的谷歌搜索才得到它给我任何关于我遇到的崩溃的信息.所以,如果我在传统的WPF应用程序中做了类似的东西:

Storyboard.SetTargetProperty(animation, 
     new PropertyPath("{Canvas.MispelledProperty}"));
Run Code Online (Sandbox Code Playgroud)

我在引发异常的确切位置获得了.NET异常.如果我在Windows应用商店应用程序中犯了同样的错误,我会看到这一点

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

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

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

WinRT information: Cannot resolve TargetProperty (Canvas.MispelledProperty) on specified object.
Run Code Online (Sandbox Code Playgroud)

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

A first chance exception of type 'System.ArgumentOutOfRangeException' occurred
Run Code Online (Sandbox Code Playgroud)

只是通过疯狂点击导致,这也导致整个应用程序崩溃.

现在我的应用程序非常简单,它可能与我如何处理PointerPressedPointerReleased事件有关,但是如果没有更好的开始,那真的很令人沮丧.

所以我想实际的问题是:它真的应该是这样的,还是我可以配置调试器给我更多有用的信息?如果没有那样:你们在开发Windows应用商店应用时使用了哪种调试技巧/解决方法?

更新:

好吧,起初我认为这只发生在WinRT相关的Exception上,即在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)
Run Code Online (Sandbox Code Playgroud)

我想要的只是Visual Studio立即将我带到引发异常的位置而不是App.g.i.cs像"非商店应用程序"那样带我去.现在,编译器预处理器指令使它看起来像我可以关闭它(#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION)但谷歌它没有告诉我任何方式这样做.

dan*_*own -1

VS2012中的本地人

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

  • 我没有收到任何名为“$exception”的内容。我所看到的只是“sender”和“e”,这两个参数来自“UnhandledException += (sender, e) =>”中的 lambda。参数 e 的类型为“Windows.UI.Xaml.UnhandledExceptionEventArgs”,堆栈跟踪为“null”。但是`UnhandledExceptionEventArgs`也恰好有一个与异常中相同的消息加上引发异常的方法的名称和签名。我仍然没有得到行号,但这是一个开始。 (2认同)