2016-12-21 2 views
0

Я пишу код, который контролирует, работает ли сторонний просмотрщик отладки (т. Е. DbgView). Я могу легко отлаживать отладочный отладчик с помощью Debugger.IsAttached, но для отслеживания DbgView вам необходимо отслеживать некоторые события. Я основывая свой код по этой статье здесь: http://unixwiz.net/techtips/outputdebugstring.htmlВы можете подождать, пока событие (событие Win32) будет сброшено?

Итак, прямо сейчас, у меня есть:

  IntPtr h1 = CreateEvent(IntPtr.Zero, false, false, "DBWIN_BUFFER_READY"); 
      WaitForSingleObject(h1, 0xFFFFFFFF); 
      //bool b2 = h1 != IntPtr.Zero; 
      CloseHandle(h1); 

Работает отлично. Блоки кода до запуска DbgView И начинается захват. Именно то, что я хочу. Теперь проблема в том, что я не могу сказать, когда захват прекращается.

Есть ли способ проверить, когда событие сброшено или выпущено или что-то, что делает DbgView? Предпочтительно без опроса события в цикле :).

+0

Какую проблему вы действительно пытаетесь решить? Что вы планируете делать, когда слушатель начинает слушать? Почему важно знать, когда слушатель перестает слушать? – IInspectable

+0

@ Идеальный, да, точно. Я хочу знать, когда начинается слушатель и когда слушатель останавливается. Debugger.IsAttached обрабатывает отладчики, но слушатели, такие как DbgView, работают по-другому, они не вызывают флаг IsAttached. Конечная игра должна генерировать только диагностическую информацию, когда кто-то слушает, так как это может быть дорого. Я хочу автоматизировать это поведение. Вышеприведенный код - это легкий индикатор, который кто-то слушает, но пытается узнать, когда они остановятся. – SledgeHammer

+0

Вы оценили применимость [Трассировка событий] (https://msdn.microsoft.com/en-us/library/windows/desktop/bb968803.aspx)? Это надежное решение проблемы, которую вы пытаетесь решить, опробовали и протестировали, и использовали ее во всей ОС. – IInspectable

ответ

1

Есть ли способ проверить, когда событие сброшено?

Нет, нет. Вы можете подождать, пока события будут установлены, но не будут сброшены. Вам понадобится другое событие, на котором вы можете подождать.

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

Событие, на которое вы ожидаете, не предназначено для использования с целью его использования. Это событие и его друг DBWIN_DATA_READY используются отладчиками для связи с OutputDebugString.

Одним из следствий этого является то, что любой отладчик, который захватывает OutputDebugString, создаст эти события. Таким образом, ваш текущий подход найдет практически любой отладчик, а не только DbgView.

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

+0

Фрагмент кода, который я опубликовал, очевидно, POC, а не код производства. Кроме того, Visual Studio не создает их. Как я уже упоминал в своем сообщении, отладчики работают по-другому, а просто отладочный просмотрщик, такой как DbgView. Debugger.IsAttached захватывает отладчики, но не DbgView. – SledgeHammer

+0

Если какой-либо отладчик хочет захватить OutputDebugString, вот как это сделать. Таким образом, вы обязательно получите других отладчиков. Ничто из этого не умаляет основную тягу, что просто. Вы не можете ждать, пока события будут сброшены. Это то, что вы спросили правильно? –