Xamarin.iOS发布Appstore应用程序中的人类可读异常处理

时间:2016-06-11 23:14:50

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

有没有"标准"以及从Xamarin.iOS发布Appstore app获取堆栈跟踪的自动化方法?

很久以前,当我在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应用程序中获取堆栈?没有隐藏的apis(我计划将应用程序发布到Appstore)和testflight(现在使用第三方服务对于免费应用程序所有者来说可能太昂贵了。)

2 个答案:

答案 0 :(得分: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)
        {
        }

在项目设置中(至少我为adhoc构建做了):iOS Build->启用调试,构建 - >优化代码=关闭,构建 - >高级 - > DebugInfo =完全。

在崩溃后的exceptions.log中,我得到了带有行号的堆栈跟踪。 我已经与Hockeyapp一起玩这些调试设置,但提供了dSym。不知道为什么我应该使用曲棍球应用程序(即使是免费),当它产生像简单处理程序一样的堆栈。我自编的在线bugtracker比巨大的msft构造更简单,但也可以存储/搜索/排序堆栈。 没有奇迹。唉。

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

答案 1 :(得分:0)

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