Есть ли быстрый способ отладки остановиться на конкретном сообщении Windows или API? - PullRequest
6 голосов
/ 28 февраля 2012

Итак, я хочу поместить точку останова в конкретное сообщение API или Windows.Я не нахожу простой способ сделать это без написания кода в любой версии Delphi.Есть ли способ сделать это похожим, как я могу поставить точку останова в доступе к памяти?

Ответы [ 2 ]

12 голосов
/ 28 февраля 2012

Чтобы остановить любой вызов функции API, найдите ее в разделе implementation в Windows.pas (или там, где объявлена ​​интересующая функция) и установите точку останова. Это заботится о функциях, которые вы используете с динамическим связыванием во время загрузки. Для динамического связывания во время выполнения (LoadLibrary и GetProcAddress) вам понадобится другая техника. Переменная, которая получает результат GetProcAddress, будет содержать адрес, по которому вы хотите разорвать, но я не знаю, как вручную установить точку останова по этому адресу.

Остановка в окне сообщения сложнее, так как сообщения могут быть получены во многих местах. Вместо этого вам придется использовать условные контрольные точки.

Чтобы перехватить большинство отправленных сообщений, вы можете поставить точку останова в TApplication.HandleMessage на первой строке после вызова PeekMessage. Установите условие равным Msg.Message = x. HandleMessage заботится о сообщениях, отправляемых в очередь сообщений основного потока для основного цикла сообщений Application.Run, а также о модальных циклах сообщений VCL. Другие модальные диалоги (например, Windows.MessageBox) не будут использовать его.

Наблюдать за отправленными сообщениями сложнее, поскольку ОС напрямую отправляет их в целевые оконные процедуры. Вам нужно будет установить точку останова в процедуре окна каждого интересующего вас класса окна. Вы можете получить большинство оконных классов VCL, поместив условную точку останова в Classes.StdWndProc.

Имейте в виду, что условные контрольные точки могут быть очень медленными. Они работают отладчиком, помещая туда безусловную точку останова 1025 *, и когда ОС запускает ее, отладчик вступает во владение, проверяет условие и затем возобновляет выполнение, если условие не выполняется. Это может потребовать много накладных расходов, переключаясь между отладчиком и вашим приложением; программы получают лотов сообщений, поэтому, если вы можете найти способ избежать прерывания отладчиком вашей программы для проверки каждого из них , сделайте это.

Если это невозможно для того, что вы пытаетесь отлаживать, тогда я рекомендую опубликовать новый вопрос, в котором вы опишите проблему, которую действительно пытаетесь решить.

1 голос
/ 28 февраля 2012

Вам нужно будет зайти в Настройки | Компоновщик и проверка «Отладка DCU». по умолчанию это не проверяется, поэтому отладчик не проходит весь VCL, когда вы пытаетесь работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...