Как работает команда Trace Into в отладчиках MSVS/Delphi?

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

  1. Gun_Smoker

    Gun_Smoker New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2008
    Сообщения:
    4
    Пример:

    Код (Text):
    1. function Enumer(AWnd: HWND; lParam: LPARAM): BOOL; stdcall;
    2. begin
    3.   Result := True;
    4. end;
    5.  
    6. procedure TForm1.FormCreate(Sender: TObject);
    7. begin
    8.   EnumWindows(@Enumer, 0);
    9. end;
    Начинаем отлаживаться в среде, встаём на строчку с EnumWindows, жмём "Trace Into" - отладчик встаёт на begin в Enumer.

    Вопрос: как он это делает?

    В смысле, я в курсе про DebugAPI, WaitForDebugEvent, флаг трассировки.
    Но EnumWindows отладчик же не выполняет по-командно (уж слишком быстро она работает)? Значит, он ставит бряк на Enumer, а EnumWindows запускает в обычном прогоне? Как тогда он узнаёт, куда надо ставить бряк?

    Если такой вопрос уже был - дайте ссылку, пожалуйста, поиском найти не удалось (может не то искал?). Обычно находятся краткие мануалы "как написать отладчик" на использование основных функций DebugAPI.
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Enumer имеет адрес. Вот по этому адресу и ставится бряк. Потому, что для этого адреса есть дебуг инфо. Переключись в режим CPU, и ты сможешь протрассировать EnumWindow
     
  3. Gun_Smoker

    Gun_Smoker New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2008
    Сообщения:
    4
    >>> Enumer имеет адрес. Вот по этому адресу и ставится бряк.
    Это понятно. Про отладочную инфу тоже понятно.
    Но как отладчик узнал, что бряк надо ставить именно на Enumer? Откуда он знает, что EnumWindows не может вызвать функцию Funcenstein, которая лежит за километр от этого кода?
    Или отладчик изначально ставит бряки на все функции программы?
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Gun_Smoker
    Что? Ему видимо не влом, посчитать на одну команду вперёд. :)
     
  5. Gun_Smoker

    Gun_Smoker New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2008
    Сообщения:
    4
    >>> Ему видимо не влом, посчитать на одну команду вперёд. :)
    Да ладно... Т.е. отладчик просмотрел код EnumWindows, выяснил все пути её выполнения (включая миллион возможных подфункций), и поставил бряки на все функции из этого пути, для которых у него есть отладочная инфа?
    Как-то я плохо себе это представляю.
     
  6. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Gun_Smoker
    Фиг знает, может дебагер ставит бряк на выполнения на всю секцию кода.
     
  7. Gun_Smoker

    Gun_Smoker New Member

    Публикаций:
    0
    Регистрация:
    30 дек 2008
    Сообщения:
    4
    Ну, собственно, в этом вопрос и состоял :)))