Как вы можете нарушить создание ручки? - PullRequest
0 голосов
/ 16 марта 2009

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

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

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

Ответы [ 2 ]

1 голос
/ 16 марта 2009

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

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

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

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

1 голос
/ 16 марта 2009

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

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

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

...