Вопрос

У меня есть приложение, которое порождает несколько дочерних процессов. Перед запуском дочернего элемента я создаю дескрипторы stdOut и stdErr для файла журнала (например, если я собираюсь запустить procA, я создаю дескрипторы для logA.log). Я установил эти ручки на дочерние процессы.

Глядя на ProcExplorer, я вижу, что у каждого дочернего процесса есть дескрипторы для каждого файла журнала (поэтому у procA есть дескрипторы logA, logB и т. д.). Это создает более поздние проблемы.

Я хочу видеть, когда procA создает дескриптор для logB. Есть идеи?

Это было полезно?

Решение

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

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

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

Другие советы

Вы спрашиваете, как взломать отладчик, когда дочерний процесс procA создает дескриптор для logB? Я предполагаю, что вы используете Windows, так как вы упомянули Process Explorer.

Один из способов сделать это - использовать Image File Execution Options ключ реестра, чтобы указать, что при каждом запуске procA.exe вы хотите запустить отладчик. Когда отладчик запускается, вы можете установить точку останова в коде, который создает дескриптор для logB, а затем позволить процессу продолжить. Это работает с любым отладчиком (таким как WinDbg или ntsd, или инструментами профилирования, такими как AQTime), а не только с Visual Studio.

Другой способ сделать это - указать отладчику подключаться ко всем дочерним процессам. Есть несколько способов включить это поведение с помощью WinDbg или ntsd . Таким образом, вы присоединяете отладчик к родительскому процессу, и он автоматически присоединяется к дочернему процессу procA, и вы можете установить точку останова в соответствующем коде.

Еще один способ - временно изменить код для создания исключения точки останова с помощью DebugBreak() , когда она создает дескриптор для logB, затем присоединяет отладчик, используя отладку точно в срок. Обратите внимание: если ваш код обрабатывает структурированные исключения без выражения фильтра исключений (что является плохой идеей), это не сработает и может привести к неожиданным результатам (взаимоблокировка, утечка памяти и т. Д.).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top