URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1907
[ Назад ]

Исходное сообщение
"Найти адрес инструкции, по которой произошла обр. сигнала"

Отправлено Lasvik , 24-Июл-03 12:44 
Есть такая проблема: как при обработке сигнала типа SIGSEGV получить адрес инструкции кода, по которой произошло прерывание? С адресом данных, к которым было произведенно запретное обращение, все вроде ясно --- для этого есть специальные структуры, чьи поля заполняются при обработке сигнала. Адрес же собственно инструкции кода, вызвавшей прерывание, находился мною эмпирическим путем, исходя из исследования стека программы при помощи dbg. В результате было получено некое число, которое потом использовалось для вычисления нужного адреса. Способ, впрочем, тот еще --- сильно подозреваю, что он очень архитектурно зависим. Может кто-нибудь знает, какие есть средства работы с такими вещами, ведь умеет же dbg это как-то делать?! Заранее спасибо.

Содержание

Сообщения в этом обсуждении
"Найти адрес инструкции, по которой произошла обр. сигнала"
Отправлено Max V. Zinal , 24-Июл-03 20:42 
Поскольку народ пока безмолвствует, высскажу по сему поводу
своё нетвёрдое и неконкретное мнение, т.е. IMHO вульгарис.
Вдобавок моё IMHO сильно привязано к моему сугубо практическому
опыту извращённой отладки под Solaris x86. Так что "не любо - не слушай,
а врать не мешай".

Итак, IMHO вульгарис, исходя из весьма далёких лекций по архитектурным
основам CPU, могу сказать следующее. Способность отладчиков обнаружить
"сбойшувную" инструкцию объясняется их умением (а) разбирать архитектурно-
и даже ОС- зависимый стек, включая адреса возврата, и (б) способностью
достать из контекста каждого из потоков сбойнувшего же процесса
значение специального адресного регистра (то бишь как раз адрес инструкции).
В однопоточной программе обработчику SIGSEGV доступно лишь исследование
стека. При использовании sigwait() в выделенном потоке программы многопоточной
можно добиться некоей адекватности в значениях, извлекаемых из контекстов
всех прочих потоков. Надеяться здесь на переносимость кода - верх наивности.


"Найти адрес инструкции, по которой произошла обр. сигнала"
Отправлено Bob , 24-Июл-03 23:47 
Был здесь на форуме уже такой вопрос, если не ощибаюсь, пару месяцев назад. Не поленись, поройся, должен найти.

"Найти адрес инструкции, по которой произошла обр. сигнала"
Отправлено Bob , 24-Июл-03 23:56 
О, нашел! Вот ссылка:
http://www.opennet.me/openforum/vsluhforumID9/1724.html