функция backtrace () во время обработки сигнала неисправности (SIGSEGV) - PullRequest
2 голосов
/ 15 августа 2011

Я прочитал ( см. Здесь ), что "обычная практика" для печати трассировки стека с использованием backtrace () во время обработчика сигнала ошибки (например, при обработке SIGSEGV) в Linux это:

1 Получить указатель инструкции (EIP или RIP) из недокументированной структуры sigcontext.

2 Замените 2-й кадр в трассировке стека указателем команд, поскольку первый кадр является обработчиком сигнала, а 2-й кадр должен находиться в пределах libc в коде sigaction, который перезаписал исходный кадр, в котором произошла ошибка.

3 Распечатайте обратную трассировку, начиная с недавно замененного 2-го кадра.

В моем тестировании (на ядре x86_64 2.6) мне кажется, что на самом деле исходный кадр, в котором произошла ошибка, присутствует в трассировке стека, заданной backtrace() в 3-м кадре - первым является сигнал обработчик и второй находится в libc коде обработки сигналов.

Задокументировано ли это изменение в обработке сигналов ядра где-то, на что вы можете ссылаться для меня?

Мне кажется, что в результате вы можете избежать замены любых кадров из указателя инструкции и просто напечатать трассировку стека из backtrace(), начиная с кадра 3, но я хочу получить подтверждение того, что это известное поведение и правильное способ сделать это.

1 Ответ

5 голосов
/ 16 августа 2011

Это интересная попытка, но она не очень портативна и, вероятно, никогда не будет на 100% надежной.Так что просто внедрите его так, как вы говорите, если это работает на вашей платформе, и включите в него пару небольших модульных тестов, чтобы сразу узнать, не будет ли какая-то система, которую вы используете в будущем, работать так же.В конце концов, когда этот код вызывается, вы уже облажались, поэтому просто делайте все возможное, чтобы двигаться дальше.

Совершенно другая альтернатива, которую можно использовать одновременно или вместо вашего.Схема, это написать скрипт, который будет вызываться Linux, когда программа сбрасывает ядро.Этот сценарий может затем запустить gdb в пакетном режиме для основного файла, чтобы получить обратную трассировку и отправить вам электронное письмо или что-то подобное.

...