gifts2017

Трассировка с использованием WinAPI функции OutputDebugString

Опубликовал Олег Лепешкин (loy) в раздел Программирование - Практика программирования

Простой способ отображения отладочных сообщений из нескольких сеансов в одном окне

Возникла потребность отладить код, который выполняется в нескольких параллельных сеансах. Хотелось видеть сообщения из всех сеансов в одном  окне. Журнал регистрации меня не устраивал. Решил использовать WinAPI функцию OutputDebugString. Сообщения, передаваемые этой функции, можно отслеживать с помощью программы DebugView или аналогичной.

Вызов WinAPI функции OutputDebugString осуществил с помощью внешней компоненты DynamicWrapperX. В модуле приложения создал экспортируемую фунцию, которая создает СОМ Объект DynamicWrapperX и помещает его в глобальную переменную для повторного использования, затем зарегистрировал в этом СОМ объекте WinAPI функцию OutputDebugString. И после успешной регистрации вызываю OutputDebugString и передаю ей отладочную строку. После выполнения функции отладочное сообщение появляется в окне программы DBGView.exe.

Программу DBGView.exe необходимо запустить до того, как начнут генерироваться отладочные сообщения.

 

// Вовод отладочной информации во внешние трассировщики типа DebugView - Dbgview.exe 
Процедура OutputDebugString( ОтладочнаяСтрока ) Экспорт

	Если гл_UserWrap = Неопределено Тогда		
		Попытка
			гл_UserWrap = Новый COMОбъект( "DynamicWrapperX" );
			гл_UserWrap.Register( "Kernel32.dll", "OutputDebugString", "i=s" );			
		Исключение
			гл_UserWrap = Ложь;
		КонецПопытки; 		
	КонецЕсли;
	
	Если гл_UserWrap <> Неопределено И ТипЗнч( гл_UserWrap ) = Тип( "COMОбъект" ) Тогда			
		гл_UserWrap.OutputDebugString( ОтладочнаяСтрока );		
	КонецЕсли;
	
КонецПроцедуры 

 

DebugView от Марка Руссиновича из Sysinternals (ныне Microsoft) живет здесь.

Внешняя компонента DynamicWrapperX живет здесь.

См. также

Подписаться Добавить вознаграждение
Комментарии
1. andrewks 08.01.14 10:25
это всё, конечно, круто, но чем не устроил вариант записывать лог в текстовый файл?
3. Олег Лепешкин (loy) 08.01.14 16:45
(1)Этот способ хорош для получения сообщений в реальном времени. Позволяет увидеть картинку в процессе. И что для меня было важно - отображает сообщения от нескольких одновременно работающих сеансов. Такие задачи, конечно, возникают не часто. Текстовый лог файл тоже можно использовать, только в случае нескольких процессов надо обеспечить бесконфликтную запись в файл. Для той задачи, которую пришлось мне решать, эта функция из WinAPI подошла оптимально.
Прикрепленные файлы:
GoodBeaver; +1 Ответить 3
4. Дмитрий Башинский (bashinsky) 09.01.14 08:42
(3) loy, а вся история где-нибудь хранится? Или ее нужно вручную сохранять?
5. Евгений Стоянов (quick) 09.01.14 09:52
отличная тема для отладки COM компонент, спасибо за подсказку.
6. Олег Лепешкин (loy) 09.01.14 10:31
(4) bashinsky, В DebugView можно включить авто-сохранение лог файла. Помимо имени файла, можно настраивать размер, периодичность и ряд других параметров лог файла.
7. Евгений Мартыненков (JohnyDeath) 09.01.14 10:45
Как я понял, это прокатит только для неуправляемого приложения. Так?
8. Nathan Rothschild (Rothschild) 09.01.14 10:45
(3) loy,
Да,
наверное будет полезно при отладке фоновых заданий,
запускающих параллельно дочерние фоновые задания.
9. Nathan Rothschild (Rothschild) 09.01.14 10:52

Внешняя компонента DynamicWrapperX живет здесь.



ссылка не работает, которая на слове "здесь".


нашел рабочую ссылку http://www.script-coding.com/dynwrapx1_00.zip
на этом ресурсе http://www.script-coding.com/dynwrapx.html#download
10. Nathan Rothschild (Rothschild) 09.01.14 11:02
странно, что-то IE у меня глючит.


после добавления ссылок в пост (9) хитрая ссылка в статье
http://infostart.ru/redirect.php?url=aHR0cDovL3d3dy5zY3JpcHQtY29kaW5nLmNvbS9keW53cmFweC5odG1s­
заработала.
11. Nathan Rothschild (Rothschild) 09.01.14 11:15
(7) JohnyDeath, в смысле?
Сомневаешься, что можно подключить внешнюю компоненту COM
в управляемом приложении ???
12. Sieg Heil (mdie) 09.01.14 11:32
Отличная идея, но я бы использовал DbgPrint из ntdll
13. Евгений Мартыненков (JohnyDeath) 09.01.14 11:36
(11) Rothschild, сомневаюсь в глобальной переменной на сервере.
14. Nathan Rothschild (Rothschild) 09.01.14 14:34
(13) JohnyDeath,
ну для файловой базы вроде бы справедливо утверждение: Сервер = Клиент

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

---

А что нельзя для выдачи каждого отладочного сообщения создавать свой COM-объект ???
15. Nathan Rothschild (Rothschild) 09.01.14 14:40
(0)(14):
что будет,
если одновремено выдаются сообщения как на стороне клиентов, так и на стороне сервера
и все это еще выполняетися на разных машинах ???
---
прога DebugView может ловить сообщения с разных компов?
16. Олег Лепешкин (loy) 09.01.14 17:26
(15) Rothschild, Да, эта программа может ловить сообщения и с удаленных компьютеров, в help есть раздел Remote Monitoring, а в меню программы есть пункты Computer\Connect..., но, если честно, я эту возможность ни разу не пробовал. Рекомендую глянуть эту программку - она не требует установки - в архиве только exe, help и текст лицензии. Если раньше не приходилось сталкиваться с утилитами от Sysinternals http://technet.microsoft.com/ru-ru/sysinternals - очень рекомендую, утилит много, на самые разные темы. Некоторыми из них пользуюсь регулярно.
Rothschild; +1 Ответить
17. Алексей 1 (AlX0id) 09.01.14 20:10
Таки это.. а чем все же журнал регистрации был плох? %)
18. Олег Лепешкин (loy) 09.01.14 23:46
(17) AlX0id, О том, почему я выбрал именно этот вариант решения, я писал в сообщении (3). Я пробовал использовать для той задачи журнал регистрации. Было не удобно - он сильно тормозил и надо было постоянно обновлять список. И я вспомнил о DebugView - эта утилита неоднократно выручала меня в различных проектах (не для 1С:Предприятия)
19. Алексей 1 (AlX0id) 10.01.14 01:28
(18) loy,
Какая-то странная постановка задачи - для целей отладки реализовать онлайн-просмотр сообщений от софта.. Ну ладно, каждый пляшет, как умеет )
20. Александр Дуденков (haggart) 13.01.14 15:21
Постановка задачи действительно странная, можно было просто записывать сообщения в общее хранилище. Но раз уже так модно заморачиваться с API функциями, то можно было бы сваять, как мне кажется, более востребованный tool вырубания сеансов зависших пользователей на удаленных компьютерах.