【问题标题】:Xamarin Forms Application Crashes without logXamarin Forms 应用程序崩溃而没有日志
【发布时间】:2021-06-22 19:10:21
【问题描述】:

我正在使用具有路由跟踪功能的 Xamarin Forms 开发一些应用程序。当它在车辆上的实际条件下使用时,尽管我正在使用 AppCenter,即在 App.xaml.cs OnStart 中我添加了,但它会在没有任何日志的情况下崩溃

    protected async override void OnStart()
    {
        AppCenter.Start("android=__mycode___" +
                          "uwp={Your UWP App secret here};" +
                          "ios={Your iOS App secret here}",
                          typeof(Analytics), typeof(Crashes));


        bool hadMemoryWarning = await Crashes.HasReceivedMemoryWarningInLastSessionAsync();
        ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

        if (crashReport != null)
        {
            Analytics.TrackEvent(crashReport.StackTrace);
        }
        
    }

事实上,我在 AppCenter 中使用 Crashes.GenerateTestCrash() 测试了我的应用程序并获得了测试崩溃报告。此外,我使用这种方法发现了一些错误。但是现在至少有一个原因导致我的应用程序崩溃而没有任何消息到 AppCenter。有什么线索可以解决这个问题吗?

【问题讨论】:

  • 一旦您使用Crashes 类型调用AppCenter.Start,AppCenter 中应该会自动报告崩溃。你不应该需要更多。没有进入 AppCenter 的崩溃可能会很棘手,通常是非常严重的崩溃,需要访问它崩溃的设备的日志。
  • 谢谢。您能否建议如何访问设备的日志?特别是如何提取与我的应用相关的内容。

标签: forms xamarin crash report


【解决方案1】:

尝试使用实际的异步事件处理程序。

private event EventHandler onStart = delegate { };

protected override void OnStart() {
    onStart += handleStart; //subscribe
    onStart(this, EventArgs.Empty); //raise event
}

private async void handleStart(object sender,EventArgs args) {
    onStart -= handleStart; //unsubscribe
    try {
        AppCenter.Start("android=__mycode___" +
                          "uwp={Your UWP App secret here};" +
                          "ios={Your iOS App secret here}",
                          typeof(Analytics), typeof(Crashes));


        bool hadMemoryWarning = await Crashes.HasReceivedMemoryWarningInLastSessionAsync();
        ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();

        if (crashReport != null) {
            Analytics.TrackEvent(crashReport.StackTrace);
        }
    } catch (Exception ex) {
        //...handle exception or log as needed
    }        
}

OnStart 是一个简单的 void 方法,而不是实际的事件处理程序。这意味着,当它被异步化时,它将成为一个触发后忘记的函数,它不允许您捕获其中可能发生的任何异常。

如果它在启动时没有被捕获,那么它可能意味着您在应用程序的某处使用非事件 async void 执行类似的操作,该事件未被捕获并导致应用程序崩溃。

首先在您的代码中搜索任何async void 并检查以确保它是一个实际的事件处理程序。

【讨论】:

  • 不幸的是,在应用您的代码后实际上并没有发生任何变化。但也许你给我一个线索,如何在设备日志中找到有关我的应用程序崩溃的信息?
猜你喜欢
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2015-02-18
  • 1970-01-01
  • 2020-01-04
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多