什么导致我的WP7应用程序崩溃?
我在仿真器和手机上都发生了一些无法解释的崩溃。基本上,当我的应用程序崩溃时,我无法获得任何对话框,并且手机返回到主屏幕。什么导致我的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());
}
的思想发生,我认为它可能有很多涉及到内存,因为我的应用程序交易图片。但我认为这仍然会被我上面未处理的异常代码所捕获。任何想法,我应该如何跟踪这一点,将不胜感激。
这发生在我身上
留意您的内存使用情况。 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();
有几件事情:
- 如果你在做其他事情的线程,然后在这些线程IIRC异常会导致应用程序只是终止。您可能想要将新线程代码包装在异常处理程序中,该异常处理程序将异常传播到UI线程中
- 如果您的应用程序在加载第一个页面之前抛出了异常,那么可能会导致应用程序死掉而没有适当的处理程序叫
- 如果你已经有了一个
StackOverflowException
,这是不能被捕获并只会让应用程序炸弹
你可能想添加一些调试集结只持续记录(加载和内显示的应用程序本身),以便更容易地确定应用程序的上一次运行在崩溃之前有多远。
我发现线程我刺激性的源在异常处理方面导致应用程序关闭。我还建议添加一个可以附加的调试对象或记录器,以便记录应用程序崩溃之前发生的情况。 – deanvmc 2010-11-21 19:47:49
谢谢乔恩。很奇怪有多少异常没有被未处理的异常处理程序捕获。希望微软能够在某个时候解决这个问题。现在至少我知道要注意什么。我的特殊问题似乎是由于OutOfMemoryException。 – 2010-11-21 22:06:31
可能您的应用被watchdoged的不响应时间过长?也许是由于大量图像的加载时间以及此代码在UI线程上执行。
用户界面响应直到崩溃突然发生。毕竟这似乎是一个记忆问题。 – 2010-11-21 22:03:36
好吧,酷酷的,你的限制是90MB的设备与256MB RAM。除此之外,记忆是你的。 – 2010-11-21 22:20:08
我的应用程序以完全相同的方式崩溃。
我跟踪它在DispatcherTimer滴答处理程序中抛出OutOfMemoryException,尽管问题也可能发生在别处。
但是,并非OutOfMemoryException总是取消您的程序。它不是。我在其他各种处理程序中尝试过,并且它被正确捕获。
我试着将你的代码添加到我的项目中,并且确定在继续使用后发现它消耗了大量内存。崩溃时,我的应用程序使用了超过300 MB的内存。我现在正在研究如何减少内存使用量。 – 2010-11-21 22:01:01
啊哈。我找到了诀窍。在处理图像时,您必须先将其源设置为null,然后将图像本身设置为null,以便通过垃圾回收拾取图像...'LargeImage.Source = null; LargeImage = null;'再次感谢。 – 2010-11-21 22:34:48
我知道这很长时间,但这引起了我的注意。是不是因为有另一个活动图像参考,因此设置image = null不能帮助?很难相信将Source设置为null是必需的。 – 2011-05-24 09:38:27