Могу ли я перехватить сигнал SIGSEGV и другие сигналы в многопоточном приложении (pthreads) и распечатать обратный след вызвавшей его нити или всех нитей? - PullRequest
3 голосов
/ 03 августа 2011

Я видел Получение обратного следа другого потока , но он не содержал много практической информации.

Я хочу иметь возможность перехватывать SIGSEGV в многопоточном приложении C с использованием потоков POSIX, работающих в Linux (ядро CentOS, 2.6), и печатать трассировку стека потока, который его вызвал. Конечно, не зная, какой поток вызвал его, хорошо для меня (tm), чтобы основной поток, который перехватил сигнал, перечислил все потоки и просто напечатал трассировку стека всех из них.

Там было отмечено, что, возможно, libunwind может быть использовано для этого, но в документации его нет, и я не смог найти хороший пример того, как его использовать для этой цели. Кроме того, мне стало интересно, оказывает ли оно существенное влияние на производительность или другое влияние, а также проверено ли оно в боевых условиях и используется ли в рабочем коде, или оно в основном используется только для отладки и разработки, а не в производственных системах.

Есть ли у кого-нибудь пример кода, использующего libunwind или другой достаточно простой (например, не пишущий его в сборке) способ сделать это?

1 Ответ

3 голосов
/ 03 августа 2011

Получить обратную трассировку потока, вызвавшего исключение, легко, более или менее:

Передать флаг -rdynamic компоновщику

Затем в обработчике сигнала регистрации кода извлекитеEIP ошибки из параметров обработчика сигнала, а затем использовать ее и функцию backtrace () для получения массива адресов.

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

Убедитесь, что в обработчике сигналов не используется асинхронная небезопасная функция потокаблокирует, выделяет память или вызывает любую функцию, которая это делает.

Вот слайды к презентации, которую я дал по этому вопросу: http://www.scribd.com/doc/3726406/Crash-N-Burn-Writing-Linux-application-fault-handlers

Видео также доступно где-то во время разговора, но яне могу найти его сейчас ...

Расширение этого, чтобы получить обратную трассировку нескольких потоков, возможно, но довольно сложно - вам нужно держать таб of ваши различные потоки и отправлять им сигналы в случае сбоя

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