Как моя программа будет слушать выходные данные OutputDebugString и разрешать запуск нескольких экземпляров? - PullRequest
1 голос
/ 14 октября 2019

Вот мой сценарий: у меня есть программа, которая производит отладочный вывод с OutputDebugString(), который может содержать сообщения, указывающие на ошибки. Я хочу запустить эту программу внутри ежедневной сборки и автоматически прослушивать вывод отладочной информации, анализировать ее и сообщать о подозрительных выводах.

Существует несколько примеров таких реализаций слушателя, например эта . Все они делают одно и то же - слушают общесистемное событие, а затем читают данные из сопоставления файлов. Проблема в том, что этот протокол допускает только один экземпляр прослушивателя - тот, кто первым получает событие, получает доступ к выходным данным.

То же самое с программой DebugView. Если у меня запущен экземпляр, то при запуске другого экземпляра получается «отключенный» экземпляр, и он не может «подключиться локально».

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

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

1 Ответ

3 голосов
/ 17 октября 2019

Я следовал подсказке, данной пользователем 500 - Внутренняя ошибка сервера в комментариях, и попытался «притвориться Visual Studio». Это очень близко к уровню сложности "держать мое пиво" (но у меня более 10 лет опыта разработки программного обеспечения для WinAPI). Все это заняло несколько часов, а реализация - это менее 200 строк кода на C ++, включая громоздкий код для вызова функций WinAPI и код, который фильтрует вывод и сообщает о подозрительных элементах удобным для использования способом.

Интересная частьв том, что я использовал Visual Studio для написания и отладки кода - Visual Studio выполняла функции отладчика для моей разрабатываемой программы, а разрабатываемая программа выполняла функции отладчика для программы, которая создавала любопытные выходные данные отладки, и эта цепочка работает просто отлично.

Вот хороший учебник, чтобы получить идею и вдохновение: Написание базового отладчика Windows Это MSDN объяснение того, как написать основной цикл отладчика: Написание основного цикла отладчика.

Вот как это работает:

  1. Запустите программу, для которой вы хотите обработать отладочный вывод, используя CreateProcess() и передав флаг DEBUG_ONLY_THIS_PROCESS. Это запускает программу, приостановленную и находящуюся в режиме «отладки».
  2. Запустите бесконечный цикл и вызывайте WaitForDebugEvent() на каждой итерации. Вызов WaitForDebugEvent() возобновляет приостановленную программу и позволяет ей работать, пока не произойдет следующее событие отладки.
  3. Процесс OUTPUT_DEBUG_STRING_EVENT, используйте ReadProcessMemory(), чтобы скопировать строку из отлаживаемого процесса, обработайте строку так, как выв порядке.
  4. Также процесс EXIT_PROCESS_DEBUG_EVENT - это означает, что отлаживаемый процесс завершился, и вы, вероятно, захотите завершить цикл.
  5. Также процесс EXCEPTION_DEBUG_EVENT - когда EXCEPTION_DEBUG_INFO.dwFirstChance равен нулю, вынеобходимо прервать отлаживаемый процесс, используя TerminateProcess(), в противном случае вы получите неудобное диалоговое окно «Программа перестала работать» из Windows
  6. Вызов ContinueDebugEvent() в конце итерации цикла, передайте DBG_EXCEPTION_NOT_HANDLED.

Вот и все. Да, теперь вы можете утверждать, что у вас есть опыт написания отладчика.

...