Есть такая проблема: как при обработке сигнала типа SIGSEGV получить адрес инструкции кода, по которой произошло прерывание? С адресом данных, к которым было произведенно запретное обращение, все вроде ясно --- для этого есть специальные структуры, чьи поля заполняются при обработке сигнала. Адрес же собственно инструкции кода, вызвавшей прерывание, находился мною эмпирическим путем, исходя из исследования стека программы при помощи dbg. В результате было получено некое число, которое потом использовалось для вычисления нужного адреса. Способ, впрочем, тот еще --- сильно подозреваю, что он очень архитектурно зависим. Может кто-нибудь знает, какие есть средства работы с такими вещами, ведь умеет же dbg это как-то делать?! Заранее спасибо.
Поскольку народ пока безмолвствует, высскажу по сему поводу
своё нетвёрдое и неконкретное мнение, т.е. IMHO вульгарис.
Вдобавок моё IMHO сильно привязано к моему сугубо практическому
опыту извращённой отладки под Solaris x86. Так что "не любо - не слушай,
а врать не мешай".Итак, IMHO вульгарис, исходя из весьма далёких лекций по архитектурным
основам CPU, могу сказать следующее. Способность отладчиков обнаружить
"сбойшувную" инструкцию объясняется их умением (а) разбирать архитектурно-
и даже ОС- зависимый стек, включая адреса возврата, и (б) способностью
достать из контекста каждого из потоков сбойнувшего же процесса
значение специального адресного регистра (то бишь как раз адрес инструкции).
В однопоточной программе обработчику SIGSEGV доступно лишь исследование
стека. При использовании sigwait() в выделенном потоке программы многопоточной
можно добиться некоей адекватности в значениях, извлекаемых из контекстов
всех прочих потоков. Надеяться здесь на переносимость кода - верх наивности.
Был здесь на форуме уже такой вопрос, если не ощибаюсь, пару месяцев назад. Не поленись, поройся, должен найти.
О, нашел! Вот ссылка:
http://www.opennet.me/openforum/vsluhforumID9/1724.html