Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> __catch на С, Перехват исключений на С 
:(
    Опции темы
nerdy_weirdie
Дата 19.6.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Подскажите пожалуйста, как перехватить эксепшн типа memory access violation средствами языка С. Какие внутренности стоят за __except(EXCEPTION_EXECUTE_HANDLER)?

Это сообщение отредактировал(а) nerdy_weirdie - 20.6.2010, 02:32
PM MAIL   Вверх
Cheloveck
Дата 19.6.2010, 23:30 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1578
Регистрация: 26.7.2008
Где: Тула

Репутация: 3
Всего: 32



В си нет исключений и обработки их тоже, соответственно. Если имеешь введу виндовую SEH, то смотри в MSDN.

Насчёт __catch
Код

#ifndef __EXCEPTIONS
// Iff -fno-exceptions, transform error handling code to work without it.
# define __try      if (true)
# define __catch(X) if (false)
# define __throw_exception_again
#else
// Else proceed normally.
# define __try      try
# define __catch(X) catch(X)
# define __throw_exception_again throw
#endif

это из exception_defines.h стандартной библиотеки C++

Это сообщение отредактировал(а) Cheloveck - 19.6.2010, 23:37


--------------------
user posted image
PM Jabber   Вверх
nerdy_weirdie
Дата 20.6.2010, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Ясное дело что нет, потому и спрашиваю как реализовать  smile 
За всеми этими штуками стоят вызовы конкретных функций из конкретных библиотек, что вполне реализуемо на си, знать бы только что как и когда там вызывается..
PM MAIL   Вверх
nerdy_weirdie
Дата 20.6.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Прошу прощения за неточность. Интересует реализация конкретно __except(EXCEPTION_EXECUTE_HANDLER)
PM MAIL   Вверх
xvr
Дата 21.6.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



__try и __except это именно С конструкции. Написать их реализацию на С (без встроенных __try и __except) нереально - они используют механизмы SEH, поддержка которых встроенна в компилятор. Она в частности включает построение специального стекового фрейма и манипуляцию сегментным регистром x86 (GS). Кроме того, компилятор генерирует специальные таблицы, из которых торчат указатели в куски кода.
Ищи в MSDN и google

PM MAIL   Вверх
nerdy_weirdie
Дата 21.6.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



..

Это сообщение отредактировал(а) nerdy_weirdie - 29.6.2010, 15:25
PM MAIL   Вверх
xvr
Дата 21.6.2010, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(nerdy_weirdie @  21.6.2010,  20:24 Найти цитируемый пост)
который надо защитить от эксепшнов инжектирован в другой процесс и не может быть вынесен в отдельную длл.
  smile 
Тогда скомпилить кусок кода с __try __except в ассемблер и посмотреть, что там и как. Но в любом случае SEH базируется на стековом фрейме, а это значит, что в произвольное место кода это не вставишь (если вообще вставишь).
Хотя можно сделать свой (вложенный) стековый фрейм, но все проблемы это все равно не решит. В частности сделать вложенный фрейм не получится в коде, который делает стековый фрейм  smile 


PM MAIL   Вверх
nerdy_weirdie
Дата 23.6.2010, 02:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Да я вот давно под дизассемблером смотрю на это чудо, и никаких идей пока нет...  smile 
PM MAIL   Вверх
bems
Дата 23.6.2010, 05:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



nerdy_weirdie, в самой примитивной форме это не сложно. 
Литература по вопросу: http://www.wasm.ru/article.php?article=Win32SEHPietrek1 (есть продолжение статьи)


--------------------
Обижено школьников: 8
PM MAIL   Вверх
nerdy_weirdie
Дата 29.6.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



bems, спасибо, это то что надо.
Только почему-то этот перехват работает в дебажной конфигурации и не работает в релизной. Настройки компилятора все дефолтные кроме Entry Point. В чем может быть дело?
PM MAIL   Вверх
bems
Дата 29.6.2010, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: нет
Всего: 88



Проверь, не убрал ли компилятор стековый фрейм в целях оптимизации.
Если убрал, укажи что он там нужен.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
nerdy_weirdie
Дата 30.6.2010, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Может подскажете, как подобным образом реализовать __except(EXCEPTION_EXECUTE_HANDLER). Посути мне надо просто перейти в определенную точку в коде. Для этого насколько я понимаю надо записать нужный адрес в ContextRecord->Eip. Но как же тут быть со стеком и с текущими значениями регистров?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.