如何让Mac OS X CrashReporter调用调试器?

时间:2010-12-25 23:52:58

标签: c apache debugging macos

我在Mac OS X上有一个产生随机崩溃的Apache模块。我可以使用某些操作序列重现这些崩溃,并且这些崩溃会产生Crash Reporter对话框“httpd quit unexpectedly”。有没有办法让Crash Reporter启动调试器(xcode,gdb,nothing)而不是只显示回溯?

我已经尝试在httpd下使用gdb运行httpd -X但是当时没有发生崩溃 - 只有当许多httpd一次运行时才会发生这种情况,我发现没办法一次将gdb附加到所有这些。所以我希望也许我可以让CrashReporter在特定进程崩溃时附加调试器 - 有没有办法做到这一点?

4 个答案:

答案 0 :(得分:2)

不幸的是,您描述的错误类型在受到检查的影响时会消失。

也就是说,尝试的选项是从模块内部启动GDB会话。 QA1573有一个使用DTrace的例子,它看起来有点干净,但经过一些实验后,这似乎并不适用于多个进程。 (在进程崩溃时,我无法看到让DTrace附加gdb的方法;只有在进程崩溃后才会触发proc::postsig:signal-handle探测。)

您可以从模块中执行以下操作:

% echo 'c' > continue.txt
% osascript -e 'tell app "Terminal" to do script "gdb -x continue.txt attach <pid>"'

将为每个httpd进程打开一个单独的终端窗口。

您也可以从外部启动gdb,使用脚本(DTrace或其他)查​​看httpd进程,并使用模块代码中QA1573的SIGSTOP方法等待直到脚本注意到新的httpd

答案 1 :(得分:1)

几个月后,我想我们可以说答案是不,你不能。 :)

要调试您的问题,崩溃报告应该是可利用的......但如果真的没有,您可能会尝试启用apache错误日志以及您自己的日志记录代码。然后在发生崩溃时观察日志/控制台应该会有所帮助。

答案 2 :(得分:1)

就我所知或谷歌而言,这不是可能的,也不是完全有意义的。无论如何都无法从CrashReporter执行此操作,因为您的程序在运行时已经中止。

但是,事后可以使用GDB,只要进程启动存储桶,就会httpd生成核心转储。 Apache的own documentation调试崩溃概述了设置它的最佳实践。

如果您还没有,请不要忘记使用-g重建apache,以便拥有调试存根,或者最终会出现乱码符号。

答案 3 :(得分:1)

这是旧的,但刚出现在搜索上,所以:

不,你不能在CrashReporter中做到这一点。但是,您可以通过安装自己的信号处理程序来避免调用CrashReporter。例如,KDE就是为了安装自己的崩溃处理程序。我的理解是,如果异常导致崩溃,处理程序将调用一个应用程序来处理崩溃(DrKonqi)及相关信息,然后暂停自身(在收到SIGSEGV之后发送自己的SIGSTOP) )。然后,DrKonqi将为用户提供多个选项,包括获取回溯,这是通过OS X上的gdb或lldb完成的。

没有什么可以阻止您使用类似的方法启动独立(GUI)调试器并让它附加到失败的进程。这与附加到异常之前的进程几乎相同,当然除了异常可能导致的任何寄存器,堆栈等损坏。