LINUX.ORG.RU

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


0

1

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

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

может быть по той причине 0, что там пишется адрес, на который было обращение, а не адрес инструкции, которая вызвала это обращение?

anonymous
()

SIGSEGV и SIGBUS пишут адрес памяти, по которому было обращение, SIGILL и SIGFPE пишут адрес инструкции

anonymous
()
Ответ на: комментарий от anonymous

это всё хорошо, но вопрос то остаётся открытым - какие есть способы узнать адрес инструкции, а не адрес памяти при SIGSEGV ?

спасибо за помощь

prevedmedved
() автор топика
Ответ на: комментарий от anonymous

третий параметр как то кривовато подгоняется под структуру, но по адресу +4Ch от него лежал как раз адрес инструкции. опыты показали, что это не лучайность и оно там так и должно быть :)

так что всем спасибо, вопрос решён

prevedmedved
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.