Влияние отладчиков на исполнение проги

Тема в разделе "WASM.WIN32", создана пользователем VooDooo, 30 сен 2005.

  1. VooDooo

    VooDooo New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2005
    Сообщения:
    30
    Адрес:
    Russia
    Излагаю суть проблемы (все изложениое ниже относиться к Win98SE). Прогон программы через отладчик (через SoftIce или WinDAsm) приводит к другим результатам нежели ее непосредственный запуск из-под Win. Мною было замечено, что при старте программ из-под Ice он брякается еще до того как страница по адресу 0x00401000 (стартовый проги) еще не загружена и на экране в кодовой области мы видим только инвалидов. Команда trace приводит к прозрачной для SI подкачке нужной страницы и после этого к выполнению текущей команды, но физический адресс этой страницы не тот же самый, если бы мы исполнялись под Win без отладки. Вопрос: кто в данном случае занимается подкачкой, Win или кто? Как заставить сайс ловить страничные сбои (бряк bpint OD или OE не помогает при трассировке - что наводит на мысль, что сайс занимается этим сам)? Какие еще влияния при отладке оказывает сайс (в конечном счете я получая не то же самое - если нужен код, то я его представлю, посмотрите)? соответственно как этих влияний избежать и можно ли избежать их вобще?
     
  2. Sergey_R

    Sergey_R Member

    Публикаций:
    0
    Регистрация:
    9 янв 2005
    Сообщения:
    138
    VooDooo



    Возможно, собственно SI здесь не причем. Программа может быть сделана так. Она может быть "научена" понимать присутствие отладчика в системе, и при этом необязательно закрываться, а просто работать "нештатно" ;о).





    Не факт, что в этом случае программа не загружена, просто адресный контекст еще может быть не переключен на нее, вот ты и видишь на экране нечто... Попробуй воспользоваться в этот момент командой 'Addr'. Думаю, после этого ты увидишь все, что тебе нужно.





    Так ведь никто не гарантирует, что загрузка программы ВСЕГДА производится по одним и тем же ФИЗИЧЕСКИМ адресам.





    Думаю, что все же Win. В противном случае SI придется поддерживать в рабочем состоянии ВСЮ виртуальную память системы, а не только конкретно свою и отлаживаемой программы. В пользу такой точки зрения еще говорит наличие среди сообщений об ошибках SI "Page not present" и "Int0E Fault in SoftICE at address XXXXX offset XXXXX Fault Code=XXXX". Они было бы просто не нужно, если бы SI обрабатывал все это сам.





    Здесь помочь не могу, но, думается, что SI не разрешено этого делать ("во избежание..." ;о)). Разве что найти сами обработчики и ставить контрольные точки непосредственно на них...

    Пусть меня поправят знающие люди. :о)
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Тоже замечал, что при отладке SI-ом выполнение программы может отличаться от обычного запуска. Порядок вызова системой асинхронных функций в драйвере зависит от того, стоят ли по ходу выполнения бряки. (Вызов функций контролировал с помощью DbgPrint). Система - Win2000
     
  4. VooDooo

    VooDooo New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2005
    Сообщения:
    30
    Адрес:
    Russia
    Sergey_R

    "Возможно, собственно SI здесь не причем. Программа может быть сделана так. Она может быть "научена" понимать присутствие отладчика в системе, и при этом необязательно закрываться, а просто работать "нештатно" ;о)."

    Так я же сам писал эту прогу, я свою отлаживаю и уверяю, присутствие отладчика я не выявляю.

    "Не факт, что в этом случае программа не загружена, просто адресный контекст еще может быть не переключен на нее, вот ты и видишь на экране нечто... Попробуй воспользоваться в этот момент командой 'Addr'. Думаю, после этого ты увидишь все, что тебе нужно."

    Я не сказал, что программа не загружена, я сказал, что страница не загружена. Образ то понятно дело давно создан и exe-шник спроецирован на оперативку, но вот только в ОП этой страницы на данный момент нет и поэтому кто-то обязан ее подгрузить либо Win либо сайс.

    Встречный вопрос на счет addr. Почему Win не загрузив контекста процесса пытается исполнять один из его потоков (в данном случае единственный и главный).

    "Здесь помочь не могу, но, думается, что SI не разрешено этого делать ("во избежание..." ;о)). Разве что найти сами обработчики и ставить контрольные точки непосредственно на них... "

    Я не пойму что тут особенного :o ??? просто поймали прерывание и все ну нет страницы в ОП и нет, я может хочу посмотреть как она с винта в ОП читается, может мне интересно.

    На счет обработки подкачки страниц сайсом. Понятно, что не делает это сам когда он просто висит в памяти и ждет CTRL-D. Я говорю про ситуацию непосредственной отладки. Вот не было страницы в памяти (т.е. страница отмечена как NP при команде page) потом встречается нам команда которая обращается к этой странице тем или иным образом - нужна подкачка... Нажимаем trace - бах и страница уже в ОП, а команда благополучно исполнена. Что то я не уверен, что сайс возвращает управление Win для подкачки...

    gilg

    Насчет бряков:

    Если после первого останова незначительно подправить значение регистра EIP (допустим на следующую команду за той которая сейчас должна быть исполнена, но вместо нее на экране сейчас 0x401000 INVALID 0x401002 INVALID) то есть зделать trace для второй команды, то результат будет тем же, что и при запуске без отладчика.