#полезное
🤯
Отлавливайте сегфолты во время выполнения на C#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
static void handle_sigsegv(int sig, siginfo_t *info, void *ucontext) {
(void)ucontext; // используем это, если нужно, иначе отключаем предупреждение компилятора
// Обрабатываем сегфолт здесь
// записываем несохраненные данные, логируем ошибки и т.д.
fprintf(stderr, "Сегфолт пойман по адресу %p, ваши данные сохранены!\n", info->si_addr);
exit(EXIT_FAILURE);
}
int main(void) {
struct sigaction sig_a = {
.sa_sigaction = handle_sigsegv, // указатель на функцию обработки нашего сегфолта
.sa_flags = SA_SIGINFO,
};
sigemptyset(&sig_a.sa_mask);
if (sigaction(SIGSEGV, &sig_a, NULL) == -1) {
perror("sigaction не удалась");
return 1;
}
printf("Этот код выполняется перед сегфолтом!\n");
// намеренно вызываем сегфолт
int *p = NULL;
*p = 1;
printf("Это не выполнится из-за сегфолта!\n");
return 0;
}
На фото ошибка: в условии
sigaction надо сравнивать с «-1», а не с «1»
👉
Новости 👉
База вопросов