Мне нужно напечатать память рядом с местом, где происходит сбой программы (SIGSEGV), но факт заключается в том, что когда я пытаюсь распечатать эту память, я снова могу вызвать SIGSEGV.
void handler_SIGSEGV(int signal, siginfo_t *data, void *extra_data) {
for (size_t* mem = (size_t*) (data->si_addr - 5); mem < (size_t*) (data->si_addr + 5); mem++){
printf("%zx\n", *mem); // call new SIGSEGV
}
exit(1);
}
Как я понял в обработчике, я могу использовать volatile sig_atomic_t
переменные, чтобы указать, что сигнал уже сработал.
volatile sig_atomic_t isRecall = 0;
void handler_SIGSEGV(int signal, siginfo_t *data, void *extra_data) {
if (isRecall == 1){
//second call
}
printf("Call - %d\n", isRecall);
isRecall = 1;
....
Но когда сигнал SIGSEGV вызывается снова, моя функция handler_SIGSEGV
непозвонил по какой-то причине.
Почему это происходит?И как мне реализовать такой вывод памяти?