【问题标题】:What cause info can be readily collected in an iOS signal handler?在 iOS 信号处理程序中可以轻松收集哪些原因信息?
【发布时间】:2013-01-14 19:16:03
【问题描述】:

我正在尝试向应用程序添加一些崩溃日志记录,并且我设置了一个 signal 处理程序来捕获标准的“致命”信号。我可以在信号处理程序中实际/简单地收集哪些“原因”信息(如果有)以进行日志记录?

(我花了大约 2 个小时在 Google 上搜索东西,但我发现的大部分内容都是针对其他环境的,而且太复杂以至于不可靠。我正在寻找简单易行的方法,特别是在 iOS 环境中。)

(我已经有一个 Objective-C 异常处理程序来捕获 Objective-C 异常。)

【问题讨论】:

    标签: ios signals error-logging


    【解决方案1】:

    请不要这样做。正如 Landon Fuller 在此强调的那样,要进行适当和安全的崩溃报告非常困难:http://landonf.bikemonkey.org/code/objc/Reliable_Crash_Reporting.20110912.html

    简而言之:您只能在应用崩溃时使用异步安全代码,因此调用任何 Objective-C 方法默认情况下都是不安全的!

    宁可使用现有的崩溃报告库,如 PLCrashReporter 或其他已经存在的库或服务:https://code.google.com/p/plcrashreporter/

    【讨论】:

    • 如果你搞砸了,最糟糕的情况是什么?
    • 链接的文章在“首先,不要伤害”部分下方说明了其中一些,例如“这可能会导致进程死锁并导致挂起,从而导致无法报告崩溃。在病态在这种情况下,这可能会导致用户数据损坏。”我怎么强调都不为过:如果您不是该领域的专家,请不要自己做。
    【解决方案2】:

    您可以通过以下方式获取堆栈跟踪:

    + (NSArray *)backtrace {
        void* callstack[128];
        int frames = backtrace(callstack, 128);
        char **strs = backtrace_symbols(callstack, frames);
    
        int i;
        NSMutableArray *backtrace = [NSMutableArray arrayWithCapacity:frames];
        for (i = 0; i < XXX; i++) {
            [backtrace addObject:[NSString stringWithUTF8String:strs[i]]];
        }
        free(strs);
    
        return backtrace;
    }
    

    【讨论】:

    • 根据我的阅读,不能保证信号处理程序与raise 在同一个线程中运行。
    • 是的,在一个示例中,它转储了错误的线程。但这是一个好的开始。
    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多