Xamarin Forms应用程序崩溃,但没有日志记录。

5

我正在使用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);
        }
        
    }

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


只要您使用 Crashes 类型调用 AppCenter.Start,崩溃就会自动报告到 AppCenter。不需要更多操作。未能进入 AppCenter 的崩溃可能会很棘手,通常是非常难以处理的崩溃,需要访问其发生崩溃的设备的日志。 - Cheesebaron
谢谢。您能给些建议如何访问设备的日志吗?特别是如何提取与我的应用程序相关的日志。 - Vadym
1个回答

2
尝试使用真正的异步事件处理程序。
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方法,而不是一个真正的事件处理程序。这意味着当它被异步执行时,它将变成一个“fire and forget”函数,无法捕获其中可能发生的任何异常。

如果在启动时没有捕获到异常,那么很可能是你在应用程序的其他地方使用了非事件async void,并且未被捕获导致应用程序崩溃。

首先搜索代码中的任何async void,并检查确保它是一个真正的事件处理程序。


很遗憾,应用您的代码后实际上没有任何变化。但也许您可以给我一些线索,如何在设备日志中查找有关我的应用程序崩溃的信息? - Vadym

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接