The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
Найти адрес инструкции, по которой произошла обр. сигнала, !*! Lasvik, 24-Июл-03, 12:44  [смотреть все]
Есть такая проблема: как при обработке сигнала типа SIGSEGV получить адрес инструкции кода, по которой произошло прерывание? С адресом данных, к которым было произведенно запретное обращение, все вроде ясно --- для этого есть специальные структуры, чьи поля заполняются при обработке сигнала. Адрес же собственно инструкции кода, вызвавшей прерывание, находился мною эмпирическим путем, исходя из исследования стека программы при помощи dbg. В результате было получено некое число, которое потом использовалось для вычисления нужного адреса. Способ, впрочем, тот еще --- сильно подозреваю, что он очень архитектурно зависим. Может кто-нибудь знает, какие есть средства работы с такими вещами, ведь умеет же dbg это как-то делать?! Заранее спасибо.
  • Найти адрес инструкции, по которой произошла обр. сигнала, !*! Max V. Zinal, 20:42 , 24-Июл-03 (1)
    Поскольку народ пока безмолвствует, высскажу по сему поводу
    своё нетвёрдое и неконкретное мнение, т.е. IMHO вульгарис.
    Вдобавок моё IMHO сильно привязано к моему сугубо практическому
    опыту извращённой отладки под Solaris x86. Так что "не любо - не слушай,
    а врать не мешай".

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

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



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру