Существует ли какой-либо быстрый способ во время отладки остановиться на определенном сообщении Windows или API?


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

1 6

1 ответ:

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

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

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

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

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

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