2

我的 Windows Phone 应用程序有问题。

该应用程序使用所有设备传感器:gps、加速度计和指南针

当我在模拟器中运行它时很好,当我在手机上调试它时很好。

但是当我从设备上拔下 USB 电缆并再次启动应用程序时,它很快就会崩溃,我不知道如何找出原因,因为没有连接调试器。

我该如何调试这样的问题?

4

4 回答 4

2

发生这种情况的原因有很多。如果没有一些调试输出,很难准确指出发生了什么,但这里简要列出了可能的罪魁祸首:

最有可能的...

最有可能导致您的应用程序在非调试模式下崩溃的原因是启动时间过长。我怀疑您可能会遇到这个 SO 问题的全部内容。附加调试器后,运行时会绕过操作系统杀死任何加载时间超过 10 秒的应用程序的功能。这是一件容易测试的事情,只需删除应用程序启动时正在执行的所有代码(我假设您当时正在连接 GPS 内容,只需将这些内容注释掉)。

但另外...

虽然以上可能会解决您的问题,但您必须警惕您可能还会遇到的其他一些问题:

当您访问 GPS / 加速度计 / 指南针时,您必须首先检查这些传感器是否实际可访问并由手机提供。并非所有 Windows 手机都需要提供指南针。查看Windows Phone的硬件规格。如果您尝试访问指南针,而您的设备不支持指南针,那么这可能是您的问题所在。更多细节在这里。以下代码是如何检查设备上是否存在指南针的示例(请注意,即使您的设备关闭了指南针,IsSupported 也会返回 true)。

using Microsoft.Device.Sensors;

public partial class MainPage : PhoneApplicationPage
{
    Compass compass;

    public MainPage()
    {
        if (Compass.IsSupported)
        {
            // awesome. you have a compass
        }
        else
        {
            // uh oh… you have a crappy phone, no compass for you :(
        }
    }
}

您是否尝试过再次打开和关闭它?

您必须考虑的另一件事是您正在使用的设备关闭了 GPS(我敢肯定,比您更大的开发人员犯了更愚蠢的错误)。如果您的 GPS 已关闭或禁用,或者用户(您在那里,拿着设备)没有授权应用程序使用 GPS 数据。请参阅本文以单独处理位置注意事项(如果您正在开发支持 GPS 的 WP7 应用程序,则必须阅读)。

宣布你的意图先生

最后,如果您未在应用程序清单文件中声明您从设备访问的内容,则可能会出现问题。基本上,如果您不将它们声明为您的应用程序使用的项目,您可能会遇到问题。您需要声明您的应用使用什么的原因是,Microsoft 可以适当地过滤/警告/通知从市场下载您的应用的用户您的应用运行所需的信息。

省电模式

当 Windows Phone 处于节电模式时,一些传感器将被关闭以延长电池寿命(例如 GPS、指南针和加速度计)。如果您的设备在插入开发机器时实际上并未充电,则很容易发生这种情况。

总之:

  • 检查您的应用加载时间是否超过 10 秒
  • 确保设备确实支持您尝试访问的传感器
  • 确保传感器返回的数据不会导致您的代码崩溃(例如 GPS 可能已打开,但根据您的代码错误给出一个纬度/经度,导致它崩溃)。
  • 确保在应用程序清单文件中声明用法
  • 确保您的传感器已打开并且您未处于节电模式

希望以上一项或全部可以帮助您诊断问题。如果你发现它是别的东西,让我知道,会很想知道还有什么可能导致这个问题。

于 2012-05-13T22:44:37.857 回答
0

您是否考虑过在可能必须显示特定异常消息甚至堆栈跟踪的任何异常处理代码中添加 MessageBox.Show 方法调用?还可以考虑对 App.xaml.cs 中的 Application_UnhandledException 事件处理程序执行相同的操作。

于 2012-05-11T09:27:34.947 回答
0

您可以做的是将所有调试信息(如 Stacktrace 和消息)写入独立存储中,然后您可以将其显示在单独的页面上。

可能会出现问题,因为如果电话插入,则使用 PC 的 Internet(很长一段时间都存在相同的问题)

于 2012-05-11T09:33:43.210 回答
0

值得使用 Andy Pennell 在他的博客中描述的 Little Watson技术。这会将异常详细信息保存到独立存储中,并在应用程序下次启动时从应用程序中通过电子邮件发送出去。博客中有完整的代码。

如果您想删除电子邮件部分并且只想从开发 PC 的独立存储中手动提取崩溃详细信息,则该代码很容易适应。

于 2012-05-12T07:28:41.650 回答