WinXP sp3, исключений нет. Кстати, неужто сложно 2 строки написать чтобы добавить VEH ? Всеже лучше будет в логе ошибку видеть.
О вылетающих окошках с Access violation, которые можно увидеть, если отладочной инфы нет или если pdb не того формата.
А чем мне сможет помочь VEH, я использую SEH и лог с исключением в дебаг режиме выглядит так: Код (Text): //===================== UNHANDLED EXCEPTION ===================== idag.exe caused a EXCEPTION_ACCESS_VIOLATION in module CppSourcer.plw at 001B:01E40830, vCModule::GetLineTable()+32 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vmodule.h, line 201+32 byte(s) EAX=00000000 EBX=01C99E2C ECX=00000000 EDX=020C547C ESI=0012F1E4 EDI=0012F1D4 EBP=0012F1D4 ESP=0012F184 EIP=01E40830 FLG=00010206 CS=001B DS=0023 SS=0023 ES=0023 FS=003B GS=0000 //========================== CALLSTACK ========================== 001B:01E40830 (0x00000001 0x0000A880 0x0012F2B8 0x0012F4D4) CppSourcer.plw, vCModule::GetLineTable()+32 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vmodule.h, line 201+32 byte(s) 001B:01E3F0EF (0x052BAB08 0x0040B880 0x00000038 0x0012F43C) CppSourcer.plw, vCVInfo::SetFunctionSize()+207 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vdebuginfo.cpp, line 2658+14 byte(s) 001B:01E4450D (0x01CDE394 0x0012F4C8 0x0012F4D4 0x01C99E2C) CppSourcer.plw, vCFunction::Create()+365 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vfunction.cpp, line 134 001B:01EA6A40 (0x0040B880 0x00000000 0x0012F4B8 0x0012F538) CppSourcer.plw, vCSourcer::DecompileFunction()+288 byte(s), D:\PROGRAMS\IdaSDK52\plugins\CppSourcer\vSourcer.cpp, line 247+9 byte(s) 001B:01EA6E36 (0x0040B880 0x0012F5E0 0x0012F550 0x01C99E2C) CppSourcer.plw, vCSourcer::DecompilePacket()+54 byte(s), D:\PROGRAMS\IdaSDK52\plugins\CppSourcer\vSourcer.cpp, line 305+18 byte(s) 001B:01E7815F (0x052BAB08 0x0012F6EC 0x0012F5DC 0x01C99E2C) CppSourcer.plw, vCEntity::CreateFunction()+175 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vmodule.cpp, line 94 001B:01E7CB1E (0x0012F75C 0x0012F704 0x01C99E2C 0xCCCCCCCC) CppSourcer.plw, vCModule::CreateEntityes()+350 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vmodule.cpp, line 862+9 byte(s) 001B:01E7EF2D (0x00000001 0x0012F824 0x0012F77C 0x01C99E2C) CppSourcer.plw, vCModule::Compile()+365 byte(s), d:\programs\idasdk52\plugins\cppsourcer\vmodule.cpp, line 1218 001B:01EA9D9B (0x0012F888 0x400E7DFC 0x01C99E2C 0xCCCCCCCC) CppSourcer.plw, vCSourcer::ProcessModules()+219 byte(s), D:\PROGRAMS\IdaSDK52\plugins\CppSourcer\vSourcer.cpp, line 757+12 byte(s) 001B:01DF7BA5 (0x00000000 0x400E7DFC 0x01C99E2C 0xCCCCCCCC) CppSourcer.plw, DecompileContent()+693 byte(s), d:\programs\idasdk52\plugins\cppsourcer\cppsourcer.cpp, line 87 001B:01DF7D7F (0x00000000 0x010C0D6C 0x63415407 0x6E6F6974) CppSourcer.plw, DecompileAll()+79 byte(s), d:\programs\idasdk52\plugins\cppsourcer\cppsourcer.cpp, line 104+5 byte(s) 001B:00470888 (0x010C0D6C 0x400E71A6 0x01001E9C 0x400E7DFC) idag.exe, System()+19924 byte(s) 001B:400387F2 (0x0012FA78 0x0012FA54 0x400FEAF7 0x0012FA78) rtl60.bpl, Classes()+18 byte(s) 001B:400FEADB (0x400F25D4 0x010012C8 0x00001E9C 0x0012FADC) vcl60.bpl, Menus()+183 byte(s) 001B:400F262F (0x01100F00 0x0012FAD4 0x0012FB54 0x01100FEF) vcl60.bpl, Forms()+91 byte(s) 001B:400F5793 (0x003D0001 0x00000000 0x0012FB18 0x77D48709) vcl60.bpl, Forms()+83 byte(s) //===============================================================
Vam Ну SEH валиден для ф-ции, а VEH для процесса. Для некоторых ошибок видимо не установлены SEH, раз появляется окно с исключением, на первое время можно просто добавить пару строк в плагин: Код (Text): void ErrorMessage() { msg("error, bla bla bla"); } void __stdcall run(int arg) { AddVectoredExceptionHandler(0, (PVECTORED_EXCEPTION_HANDLER)ErrorMessage); ... И все. Кстати на каком-то приложении CppSourcer просто вырубился(стек не валиден стал скорее всего), для таких случаев VEH даст возможность увидеть в логе хоть чтото.
На все функции плагина, вызываемые из ИДА установлены SEH обработчики. Они 2х типов: 1. Корректируемые - осуществляется воостановление состояния до исключения и продолжение работы (запись в соответствующий rpt файл, отсутствие окна исключения). 2. Фатальные - восстановить состояние программы не представляется возможным (запись в СppSourcer.rpt, вывод окна с исключением, по нажатию ОК завершение работы плагина, ИДА остается в рабочем состоянии). Добавить, конечно, можно, только что изменится... Почему-то у меня работает так, как и задумано (и дебаг и релиз версии), а вот у других по-другому...
Что значит фатальная ошибка ? Такая только одна - не валидный стек потока. В любых других случаях исключение обрабатывается. Чем более высокого уровня механизм, обрабатывающий исключение, тем менее он гибкий. Для полного контроля следует перехватить KiUserExceptionDispatcher(), либо перенаправить KeUserExceptionDispatcher(глобально в системе), либо модифицировать код ядра(ветвление локально для процесса).
Vam Первый раз пролистав листинг вашего кодеса сделал вывод что он кривой, у вас в одной из процедур проверка Build >= 32768, такого не существует насколько знаю.
Ну как минимум - исчезнут мессадж боксы с исключениями типа access violation =) Это нормально пока, просто нужно тестить как можно больше и исправлять ошибки.
Фатальная для меня, не для потока, обработать исключение в этом случае можно, только продолжить работу вот уже нельзя, поэтому такой случай завершится с выходом из плагина с сообщением ошибки. Сейчас делается немного по-другому: обработчик такого исключения создает rpt файл с сообщением и передает дальнейшую обработку исключения системе, которая выводит окно исключения и осуществляет выход из плагина. Не понял о каком "кодесе" идет речь? Эти боксы я могу и сейчас убрать, изменив лишь EXCEPTION_CONTINUE_SEARCH на EXCEPTION_EXECUTE_HANDLER, но суть от этого не изменится. Бокс для меня служит индикацией завершения плагина, иначе было бы втемную. Писать сообщения на такие исключения не считаю нужным, вся требуемая инфа по его исправлению есть в RPT файле. В тестовом примере UnDecorator есть одно обработанное исключение в rpt, но в релиз версии, в отличии от дебаг версии, оно абсолютно не информативно. +100
Если о нем, то это просто как тестовый пример, когда-то давно разбирал эту функцию (UnDecorateSymbolName) из библиотеки dbghelp, но так до конца я его не отладил, отпала необходимость.
Хочу присоединиться к предыдущему оратору и из прочитанных мной 8-ми страницах этой темы, где-то мелькало "после завершения начального этапа можно подумать о выкладывании в опен сорсе"... где-то так!!!
З.Ы. Из нароботок можно и отдельный декомпиллер соорудить , для отдельно взятого проекта... во всяком случае многим это облегчело бы жизнь, кто мучается подобными задачами.
Попробовал , скомпилил админ_консоль , всё как расписано с файлом отладки... в иду плагин погрузил.... а результат=0! Крит еррор... кому интересно исходники и скомпиленный exe тут: http://depositfiles.com/files/q8tvsf5dy
Windows XP 5.1 SP3 ........ --- CPU detection --- Number of system processors: 2 Number of available processors: 2 Processor 0: CPU: AuthenticAMD AMD Athlon(tm) 7850 Dual-Core Processor Family: 15, Model: 2, Stepping: 3 FPU: on-chip CPU Speed (estimated): 2812.708814 MHz MMX: present SSE: present 3DNow!: present Serial number not present or disabled Processor 1: CPU: AuthenticAMD AMD Athlon(tm) 7850 Dual-Core Processor Family: 15, Model: 2, Stepping: 3 FPU: on-chip CPU Speed (estimated): 2812.708902 MHz MMX: present SSE: present 3DNow!: present Serial number not present or disabled ........ IDApro 5.4 Результат:
ivanches С Ида 5.4 может правильно и не работать, т.к. используется IDA SDK 5.2 Во вложении "правильный" результат декомпиляции.
Интересно , но в правильном результате есть файлик UnDecoratorMsvc.rpt, а в мануале сказано вроде, что де .rpt только при критах появляется...
А может реальней и проще ,как-то .Net reflector переделать, чтоб unmanaged C++ декомпилил, managed декомпилит.... ..... З.Ы. Прошу прощения у автора ветки, это просто размышления/поиски/фантазии , т.к. в этом почти нуб полный...