Как заставить Mac OS X CrashReporter вызывать отладчик? - PullRequest
8 голосов
/ 26 декабря 2010

У меня есть модуль Apache в Mac OS X, который производит случайные сбои. Я могу воспроизвести эти сбои с определенной последовательностью действий, и эти сбои выдают диалог Crash Reporter «httpd неожиданно завершился». Есть ли способ заставить Crash Reporter запускать отладчик (xcode, gdb, что угодно) вместо простого отображения обратной трассировки?

Я попытался запустить httpd под gdb с httpd -X, но сбой не произойдет - это происходит только в том случае, если одновременно запущено много httpd, и я не нашел способа присоединить gdb ко всем их сразу. Поэтому я надеялся, что смогу заставить CrashReporter подключить отладчик при сбое определенного процесса - есть ли способ сделать это?

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

К сожалению, тип ошибки, которую вы описываете, имеет тенденцию исчезать при нарушении экзамена.

Тем не менее, можно попробовать запустить сеанс 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, и использовать метод SIGSTOP из QA1573 в коде вашего модуля, чтобы дождаться, пока скрипт не заметит новый httpd.

1 голос
/ 29 марта 2015

Это старая версия, но она только что появилась в поиске, поэтому:

Нет, вы не можете сделать это из CrashReporter.Однако вы можете избежать вызова CrashReporter, установив собственный обработчик сигналов.KDE делает это, например, для установки собственного обработчика сбоев.Насколько я понимаю, в случае исключения, которое может привести к сбою, обработчик вызывает приложение, которое будет обрабатывать сбои (DrKonqi) с соответствующей информацией, а затем приостанавливает себя (отправляет себе SIGSTOP после получения, скажем, SIGSEGV).Затем DrKonqi предоставит пользователю несколько вариантов, в том числе для получения обратной трассировки, которая выполняется через gdb или lldb в OS X.

Ничто не мешает вам использовать аналогичный подход для запуска автономного (GUI)отладчик и пусть он присоединяется к ошибочному процессу.Это будет почти то же самое, что и присоединение к процессу до исключения, за исключением, конечно, любого повреждения регистра, стека и т. Д., Которое могло вызвать исключение.

1 голос
/ 05 июля 2011

Насколько мне известно, это не является возможным или google-fu, и при этом не имеет никакого смысла. Невозможно сделать это с CrashReporter независимо от того, что ваша программа уже прервана к моменту запуска.

Тем не менее, можно использовать GDB по факту, получив httpd для генерации дампов ядра всякий раз, когда процесс выбивает ведро. Собственная документация Apache о сбоях отладки содержит рекомендации по ее настройке.

Если вы еще этого не сделали, не забудьте перестроить apache с помощью -g, чтобы у вас были отладочные заглушки, или вы получите искаженные имена символов.

1 голос
/ 16 апреля 2011

Через несколько месяцев, я думаю, мы можем сказать, что ответ нет, вы не можете . :)

Чтобы отладить вашу проблему, отчет о сбое должен быть пригодным для использования ... но если на самом деле нет, вы можете попытаться включить журнал ошибок apache, а также свой собственный код регистрации. Тогда просмотр журналов / консоли при возникновении сбоя должен помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...