понадобилось мне отлавливать баги динамически в одной проге
тестю код перехвата с искуственно вызванными исключениями, ставя перехватчик сигнала через sigaction, с флагом SA_SIGINFO
в обработчике исключения - на сигнале например SIGFPE , si_addr как и положено содержит адрес исключения
а вот на SIGSEGV - в si_addr всегда НОЛЬ
пробывал как на сях писать, так и на фасме, одна хрень рыл гугл. выхода не нашёл
а задача то простая - программно (без отладчика) отлавливать адрес, по котрому возникает SIGSEGV
п.с. BSD 7.1 , BSD 7.3
помогите люди добрые кто чем может
---------------------- сильно не пинайте, пишу обычно на асме, портированный код выдаёт те же результаты и в отладчике примерно одно и тоже
struct sigaction new_action;
void on_sigsegv(int sig, siginfo_t *si, void *ptr)
{
printf("SIGSEGV at %p\n", si->si_addr); // если SIGSEGV, то адрес исключения всегд ноль, хотя на SIGFPE всё ок, адрес ошибки выводит верно
exit(0);
}
int main()
{
new_action.sa_handler = on_sigsegv;
new_action.sa_flags=SA_SIGINFO;
sigaction (SIGSEGV, &new_action, 0);
*(int*)0 = 0;
return 0;
}