Linux: отслеживание сигнала без удаления регистров для следующего ядра dump?

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

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

5
задан ks1322 11 March 2018 в 16:05
поделиться