Я прочитал ( см. Здесь ), что "обычная практика" для печати трассировки стека с использованием backtrace () во время обработчика сигнала ошибки (например, при обработке SIGSEGV
) в Linux это:
1 Получить указатель инструкции (EIP
или RIP
) из недокументированной структуры sigcontext
.
2 Замените 2-й кадр в трассировке стека указателем команд, поскольку первый кадр является обработчиком сигнала, а 2-й кадр должен находиться в пределах libc
в коде sigaction
, который перезаписал исходный кадр, в котором произошла ошибка.
3 Распечатайте обратную трассировку, начиная с недавно замененного 2-го кадра.
В моем тестировании (на ядре x86_64
2.6) мне кажется, что на самом деле исходный кадр, в котором произошла ошибка, присутствует в трассировке стека, заданной backtrace()
в 3-м кадре - первым является сигнал обработчик и второй находится в libc
коде обработки сигналов.
Задокументировано ли это изменение в обработке сигналов ядра где-то, на что вы можете ссылаться для меня?
Мне кажется, что в результате вы можете избежать замены любых кадров из указателя инструкции и просто напечатать трассировку стека из backtrace()
, начиная с кадра 3, но я хочу получить подтверждение того, что это известное поведение и правильное способ сделать это.