LINUX.ORG.RU

Сообщения prevedmedved

 

SIGSEGV , si_addr всегда ПУСТОЙ, как определить адрес инструкции?

понадобилось мне отлавливать баги динамически в одной проге

тестю код перехвата с искуственно вызванными исключениями, ставя перехватчик сигнала через 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;

}
prevedmedved
()

RSS подписка на новые темы