Linux: Отслеживать сигнал, не удаляя регистры для последующего дампа ядра? - PullRequest
5 голосов
/ 29 сентября 2011

Когда я получаю сигнал, вызывающий coredump, я хочу запустить свой собственный обработчик, чтобы скопировать структуры siginfo_t и ucontext_t в глобальные переменные, чтобы они могли быть доступны в дампе ядра.В настоящее время в конце моего обработчика я переназначаю обработчик по умолчанию и вызываю повышение (thesig).Проблема с этим заключается в том, что дамп ядра «info registers» показывает состояние регистров в моем обработчике, а не во время исходного сигнала.Я понимаю, что, поскольку я сохранил ucontext_t, я могу найти в нем исходные значения регистров, но эти знания могут быть потеряны / забыты при передаче дампов ядра в команду.

Так что мой вопрос: есть ли способ переосмыслить сигнал и убедиться, что файл дампа ядра содержит состояние регистра исходного сигнала?Я подумал, что, возможно, я мог бы использовать встроенный ассемблер, чтобы вручную восстановить все регистры в конце обработчика, а затем вернуться к инструкции, которая вызвала сигнал, вместо того, чтобы вызывать повышение (), но я не уверен, сможем ли мы гарантировать, что ре-попытание инструкции приведет к тому же поведению сигнализации, что и с первой попытки.

1 Ответ

3 голосов
/ 29 сентября 2011

скопировать структуры siginfo_t и ucontext_t в глобальные переменные, чтобы к ним можно было получить доступ в дампе ядра

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

«info registers» показывает состояние регистров в моем обработчике, а не во время оригиналасигнал.

Просто сделайте up 5 (или столько уровней, сколько вам нужно, чтобы подняться до точки сбоя) и снова наберите info reg.

естьспособ поднять сигнал и убедиться, что файл дампа памяти содержит состояние регистра исходного сигнала?

Да: установить расположение сигнала на SIG_DFL с помощью signal(signum, SIG_DFL); и вернуться из обработчика.Инструкция, которая вызвала SIGSEGV, будет перезапущена и теперь вызовет немедленный дамп ядра.

...