【问题标题】:Human-readable exception handling in Xamarin.iOS release Appstore appXamarin.iOS 发布 Appstore 应用程序中的人类可读异常处理
【发布时间】:2016-10-12 15:57:03
【问题描述】:

是否有任何“标准”和自动方式从 Xamarin.iOS 发布 Appstore 应用程序获取堆栈跟踪?

很久以前,当我在 Xcode 中编写原生 iOS 4.0 应用程序时,从发布二进制文件中获取异常堆栈跟踪存在一个巨大的问题:应用程序将非符号堆栈发送到我的服务器,我下载了它们,解析了 dSYM 文件并用真实的方法替换地址。甚至为此编写了 java 助手。但它是一个脆弱的构造(几种架构,更新二进制格式等),很久以前我发现它不再正常工作了。这不是必需的,我只是忘记了。

在 android 和 Win/Wp 中,我得到了托管堆栈,因为我需要了解主要在我的 C# 代码中的错误。

但现在我在 VisualStudio 中使用 Monogame 和 Xamarin.iOS 编写了一个应用程序:

            AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
            {               
                Ut.saveStringToFile("exceptions.log", args.ExceptionObject.ToString());
            };

但在 Xamarin.iOS 应用程序中,我发现我不能有开箱即用的堆栈:即使在发布版本的模拟器上,也删除了一些行(尽管我在发布版本中关闭了 LLVM 和优化)其他指向一些地址。

现代程序员如何从 Xamarin.iOS 应用程序中获取堆栈?没有隐藏的 api(我打算将应用发布到 Appstore)和 testflight(对于免费的应用所有者来说,现在使用第三方服务可能太贵了)。

【问题讨论】:

    标签: c# ios exception-handling xamarin.ios


    【解决方案1】:

    令人惊讶的是它已经足够了:

            try
            {
                AppDomain.CurrentDomain.UnhandledException += (sender, args) =>
                {
                    Exception e = args.ExceptionObject as Exception;
                    String s = (e!=null) ? ("Error Handled: " + e.Message + "\n" + e.StackTrace) :
                        ("Error Handled (not Exception): " + args.ExceptionObject.ToString());
                    Ut.saveStringToFile("exceptions.log", s);
    
                };
            }
            catch (Exception)
            {
            }
    

    在项目设置中(至少我为临时构建所做的):iOS Build-> enable debugging,Build->Optimize code = off,Build->Advanced->DebugInfo = Full。

    在崩溃后的 exceptions.log 中,我得到带有行号的堆栈跟踪。 我在关闭这些调试设置的情况下使用 Hockeyapp,但提供了 dSym。不知道我为什么要使用曲棍球应用程序(即使是免费的),因为它会产生与简单处理程序相同的堆栈。我自己编写的在线 bugtracker 比巨大的 msft 结构更简单,但也可以存储/搜索/排序堆栈。 没有奇迹。唉。

    问题仍然是:如何查看发布的 AdHoc/AppStore 二进制文件堆栈中的行号? (dSym 只处理本机代码,有关托管代码的调试信息在 pdb 中)

    【讨论】:

      【解决方案2】:

      Microsoft 的 HockeyApp 与 Xamarin 配合良好,最多可免费用于 2 个应用程序。它包括测试分发和崩溃报告和分析。

      【讨论】:

      • 我不处理第三方服务,它们不可靠。我有完整的网络服务堆栈(数据存储,分析,跟踪,消息传递,反馈,IAP,安全等)为android和win / wp自制,只有我可以更改数据格式或其他东西,所以没有依赖。处理所有此类依赖项作为第三方服务非常困难和紧张,我使用 Xamarin.iOS 只是因为在 xcode 中使用单独的开发人员,系统的整体复杂性变得太大而无法仅由一个人控制。第三方增加了这种复杂性以及外部因素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多