UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 16:09
Оценка:
Привет!

Запускаю UWP приложуху. Цепляюсь отладчиком MSVC. Инжектирую DLL, в которой есть логгирование через OutputDebugString. Студия показывает вывод.

Наковырял в инете код, как самому получать отладочный вывод — https://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString

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

Запускаю UWP приложуху. Инжектирую DLL. В мониторе отладочного вывода — ничего не получаю. Подозреваю, что OutputDebugString по умолчанию там не работает, но MSVC что-то делает с процессом так, что OutputDebugString начинает работать. Вопрос — что она там делает такого? Есть идеи?
Re: UWP и OutputDebugString - как чтобы работало?
От: reversecode google
Дата: 02.06.23 16:18
Оценка:
https://learn.microsoft.com/en-us/answers/questions/961575/uwp-application-debug-mode-outputs-debug-informati
https://stackoverflow.com/questions/40590690/calling-outputdebugstring-in-a-c-uwp-project
Re[2]: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 16:23
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://learn.microsoft.com/en-us/answers/questions/961575/uwp-application-debug-mode-outputs-debug-informati

R>https://stackoverflow.com/questions/40590690/calling-outputdebugstring-in-a-c-uwp-project

Ты эти ссылки сам смотрел?
Re[3]: UWP и OutputDebugString - как чтобы работало?
От: reversecode google
Дата: 02.06.23 16:26
Оценка:
естественно
только словами ксерокопировать не хочу
начиная от того что приложение должно быть в дебаг режиме
заканчивая тем что в C# выпиливается та функция
и нужно использовать другую
да еще и возможно настройки компилера надо поставить в нужный режим

то чего я так и не понял
это вас C/C++ или C#
поскольку UWP + OutputDebugString может быть как одно так и другое
Re[4]: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 16:30
Оценка:
Здравствуйте, reversecode, Вы писали:

R>только словами ксерокопировать не хочу

R>начиная от того что приложение должно быть в дебаг режиме

Debug/Release — это конфигурация сборки, как я понял, и ни что иное


R>заканчивая тем что в C# выпиливается та функция

R>и нужно использовать другую
R>да еще и возможно настройки компилера надо поставить в нужный режим

Это закидоны шарпа


R>то чего я так и не понял

R>это вас C/C++ или C#
R>поскольку UWP + OutputDebugString может быть как одно так и другое

Ну, если "Инжектирую DLL, в которой есть логгирование через OutputDebugString" не помогло догадаться, скажу прямо — у меня плюсы
Re: UWP и OutputDebugString - как чтобы работало?
От: reversecode google
Дата: 02.06.23 16:46
Оценка:
аа не дочитал внимательно
да делает
https://serverfault.com/questions/404043/windows-2008-r2-debugview-outputdebugstring-issue
http://www.unixwiz.net/techtips/outputdebugstring.html

можно попробовать запускать обе проги из под админа

а вообще windbg возьмите, тоже должен показать
если студия тяжеловата
Re: UWP и OutputDebugString - как чтобы работало?
От: pilgrim_ Россия  
Дата: 02.06.23 16:53
Оценка:
Здравствуйте, пффф, Вы писали:

П>Наковырял в инете код, как самому получать отладочный вывод — https://www.codeproject.com/Articles/23776/Mechanism-of-OutputDebugString


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


П>Запускаю UWP приложуху. Инжектирую DLL. В мониторе отладочного вывода — ничего не получаю. Подозреваю, что OutputDebugString по умолчанию там не работает, но MSVC что-то делает с процессом так, что OutputDebugString начинает работать. Вопрос — что она там делает такого? Есть идеи?


Насчёт UWP не подскажу, но думаю вряд-ли играет роль откуда вызвали OutputDebugString, скорее всего проблема в этом примере, попробуй DebugView.
Re[2]: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 17:13
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Насчёт UWP не подскажу, но думаю вряд-ли играет роль откуда вызвали OutputDebugString, скорее всего проблема в этом примере, попробуй DebugView.


DebugView работает, хотя я его пробовал, и он не работал. Но, вообще, у UWP приложений, как я понял, куча ограничений, поэтому и сомневался в OutputDebugString
Re: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 17:46
Оценка:
Здравствуйте, пффф, Вы писали:

В общем, получилось вот так:
В проге, из которой я запускаю UWP приложение, я мониторю (назовем Dbg-монитор) выхлоп OutputDebugView и инжектюсь в приложуху. Заодно, для проверки я сам оттуда отсылаю строку OutputDebugView.
Если DebugView запущен, то я вообще ничего не получаю, а DebugView получает все строки, и из моей проги, и из моей инжектированной DLL.
Если я запускаю свою прогу с Dbg-монитором без DebugView, то получаю то, что я сам вывел через OutputDebugView, но нет ничего от инжектированной DLL. Но — запускаю другую прогу, которая срёт в OutputDebugView — всё получаю нормально. Так же приходят сообщения от других приложений.
Какая-то хрень, короче. Не пойму, где фигня
Re: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 17:59
Оценка:
Здравствуйте, пффф, Вы писали:

Интересное поведение


// Мой код
OutputDebugStringA( "Hello through OutputDebugStringA\n");
OutputDebugStringW(L"Hello through OutputDebugStringW\n");
OutputDebugStringA( "Hello through OutputDebugStringA\n");
OutputDebugStringW(L"Hello through OutputDebugStringW\n");

---
// Что поймал DbgView
[24348] Hello through OutputDebugStringA 
[24348] Hello through OutputDebugStringA 

---
// Что поймал мой монитор
[ 24348] Hello through OutputDebugStringW 
[ 24348] Hello through OutputDebugStringW


Хм. Вроде бы всё должно по одному каналу передаваться, вроде нет отдельных для OutputDebugStringA и OutputDebugStringW, при этом с OutputDebugStringW логика обратная остальному юникодному API — оно конвертирует в однобайтовую кодировку и шлёт через OutputDebugStringA.
Re[2]: UWP и OutputDebugString - как чтобы работало?
От: pilgrim_ Россия  
Дата: 02.06.23 19:04
Оценка:
Здравствуйте, пффф, Вы писали:

П>Интересное поведение


П>Хм. Вроде бы всё должно по одному каналу передаваться, вроде нет отдельных для OutputDebugStringA и OutputDebugStringW, при этом с OutputDebugStringW логика обратная остальному юникодному API — оно конвертирует в однобайтовую кодировку и шлёт через OutputDebugStringA.


Из обычного win32 консольного приложения в DebugView долетают оба варианта (и OutputDebugStringA, и OutputDebugStringW), проверил на win7/win10.
Re[3]: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 19:17
Оценка:
Здравствуйте, pilgrim_, Вы писали:

П>>Хм. Вроде бы всё должно по одному каналу передаваться, вроде нет отдельных для OutputDebugStringA и OutputDebugStringW, при этом с OutputDebugStringW логика обратная остальному юникодному API — оно конвертирует в однобайтовую кодировку и шлёт через OutputDebugStringA.


_>Из обычного win32 консольного приложения в DebugView долетают оба варианта (и OutputDebugStringA, и OutputDebugStringW), проверил на win7/win10.


А параллельно никакой другой монитор запущен? А то когда моего монитора нет, всё ловит

// Код
    OutputDebugStringA( "Hello through OutputDebugStringA 1\n");
    OutputDebugStringW(L"Hello through OutputDebugStringW 1\n");
    OutputDebugStringA( "Hello through OutputDebugStringA 1\n");
    OutputDebugStringW(L"Hello through OutputDebugStringW 1\n");

    CoInit coInit;

    // ods_capture();
    CWinDebugMonitorImpl logMonitor;

    Sleep(500);

    OutputDebugStringA( "Hello through OutputDebugStringA 2\n");
    OutputDebugStringW(L"Hello through OutputDebugStringW 2\n");
    OutputDebugStringA( "Hello through OutputDebugStringA 2\n");
    OutputDebugStringW(L"Hello through OutputDebugStringW 2\n");

---

// DbgView
[28888] Hello through OutputDebugStringA 1
[28888] Hello through OutputDebugStringW 1
[28888] Hello through OutputDebugStringA 1
[28888] Hello through OutputDebugStringW 1
[28888] Hello through OutputDebugStringA 2
[28888] Hello through OutputDebugStringA 2
---
// Мой монитор
[ 28888] Hello through OutputDebugStringW 2
[ 28888] Hello through OutputDebugStringW 2


DbgView запущен висит, запускаю свою прогу и вижу такую картину, что ко мне приходят только OutputDebugStringW, а DbgView начинает ловить только OutputDebugStringA
Re[4]: UWP и OutputDebugString - как чтобы работало?
От: pilgrim_ Россия  
Дата: 02.06.23 19:23
Оценка:
Здравствуйте, пффф, Вы писали:

П>Здравствуйте, pilgrim_, Вы писали:


П>>>Хм. Вроде бы всё должно по одному каналу передаваться, вроде нет отдельных для OutputDebugStringA и OutputDebugStringW, при этом с OutputDebugStringW логика обратная остальному юникодному API — оно конвертирует в однобайтовую кодировку и шлёт через OutputDebugStringA.


_>>Из обычного win32 консольного приложения в DebugView долетают оба варианта (и OutputDebugStringA, и OutputDebugStringW), проверил на win7/win10.


П>А параллельно никакой другой монитор запущен? А то когда моего монитора нет, всё ловит


Не запущен, если запустить 2 версии DebugView, то получать сообщения будет только 1-й запущенный процесс, а во 2-м элементы тулбара будут задизейблены, если принудительно во 2-м сделать COnnect to local, то скажет что не удалось создать monitor. Возможно связанно с параметрами security при создании всяких event/mapping.

П>DbgView запущен висит, запускаю свою прогу и вижу такую картину, что ко мне приходят только OutputDebugStringW, а DbgView начинает ловить только OutputDebugStringA


А если в цикле вывод крутить? Может кто 1-й поймал, тот и победил
Re[5]: UWP и OutputDebugString - как чтобы работало?
От: пффф  
Дата: 02.06.23 20:13
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>А если в цикле вывод крутить? Может кто 1-й поймал, тот и победил


Запустил третью прогу, которая непрерывно срёт. Стабильно нечет попадает в DbgView, чёт — попадает ко мне. Но — если закрыть DbgView, то почему-то из инжектированной в UWP DLLки ко мне ничего не прилетает, а если запустить DbgView — то туда прилетает всё.
Re[6]: UWP и OutputDebugString - как чтобы работало?
От: reversecode google
Дата: 02.06.23 20:34
Оценка:
https://github.com/akinbicer/windows-nt5/blob/main/src/base/win32/client/debug.c#L539
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.