2010-11-21 91 views
2

我在仿真器和手机上都发生了一些无法解释的崩溃。基本上,当我的应用程序崩溃时,我无法获得任何对话框,并且手机返回到主屏幕。什么导致我的WP7应用程序崩溃?

我有下面的代码显示一个MessageBox但这在某种程度上被绕过...

// Code to execute if a navigation fails 
private void RootFrame_NavigationFailed(object sender, NavigationFailedEventArgs e) 
{ 
    MessageBox.Show(e.Exception.ToString()); 
} 

// Code to execute on Unhandled Exceptions 
private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show(e.ExceptionObject.ToString()); 
} 

的思想发生,我认为它可能有很多涉及到内存,因为我的应用程序交易图片。但我认为这仍然会被我上面未处理的异常代码所捕获。任何想法,我应该如何跟踪这一点,将不胜感激。

这发生在我身上

回答

5

留意您的内存使用情况。 OutOfMemoryException会在不调用Application_UnhandledException处理程序的情况下崩溃您的应用程序。 您可以使用某些内置方法检查当前的内存使用情况。我的博客上讲述这一段时间以前http://kodierer.blogspot.com/2010/09/windows-phone-memory-constraints.html

这里是基本的代码,你应该加上:

var timer = new DispatcherTimer {Interval = TimeSpan.FromSeconds(2)}; 
timer.Tick += (s, e) => 
{ 
    var memuse = (long)DeviceExtendedProperties.GetValue("ApplicationPeakMemoryUsage"); 
    var maxmem = (long)DeviceExtendedProperties.GetValue("DeviceTotalMemory"); 
    memuse /= 1024 * 1024; 
    maxmem /= 1024 * 1024; 
    MyTextBlock.Text = String.Format("Mem usage: {0}/{1} MB", memuse, maxmem); 
}; 
timer.Start(); 
+0

我试着将你的代码添加到我的项目中,并且确定在继续使用后发现它消耗了大量内存。崩溃时,我的应用程序使用了超过300 MB的内存。我现在正在研究如何减少内存使用量。 – 2010-11-21 22:01:01

+0

啊哈。我找到了诀窍。在处理图像时,您必须先将其源设置为null,然后将图像本身设置为null,以便通过垃圾回收拾取图像...'LargeImage.Source = null; LargeImage = null;'再次感谢。 – 2010-11-21 22:34:48

+0

我知道这很长时间,但这引起了我的注意。是不是因为有另一个活动图像参考,因此设置image = null不能帮助?很难相信将Source设置为null是必需的。 – 2011-05-24 09:38:27

5

有几件事情:

  • 如果你在做其他事情的线程,然后在这些线程IIRC异常会导致应用程序只是终止。您可能想要将新线程代码包装在异常处理程序中,该异常处理程序将异常传播到UI线程中
  • 如果您的应用程序在加载第一个页面之前抛出了异常,那么可能会导致应用程序死掉而没有适当的处理程序叫
  • 如果你已经有了一个StackOverflowException,这是不能被捕获并只会让应用程序炸弹

你可能想添加一些调试集结只持续记录(加载和内显示的应用程序本身),以便更容易地确定应用程序的上一次运行在崩溃之前有多远。

+0

我发现线程我刺激性的源在异常处理方面导致应用程序关闭。我还建议添加一个可以附加的调试对象或记录器,以便记录应用程序崩溃之前发生的情况。 – deanvmc 2010-11-21 19:47:49

+0

谢谢乔恩。很奇怪有多少异常没有被未处理的异常处理程序捕获。希望微软能够在某个时候解决这个问题。现在至少我知道要注意什么。我的特殊问题似乎是由于OutOfMemoryException。 – 2010-11-21 22:06:31

0

可能您的应用被watchdoged的不响应时间过长?也许是由于大量图像的加载时间以及此代码在UI线程上执行。

+0

用户界面响应直到崩溃突然发生。毕竟这似乎是一个记忆问题。 – 2010-11-21 22:03:36

+0

好吧,酷酷的,你的限制是90MB的设备与256MB RAM。除此之外,记忆是你的。 – 2010-11-21 22:20:08

1

我的应用程序以完全相同的方式崩溃。

我跟踪它在DispatcherTimer滴答处理程序中抛出OutOfMemoryException,尽管问题也可能发生在别处。

但是,并非OutOfMemoryException总是取消您的程序。它不是。我在其他各种处理程序中尝试过,并且它被正确捕获。

我已经张贴a blog entry about lost exceptions here

相关问题