
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.60] |
![]() |
|
Страницы: (10) 1 2 [3] 4 5 ... 9 10 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
ясно. Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH" |
Сообщ.
#32
,
|
|
|
Сообщ.
#33
,
|
|
|
Цитата повстанец @ Это когда исключения генерируются системой. Например, при переполнении стека. в нормально написанной программе такого не должно происходить, и поэтому поддержка данных исключений не нужна. Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH" |
Сообщ.
#34
,
|
|
|
гы... а в компиляторе от мелкомягких есть... И вообще, я так понимаю mingw это сборка для винды, так что вот!
Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH" |
Сообщ.
#35
,
|
|
|
Для СОМ, к примеру. Из-за того, что одна прога запихнула невалидный адрес, сервер (а за ним и все остальные клиенты) упасть не должен.
Добавлено В стандарте много чего нет. Например там нет ни одного способа связывания с системным API. Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH" |
![]() |
Сообщ.
#36
,
|
|
Если мы говорим о том, что является частью API ОС и что тем не менее Стандарт любезно оставил на усмотрение реализаций, в данном случае это связь системых исключений с C++ Exception Handling, то уповать на Стандартную неопределённость поведения значит заметать мусор под ковёр. Системные исключения в WinAPI присутствуют в виде технологии SEH, и она играет важнейшую роль для 24/7 приложений.
Цитата DEADHUNT @ Нормально написанная программа в таком случае не должна использовать никаких библиотек. Даже статических. О динамических, COM- ActiveX- итп-компонентах, и даже просто о плагинной архитектуре можно просто забыть. Да, в таких случаях SEH не нужна, ибо мы сами пишем весь код своего приложения, и вполне способны отвечать за его качество. Но всё равно остаётся процесс разработки и отладки.в нормально написанной программе такого не должно происходить, и поэтому поддержка данных исключений не нужна. niXman, вопрос, как я понимаю, пока не заключается в поддержке SEH, пока вопрос выглядит как "при каких условиях g++ может не поддерживать C++ Exception Handling", ибо транслировать SEH в C++EH можно тем же WinAPI, коль уж портированный под WinAPI компилятор не поддерживает расширения синтаксиса, рекомендованные MS для своих ОСей уже без малого 20 лет. Это сообщение было перенесено сюда или объединено из темы "GCC-win32 and SEH" |
Сообщ.
#37
,
|
|
|
Цитата Повстанець @ Для СОМ, к примеру. Из-за того, что одна прога запихнула невалидный адрес, сервер (а за ним и все остальные клиенты) упасть не должен. это стандартная ситуация. но я совершенно не понимаю для чего тут SEH... ![]() ![]() if ( ptr_type ptr = server->get_iface(...) ) { work with ptr if it`s valid } else { throw exception_type(...); } |
![]() |
Сообщ.
#38
,
|
|
Невалидные указатели не обязательно null_ptr. (int*)0x12345678 тоже с большой долей вероятности будет невалидным и вызывать EXCEPTION_ACCCESS_VIOLATION при разыменовании.
За действия не нашего кода мы не можем отвечать, но мы можем защититься от них, поймав фаулт, возникший в плагине, и вырубив такой плагин к чертям, к примеру. SEH для этого - стандартная и очень удобная практика для WinAPI. |
Сообщ.
#39
,
|
|
|
Цитата Qraizer @ (int*)0x12345678 ну так это означает что баг в том коде который вернул такой указатель. к чему лечить последствия? не могу представить здравый код, который возвращал бы случайные указатели. ( (int*)random() ) ![]() |
![]() |
Сообщ.
#40
,
|
|
Здравый и не будет. Только откуда знать, что он здравый, если он не наш? Даже если его автор - Компания с Большим Именем.
|
Сообщ.
#41
,
|
|
|
Цитата niXman @ ну так это означает что баг в том коде который вернул такой указатель. к чему лечить последствия? Т.е. ты предлагаешь, к примеру, такую ситуацию: в Photoshop закосячил какой-то плагин, вернул не валидный адрес или ещё что, и Photoshop вместо того, чтобы поймать исключение и написать пользователю что плагин глючный, просто тупо упадёт не сохранив работу пользователя. Что-то мне кажется пользователей такой расклад не порадует. Ты не можешь отвечать за код, который написан не тобой, и должна быть возможность оградиться от последствий исполнения такого кода. Собственно это реализуется с помощью WinAPI даже без поддержки SEH на уровне компилятора, так что... |
Сообщ.
#42
,
|
|
|
Qraizer, если ты перенесёшь тему в холивар, где же я буду сообщать о том, как я предлагаю работать с исключениями? А я предлагаю.
Вот я провёл тут небольшое исследование. Помнишь, ты попрошал у niXmanа, почему не работает код отсюда (сообщение номер 7)? Так вот, SetUnhandledExceptionFilter это, оказывается, очень-очень-очень, интересная функция. В самом деле, в случае неудачи, она возвращает ноль, а в случае удачи- код нового обработчика, что и происходит Но тут почитав кое-что, поспрошав людей, я понял, что она должна внести ещё и изменения в связный список элементов типа EXCEPTION_REGISTRATION_RECORD! А она этого не делает! То есть я вот тут выложил программу, кому интересно запустите, компилятор g++ должен быть. Хе, адрес обработчика после УДАЧНОЙ отработки SetUnhandledExceptionFilter НЕ ИЗМЕНЯЕТСЯ. Первый раз вижу API-функцию, так половинчато работающую. Предварительный вывод: компилятор g++ в этой части вообще не причём. Имеется задокументированная функция, которая должна установить новый обработчик исключений, которая его якобы устанавливает, но не устанавливает. Это у меня вопрос к майкрософту возник, почему так. Щас я пытаться буду написать свою реализацию SetUnhandledExceptionFilter ![]() ![]() #include <windows.h> #include <iostream> #include <stdio.h> #include <excpt.h> //+ //+ //+ LONG WINAPI TopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS x) { //Это функция-обработчик исключений, которая никогда не вызывается printf ("hello, word!\n"); getchar (); return 0; } //.................................................... //+ //+ //+ int main(){ SetConsoleCP (1251); SetConsoleOutputCP (1251); PNT_TIB pTIB; PEXCEPTION_HANDLER handler_; printf ("новая функция-обработчик находится по адресу: %x\n"\ ,(unsigned int)TopLevelUnhandledExceptionFilter); //++ //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pTIB= (PNT_TIB)NtCurrentTeb(); // //NtCurrentTeb() недокументированная функция, //суть ассемблерная вставка где-то //А это сразу указатель найдём на функцию-обрабочик исключения handler_= ((PEXCEPTION_REGISTRATION_RECORD)pTIB->ExceptionList)->handler; printf ("\nДо вызова SetUnhandledExceptionFilter:\n"); printf ("TEB текущего потока== %x\n", (unsigned int)pTIB); printf ("TIB текущего потока== %x\n", (unsigned int)pTIB); printf ("Стандартная Функция-обработчик исклюючения находится по адресу== %x\n", (unsigned int)handler_); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++ //устанавливаем обработчик исключения printf ("\nSetUnhandledExceptionFilter вернула %x\n\n",\ (unsigned int)SetUnhandledExceptionFilter(TopLevelUnhandledExceptionFilter));; //++ //повторяем процедуру нахождения адреса обраблотчика //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pTIB= (PNT_TIB)NtCurrentTeb(); handler_= ((PEXCEPTION_REGISTRATION_RECORD)pTIB->ExceptionList)->handler; printf ("После вызова SetUnhandledExceptionFilter:\n"); printf ("TEB текущего потока== %x\n", (unsigned int)pTIB); printf ("TIB текущего потока== %x\n", (unsigned int)pTIB); printf ("Новая Функция-обработчик исклюючения находится по адресу== %x\n", (unsigned int)handler_); //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //++ getchar (); return 0; } |
Сообщ.
#43
,
|
|
|
Я не знаю что ты там понаписал, у меня ловит: ![]() ![]() #include<stdio.h> #include<windows.h> int *pointer=0; LONG WINAPI myUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) { printf("Exception %08X at %08X\n", ExceptionInfo->ExceptionRecord->ExceptionCode, ExceptionInfo->ExceptionRecord->ExceptionAddress ); return EXCEPTION_EXECUTE_HANDLER; } int main(void) { SetUnhandledExceptionFilter(myUnhandledExceptionFilter); printf("Generating Exception...\n"); *pointer=123; printf("Done!\n"); return 0; } ![]() ![]() >test.exe Generating Exception... Exception C0000005 at 0040104F Добавлено Цитата niXman @ собственно, ЯП выполняемые на ВМ обязаны работать быстрее компилируемых, ибо эвристический анализ. А как насчёт того, что код VM потом всё равно переводится JIT компилятором в нативный для исполнения? А на это время надо. |
![]() |
Сообщ.
#44
,
|
|
Цитата повстанец @ Это разговор даже не для С++ Общих. Тут прямая дорога обратно в Системное и WinAPI. Qraizer, если ты перенесёшь тему в холивар, где же я буду сообщать о том, как я предлагаю работать с исключениями? Добавлено ! Дух Повстанца, создание клонов запрещено Правилами. Незачем было доводить ситуацию до критической. Если твой клон стремится во флейм и тут не будет появляться, я не против. Банить или не банить, пусть решают тамошние модеры. Но тут уровень вверх твой. |
Сообщ.
#45
,
|
|
|
Цитата cppasm @ Я не знаю что ты там понаписал, у меня ловит: У тебя не ловит ![]() ![]() #include<stdio.h> #include<windows.h> #include<iostream> int *pointer=0; LONG WINAPI myUnhandledExceptionFilter(struct _EXCEPTION_POINTERS *ExceptionInfo) { printf("Exception %X at %X\n", (unsigned int)ExceptionInfo->ExceptionRecord->ExceptionCode, (unsigned int)ExceptionInfo->ExceptionRecord->ExceptionAddress ); return EXCEPTION_EXECUTE_HANDLER; } int main(void) { SetUnhandledExceptionFilter(myUnhandledExceptionFilter); printf("Generating Exception...\n"); throw std::exception(); printf("Done!\n"); return 0; } ![]() ![]() Generating Exception... terminate called after throwing an instance of 'std::exception' what(): std::exception This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information. компиляторр g++, windows xp |