Отладка вызовов OutputDebugString в Delphi - PullRequest
5 голосов
/ 23 ноября 2010

В моем приложении есть какой-то "мошеннический" вызов OutputDebugString, который печатает "T", но я не могу просто найти его.

Можно ли как-то установить точку останова на функцию OutputDebugString и посмотреть, откуда она вызывается?

Я использую Delphi 2009.

Ответы [ 2 ]

13 голосов
/ 23 ноября 2010

Сколько звонков на OutputDebugString есть в вашем проекте?Вы можете использовать диалоговое окно «Найти в файлах», чтобы найти их все, и если их не так много, проблем не должно быть.

В противном случае, вы можете - конечно - использовать поиск изаменить и заменить все OutputDebugString( на raise Exception.Create(.

Вы также можете написать функцию

procedure OutputDebugString(const Str: string);
begin
  raise Exception.Create(Str);
end;

в единице, используемой каждой другой единицей в проекте.Если после Windows.pas в списке uses объявлен только этот новый модуль, эта новая функция будет использоваться вместо Windows.pas.

Обновление

Да, вы можете разместитьточки останова внутри Windows.pas.Сначала в вашем проекте перейдите в «Параметры проекта» и в разделе «Отладка» выберите «Использовать отладочные DCU».Затем вы можете перейти к Windows.pas и установить точку останова в строке 30769:

procedure OutputDebugString; external kernel32 name 'OutputDebugStringW';
7 голосов
/ 27 ноября 2010
  • Запустите ваше приложение.
  • Поставь на паузу.
  • Открыть представление / Отладка Windows / Модули окно.
  • Поиск по kernel32.dll. Дважды щелкните по нему.
  • Поиск OutputDebugStringA. двойной щелкните по нему.
  • Откроется окно ЦП. Установить точку останова на самая первая строка.
  • Поиск OutputDebugStringW. двойной щелкните по нему.
  • Откроется окно ЦП. Установить точку останова на самая первая строка.

Готово.

Теперь любой вызов OutputDebugString из вашего приложения будет прерываться в точке останова. Вы также можете включить ведение журнала в свойствах точки останова для регистрации стека вызовов.

...