Пример: Код (Text): function Enumer(AWnd: HWND; lParam: LPARAM): BOOL; stdcall; begin Result := True; end; procedure TForm1.FormCreate(Sender: TObject); begin EnumWindows(@Enumer, 0); end; Начинаем отлаживаться в среде, встаём на строчку с EnumWindows, жмём "Trace Into" - отладчик встаёт на begin в Enumer. Вопрос: как он это делает? В смысле, я в курсе про DebugAPI, WaitForDebugEvent, флаг трассировки. Но EnumWindows отладчик же не выполняет по-командно (уж слишком быстро она работает)? Значит, он ставит бряк на Enumer, а EnumWindows запускает в обычном прогоне? Как тогда он узнаёт, куда надо ставить бряк? Если такой вопрос уже был - дайте ссылку, пожалуйста, поиском найти не удалось (может не то искал?). Обычно находятся краткие мануалы "как написать отладчик" на использование основных функций DebugAPI.
Enumer имеет адрес. Вот по этому адресу и ставится бряк. Потому, что для этого адреса есть дебуг инфо. Переключись в режим CPU, и ты сможешь протрассировать EnumWindow
>>> Enumer имеет адрес. Вот по этому адресу и ставится бряк. Это понятно. Про отладочную инфу тоже понятно. Но как отладчик узнал, что бряк надо ставить именно на Enumer? Откуда он знает, что EnumWindows не может вызвать функцию Funcenstein, которая лежит за километр от этого кода? Или отладчик изначально ставит бряки на все функции программы?
>>> Ему видимо не влом, посчитать на одну команду вперёд. Да ладно... Т.е. отладчик просмотрел код EnumWindows, выяснил все пути её выполнения (включая миллион возможных подфункций), и поставил бряки на все функции из этого пути, для которых у него есть отладочная инфа? Как-то я плохо себе это представляю.