![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Подскажите пожалуйста, как перехватить эксепшн типа memory access violation средствами языка С. Какие внутренности стоят за __except(EXCEPTION_EXECUTE_HANDLER)?
Это сообщение отредактировал(а) nerdy_weirdie - 20.6.2010, 02:32 |
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: 3 Всего: 32 |
В си нет исключений и обработки их тоже, соответственно. Если имеешь введу виндовую SEH, то смотри в MSDN.
Насчёт __catch
это из exception_defines.h стандартной библиотеки C++ Это сообщение отредактировал(а) Cheloveck - 19.6.2010, 23:37 -------------------- ![]() |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Ясное дело что нет, потому и спрашиваю как реализовать
За всеми этими штуками стоят вызовы конкретных функций из конкретных библиотек, что вполне реализуемо на си, знать бы только что как и когда там вызывается.. |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Прошу прощения за неточность. Интересует реализация конкретно __except(EXCEPTION_EXECUTE_HANDLER)
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
__try и __except это именно С конструкции. Написать их реализацию на С (без встроенных __try и __except) нереально - они используют механизмы SEH, поддержка которых встроенна в компилятор. Она в частности включает построение специального стекового фрейма и манипуляцию сегментным регистром x86 (GS). Кроме того, компилятор генерирует специальные таблицы, из которых торчат указатели в куски кода.
Ищи в MSDN и google |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
..
Это сообщение отредактировал(а) nerdy_weirdie - 29.6.2010, 15:25 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Тогда скомпилить кусок кода с __try __except в ассемблер и посмотреть, что там и как. Но в любом случае SEH базируется на стековом фрейме, а это значит, что в произвольное место кода это не вставишь (если вообще вставишь). Хотя можно сделать свой (вложенный) стековый фрейм, но все проблемы это все равно не решит. В частности сделать вложенный фрейм не получится в коде, который делает стековый фрейм |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Да я вот давно под дизассемблером смотрю на это чудо, и никаких идей пока нет...
|
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
nerdy_weirdie, в самой примитивной форме это не сложно.
Литература по вопросу: http://www.wasm.ru/article.php?article=Win32SEHPietrek1 (есть продолжение статьи) -------------------- Обижено школьников: 8 |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
bems, спасибо, это то что надо.
Только почему-то этот перехват работает в дебажной конфигурации и не работает в релизной. Настройки компилятора все дефолтные кроме Entry Point. В чем может быть дело? |
|||
|
||||
| bems |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3400 Регистрация: 5.1.2006 Репутация: нет Всего: 88 |
Проверь, не убрал ли компилятор стековый фрейм в целях оптимизации.
Если убрал, укажи что он там нужен. -------------------- Обижено школьников: 8 |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Может подскажете, как подобным образом реализовать __except(EXCEPTION_EXECUTE_HANDLER). Посути мне надо просто перейти в определенную точку в коде. Для этого насколько я понимаю надо записать нужный адрес в ContextRecord->Eip. Но как же тут быть со стеком и с текущими значениями регистров?
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |