如何在Silverlight中调试XAML分析错误?

时间:2010-03-05 19:37:56

标签: silverlight debugging xaml silverlight-3.0

我半定期地遇到以下问题:我对XAML或它使用的一些资源进行了更改,当我在调试模式下加载Silverlight项目时,它只能获得旋转的Silverlight加载动画。

我已经尝试将VS08调试器附加到进程,但此时它没有做任何事情(一旦我进入Silverlight但之前没有工作正常。)

根据之前的经验,我注意到当XAML或其中的资源出现问题时会发生这种情况,但到目前为止我唯一的解决办法是逐行剖析代码,直到我发现问题为止。

有没有简单的方法来调试/诊断这些情况?

更新

我在this question找到了一些帮助,但它仍然没有提供调试这些类型问题的好方法。

4 个答案:

答案 0 :(得分:5)

这对调试来说是一个真正的痛苦,但我终于发现问题隐藏在构造函数的深处,我们的一个自定义控件(它正在寻找一个不存在的资源。)真正的问题不在于修复问题但发现它。

我发现IE会响应从Silverlight传递到DOM的异常但你没有在Chrome浏览器中获得相同类型的反馈(我使用过)。这个解决方案实际上有很大帮助(甚至比IE提示)是将App.xaml.cs中的ReportErrorToDOM()方法修改为以下内容:

private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
{
    string errorMsg = String.Empty;
    try
    {
        errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
        errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

        System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
    }
    catch (Exception)
    {
#if DEBUG
        MessageBox.Show(errorMsg);
#endif
    }
}

这使您可以在XAML中找到问题所在的位置。它不是一个理想的调试器,但确实有帮助。

答案 1 :(得分:3)

这不是最终答案,但往往可以提供帮助

在Visual Studio中:

  • 点击调试>例外
  • 点击“查找”并搜索XAML
  • 单击System.Windows.Markup.XamlParseException
  • 旁边的“Thrown”按钮

以调试模式启动项目。任何Xaml异常都将立即显示。有时需要检查内部异常以获取更多信息。

在我最终想出这个之前,我浪费了太多时间!

答案 2 :(得分:1)

这可能不适用,但XAML错误的一个常见原因是由于您使用的转换器中未被捕获的异常作为资源。人们经常忘记在他们的转换器中使用try-catch块,当某些东西爆炸时,你最终不得不逐行剖析你的代码。

而且,请注意这一点,但根据具体情况,您可以将一些XAML复制并粘贴到WPF项目中,并获得更好的错误消息。我自己从来没有依赖这种策略,但最近我从一位经验丰富的WPF / SL开发人员那里听说过它比我聪明得多,所以它可能值得一试。 : - )

答案 3 :(得分:0)

Per microsoft:此时的最终用户无法调试XAML Parser,只有MS可以执行此操作。 Silverlight 4 XAML Parser的新版本已经使用托管代码完全重写,并且它们将为我们提供更好的调试方法。我知道这一点,因为我遇到了一个问题,并打开了一个支持案例,并通过Silverlight Dev获得了通知。

我能看到解析器正在发生的事情是使用Silverlight Spy:

http://firstfloorsoftware.com/silverlightspy/download-silverlight-spy/

很棒的工具。