【问题标题】:Performing one last TFLog when the app crashes by SIGSEGV当应用程序因 SIGSEGV 崩溃时执行最后一个 TFLog
【发布时间】:2014-06-05 03:42:59
【问题描述】:

TestFlight 一直在给我一些SIGSEGV 崩溃报告。

我找到了一种方法来查明确切的问题。但是,要做到这一点,我需要在崩溃的那一刻执行最后一个TFLog,其中将包含帮助我找到罪魁祸首代码的重要信息(因为目前 TestFlight 的回溯对我来说毫无用处)。

我想这确实是可能的 - 毕竟,TestFlight 能够在崩溃时发送崩溃报告。但是哪里?我可以把我的TFLog放在哪里?

【问题讨论】:

    标签: ios objective-c testflight


    【解决方案1】:

    您可以使用sigaction 安装SIGSEGV 处理程序。从处理程序中,您可以记录您需要的内容,然后终止应用程序(例如使用abort())。

    例子:

    void sigsegv_handler(int signo, siginfo_t *info, void *ucontext) {
        /* Inspect info to see where the crash occurred */
    }
    
    /* in main() or another suitable entry point */
    struct sigaction sa;
    sa.sa_sigaction = sigsegv_handler;
    sigfillset(&sa.sa_mask);
    sa.sa_flags = SA_SIGINFO;
    sigaction(SIGSEGV, &sa, NULL);
    

    请注意,sigsegv_handler 可以访问全局变量等,但可能无法轻松访问崩溃堆栈帧的局部变量。如果您明确了需要记录的内容,则可能会弄清楚如何从 SIGSEGV 处理程序中提取该信息。

    还要注意,从技术上讲,从 SIGSEGV 处理程序调用某些函数是不安全的。但是,鉴于整个应用程序即将死机,您不太可能通过调用这些函数使事情变得更糟(除非它们导致死锁,因为您尝试重新获取锁,例如)。然而,值得注意的是,您将希望避免在信号处理程序中调用mallocfree,因为您的程序可能已经在其中任何一个中崩溃,并且您绝对不想在信号处理程序中引起第二个段错误。

    【讨论】:

    • 我的问题是显然我不能在处理程序中做很多事情 - 甚至没有记录:stackoverflow.com/questions/24051879/…
    • @JustKidding:看起来 TestFlight 可能支持 stderr 日志记录。如果是这种情况,您可以尝试写入 stderr(如果必须,请使用 write(STDERR_FILENO, buf, len))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2012-01-29
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多