ハンドルの作成を中断するにはどうすればよいですか?
質問
複数の子プロセスを生成するアプリケーションがあります。子を起動する前に、ログファイルへのstdOutおよびstdErrハンドルを作成します(たとえば、procAを起動しようとしている場合、logA.logへのハンドルを作成します)。これらのハンドルを子プロセスに設定します。
ProcExplorerを見ると、 each 子プロセスが each ログファイルへのハンドルを持っていることがわかります(したがって、procAはlogA、logBなどへのハンドルを持っています)。これは後の問題を引き起こします。
procAがlogBへのハンドルを作成するタイミングを確認できるようにします。アイデアはありますか?
解決
可能な解決策の1つは、親プロセスによって作成されるため、ファイルへのハンドルが任意の子プロセス間で共有されることです。
それが処理できる変数が1つだけになるように設計している場合、各子プロセスでマルチプルハンドル(各ログファイルに1つ)を使用する方法がわからないため、これが唯一のソリューションです。 >
子プロセスでハンドルを作成しないのはなぜですか?私はそれが質問に高価に応答することを知っていますが、明らかにprocAがlogAへのハンドルのみを必要とする場合、子プロセスprocAでlogAへのハンドルを作成する方が良いでしょう
他のヒント
子プロセスprocAがlogBへのハンドルを作成するときにデバッガーに侵入する方法を尋ねていますか? Process Explorerに言及したので、Windowsを使用していると仮定します。
これを行う1つの方法は、 Image File Execution Options
レジストリキー。procA.exe
が開始されるたびに、デバッガーを起動することを指定します。デバッガーの起動時に、logBへのハンドルを作成するコードにブレークポイントを設定して、プロセスを続行できます。これは、Visual Studioだけでなく、任意のデバッガー(WinDbg、ntsdなど、またはAQTimeなどのプロファイリングツール)で動作します。
これを行う別の方法は、すべての子プロセスにアタッチするようデバッガーに指示することです。 WinDbgまたはntsdでこの動作を有効にする方法はいくつかあります。そのようにして、デバッガーを親プロセスにアタッチすると、子プロセスprocAに自動アタッチされ、適切なコードにブレークポイントを設定できます。
さらに別の方法は、 DebugBreak()
関数はlogBへのハンドルを作成し、ジャストインタイムデバッグを使用してデバッガーをアタッチします。コードが例外フィルター式なしで構造化例外を処理する場合(これは悪い考えです)、これは機能せず、驚くべき結果(デッドロック、メモリリークなど)が発生する可能性があることに注意してください。