Мне казалось, что с Олькой особых проблем уже не будет. Что не знаю, - прочитаю. Но вот, - попал. Где-то в глубине модуля регистр EAX получает значение FFFFFED4. Я хочу поставить Condition - чтобы отловить этот момент. Делаю рестарт... Shift+F2 -> ввожу условие -> EAX==FFFFFED4 -> F9. Остановов нет!! Что здесь неправильно?! Спасибо.
Чтобы условие сработало нужна трассировка, а не исполнение поскольку аппаратными средствами такой бряк не ставится. У Криса была подробная статья на эту тему, не помню как называлась.
Хзхз, у меня оконные сообщения ловились при условном бряке при запуске на выполнение, а не при трассировке.
С утра сегодня запустил трассировку с условным остановом. Всего одна процедура, - не самого верхнего уровня. Полдня прошло, - все еще "tracing" Причем, время от времени притормаживаю, проверяю. Не висит, нет...
Трассировка на Ольке - штука очень медленная. Сегодня за день я так и не попал на нужную точку Отсюда родился такой вопрос: для ускорения дела я выставил опцию "Always trace over system DLL". Однако, время от времения "жмя" на ESC, определенно (и не раз!) тормозился в ntdll... Правильно ли это или просто опция не работает? В хелпе сказано - с этой опцией мы проезжаем мимо системных модулей... Или я опять чего-то не понял? Спасибо.
Tihon Механизм отладочных сообщений очень медленный. Используйте VEH, тогда относительно трейса олли будет быстрее в пару тысяч раз. Там всё просто - фиксите трассировочный баг и взводите TF, ну есчо нотифи на создание потоков поставить.
Хороший вопрос Долго рассказывать, но попробую. Одна и та же программная оболочка к компьютерной карте либо нормально открывает выбранную карту, либо выводит сообщение об отсутствии лицензии на данную карту. Определен участок, на котором происходит "уход с курса". Код (Text): CALL DWORD PTR DS:[EBX+B8] TEST EAX,EAX JGE SHORT GWSdiApp.005AD34D PUSH 0 PUSH EAX MOV ECX,EDI CALL ShowChartFileErrorMessage После первого CALL'a (именно на его трассировку я сегодня убил день без результата!), если карта работает, EAX = 0 и выполнение пролетает мимо второго CALL'a. Если карта НЕ работает, - EAX = FFFFFEA94 и мы попадаем на второй CALL, и на Exception...
Явно - загрузка карты. Это легко понять по именам процедур внутри - типа Load, AddChart и т.д. Когда я заказал трассировку с логированием в текстовый файл, - на 80 мб текста мое терпение кончилось, но до RET было еще примерно столько же :rolleyes:
Tihon Ну я так и думал, что это возврат значения из функции. Прежде чем тупо трейсить, стоило бы на дизасм самой функции глянуть - может присвоение этого значение проще поиском найти, или по кр.мере по ретам пройтись и усл.переходы отмотать назад
К сожалению, не все так просто... "Тупо трейсить" - это уже от отчаяния. Ну, не смог я просто глазами и руками найти нужный адрес... Хотя и ооочень старался. А вообще-то в этом дизасме я уже месяца два сижу.
Tihon Собирайте трассировщик. Желательно ядерный, тогда будет очень быстро исполняться. Нужно зарегать диспетчер исключений в KiDebugRoutine(используйте поиск по форуму). По сути обработка ничем не отличается от юзермодной. Опишу посредством VEH: o VEH из юзермода удалённо зарегать нельзя, куки не известны. Посему нужно исполнить код в контексте целевого процесса. Разумно прицепить к нему модуль. o Находите вторую инструкцию диспетчера исключений, это делается обработкой исключения отличного от #DB, которое возникло при взведённом TF. Можно просто проверить адрес выше [KiUserExceptionDispatcher], либо вручную захардкодить(для отладки само то). Когда на инструкции по этому адресу возникнет трассировочный останов необходимо сбросить TF и отпустить тред. Иначе если в процессе трассировки возникнет сепшен, это приведёт к деадлоку. o Ставите нотифи на создание тредов(хз откуда юзается ваш код), либо брейк на начало и конец необходимой процедуры и тп. Это необходимо для начала трассировки кода в новых тредах. Жёсткий брейк инициирует начало трейса, окончание его по срабатыванию второго брейка, либо когда встретится конечный Ip. Следует использовать средства блокирования трейса, тоесть если тред покинет текущий стековый фрейм без обращения к нему, например вернувшись в вызывающий код через сех механизм, необходимо трейс прекратить. o Диспетчер исключений взводит EFlags.TF и отпускает тред, проверяя на каждом шаге значение регистра Eax. Пропускная способность ~300k/s инструкций(приближённая оценка).