Доброго времени суток! Отлаживаю софтину. Если пустить все на самотек и не брякать ее ни разу - все проходит чудесно. Стоит хоть раз ее тормознуть, как в определенном месте (вернее местах) она начинает стабильно падать. Вот, к примеру, одно из таких мест: Код (Text): CPU Disasm Address Hex dump Command Comments 0044FF8A ║► ┌8B06 MOV EAX,DWORD PTR DS:[ESI] 0044FF8C ║· │83C6 04 ADD ESI,4 0044FF8F │8907 MOV DWORD PTR DS:[EDI],EAX 0044FF91 ║· │83C7 04 ADD EDI,4 0044FF94 ║· │49 DEC ECX 0044FF95 ║·▲└75 F3 JNE SHORT 0044FF8A В данном случае в регистре EDI лежит число 0x01300018h - притом, что видимая отладчиком область памяти кончается на 0x004D6FF0h. При попытке записи Код (Text): 0044FF8F │8907 MOV DWORD PTR DS:[EDI],EAX Отладчик грязно матерится на Access violation. Предлагает либо застрелиться, либо нажать Shift+Click Последний вариант выкидывает в такое вот место: Код (Text): CPU Disasm Address Hex dump Command Comments 7C90E47C ║· 8B4C24 04 MOV ECX,DWORD PTR SS:[ESP+4] ; ntdll.KiUserExceptionDispatcher(pExceptionRecord,pContext) 7C90E480 ║· 8B1C24 MOV EBX,DWORD PTR SS:[ESP] 7C90E483 ║· 51 PUSH ECX ; ╓Arg2 7C90E484 ║· 53 PUSH EBX ; ║Arg1 7C90E485 ║· E8 84C00100 CALL 7C92A50E ; └ntdll.7C92A50E Как я понял (возможно, ошибаюсь), выше висит отлов и обработка исключений, которая исправно их ловит, но не в меру умный OlyDbg делает это раньше, и не дает работать (цикл в несколько тысяч итераций особо не прощелкаешь). В связи с этим вопрос - что делать? Действительно ли это правомерный экзепшен, предвиденный разработчкиами или же он поражден бряком дебагера? Если первое - как отучить OlyDbg на этом падать? Код однозначно полезный - забивание NOP'ами приводит к тому, что исчезает то, что мне и нужно исправить.
Посмотри установлен ли обработчик SEH помимо дефолтного нулевого, если нет то ставь бряк на ближайшем. В простейшем случае.
Эх, забыл уточнить, что я чайник... х_х Ладно, попробую разобраться. SEH - это механизм отлова исключений, нэ? Дефолтный нулевой SEH - это системный SEH, так? Тогда встает вопрос - как посмотерть - установлен ли он? И опять же, если исключение выбрасывает меня не вон из проги, а в какой-то участок ее памяти, видимо, там обработчик все-таки есть? Наконец что делать дальше? Бряк на ближайшем - эт здорово, но мне то нужно после конкретного кусочка кода... Разъясню ситуацию: Ломаю игру, пытаясь прикрутить к ней русские буковки. По-умолчанию все символы выше 127 игнорировались. Причина была в знаковых байтах. Нашел, исправил. Теперь она начала некоторые буквы глотать. В области памяти, в которой появляется выводимый текст на их месте стоят 0. Бряк на запись памяти не помогает - она часто используется другими функциями. По стеку прошел вверх до функции, которая также вызывается слишком часто и бряк на ней не поставишь ввиду того, что свернуть приложение я могу лишь раз (причина тут: http://www.wasm.ru/forum/viewtopic.php?id=43328). Поэтому решил остановить отладку хоткеем за секунду до вывода текста. Остановил. Дальнейший запуск приводит к вышеозначенной проблеме. Так что мне бы в первую очередь чтобы дебагер не ругался и позволил коду исполняться как тому нравится. Можно, конечно, перенести код в другое место, сделать к нему и от него джампы, сам код расширить и встроить проверку на выход за границе доступной памяти. Но а) лень; б) не уверен, что баги родные, а не вызванные отладкой.