Народ либо у меня руки кривые просто жесть какие кривые, либо я чето не так делаю. Короче дело такое. Хотел поразбираться с SEH. Код старый я думаю все его знают(то шо в комментах не смотрите эт мои бредни =) ). Код (Text): #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <stdio.h> //#pragma comment ( linker,"/entry:main" ) DWORD scratch; EXCEPTION_DISPOSITION __cdecl _except_handler(struct _EXCEPTION_RECORD *ExceptionRecord, void *EstablisherFrame, struct _CONTEXT* ContextRecord, void *DispatcherContext) { unsigned i; printf("Hello from exception...\n"); ContextRecord->Eax = (DWORD)&scratch; return ExceptionContinueExecution; } /*LONG WINAPI MyUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo) { HANDLE hThread; CONTEXT ctx; if(pExceptionInfo->ExceptionRecord->ExceptionCode == 0xC0000094) { hThread = GetCurrentThread(); GetThreadContext(hThread,&ctx); printf("ExceptionCode: 0x%.8X\nDr0: 0x%.8X\nDr1: 0x%.8X\nDr2: 0x%.8X\nDr3: 0x%.8X\n",pExceptionInfo->ExceptionRecord->ExceptionCode, ctx.Dr0, ctx.Dr1, ctx.Dr2, ctx.Dr3); } return ExceptionContinueExecution; //ExceptionContinueExecution }*/ int main(int argc, char *argv[]) { /*WORD res = 0; SetUnhandledExceptionFilter(MyUnhandledExceptionFilter); __asm { mov ax,9 mov cx,0 xor edx,edx div cx mov res,ax }*/ DWORD handler = (DWORD)_except_handler; __asm { push handler push fs:[0] mov fs:[0], esp } __asm { mov eax, 0 mov [eax], 1 } printf("After writing!\n"); __asm { mov eax, [esp] mov fs:[0], eax add esp, 8 } printf("Hay!!!\n"); return 0; } Компилю из IDE на своей VС8, компилится норм но на обработчик исключений не переходит. Открываю "Visual Studio 2005 Command Prompt" и компилю оттуда тупо через cl.exe main.cpp, тож самое. Открываю cmd.exe, настраиваю все переменные окружения руками, компилю cl.exe main.cpp и опять компилится но опять же не переходит на обработчик исключений. Я просто запарился уже. С кучей опций компилера и линкера играл и бесполезно, ну не переходит он на мой обработчик и все тут =( А самый прикол в том что когда я знакомому дал, он скомпилил под VC6 просто cl.exe main.cpp и все у него работает. Я ф панике просто =) Кто может подскажите как правильно под этой VC8 комплить уже 3-ий день. В инете ниче не нарыл. В ольке тоже не брякается в обработчике.
UnhandledExceptionFilter это не системный финальный обработчик из kernel32, который вызывается при обработки первого сех-фрейма который устанавливается для треда перед передачей управления потоком на Win32StartAddress. Если удалить первый сех-фрейм, то никакой финальный обработчик не будет вызван, аналогично если у процесса есть отладочный порт(как в вашем случае). К структурной обработке исключений не имеет никакого отношения. Ваш _except_handler должен быть вызван. Под отладчиком UnhandledExceptionFilter не будет вызван.
TSS SAFESEH это "защита" от подмены SEH обработчика на уровне PE (через LoadConfig диру). Никак не влияет на работу штатных обработчиков.
Ё маё братцы =) /SAFESEH:NO помогло =) Огромное спасибоTSS Clerk На счет UnhandledExceptionFilter спс разберусь, SEH запутанная тема. Да и это я смотрел по началу с его помощью коды эксепшнов =)
TSS При SAFESEH:YES компилер создает "белый" список обработчиков исключений и всё это дело хранится через указатель в структуре в LoadConfig дире. При возникновении исключения венда перед переходом на обработчик сначала смотрит "валидность" обработчика, проверяя его адрес по списку. Если устанавливать обработчики "руками" (как это сделано в первом посте), о которых компилер ничего не знает - тогда действительно SAFESEH:NO решит проблему.
dermatolog Ну блин, само собой установленный обработчик НЕ через Код (Text): push handler push fs:[0] mov fs:[0], esp будет вызыван, моя фраза "Без /SAFESEH:NO не будет вызван _except_handler, если скомпилировано в vc8." была сказана в контексте этого топика.