2009-03-16 9 views
0

私は複数の子プロセスを生成するアプリケーションを持っています。子を起動する前に、stdOutとstdErrを作成してログファイルを処理します(たとえば、procAを起動しようとしている場合、logA.logへのハンドルを作成します)。子プロセスでこれらのハンドルを設定します。ハンドル作成時にどのように壊れますか?

ProcExplorerで見ることによって、私は子プロセスが(そうPROCA等logA、logB、へのハンドルを持っている)ログファイルにハンドルを持っていることがわかります。これは後の問題を引き起こす。

私はprocAがlogBのハンドルを作成するときを見たいと思っています。どんな想い出?

答えて

1

可能な解決策の1つは、ファイルへのハンドルが親プロセスによって作成された子プロセス間で共有されることです。

これは、私が見ることができる唯一の解決策です。あなたがそれを扱うvarが1つしかないように設計すると、各子プロセスのマルチファイルハンドル(各ログファイルに1つずつ)を持つ方法がわからないからです。

なぜ子プロセスでハンドルを作成しないのですか?私はそれが疑問に価格的に反応することは知っているが、明らかにprocAがlogAにハンドルを必要とするのであれば、子プロセスprocAのlogAへのハンドルを作成するほうがよい。

+0

ありがとうございました、あなたは正しい軌道に乗っています。子プロセスは、親のハンドルを共有します。私はあなたのソリューションを進めることはできませんが、私はすべての開いているハンドルをリストする方法を見つけることを試みています。 –

+0

解決済み、子プロセスは出力リダイレクトの副作用として親からのハンドルを継承します。 –

1

子プロセスprocAがlogBのハンドルを作成したときにデバッガに侵入する方法を尋ねていますか?私はProcess Explorerについて言及して以来、Windowsを使用していると仮定します。

Image File Execution Optionsレジストリキーを使用して、procA.exeが起動するたびにデバッガを起動するように指定する方法があります。デバッガが起動すると、logBのハンドルを作成するコードにブレークポイントを設定し、プロセスを続行させることができます。これは、Visual Studioだけでなく、WinDbgやntsd、AQTimeなどのプロファイリングツールなどのデバッガでも使用できます。

これを行う別の方法は、すべての子プロセスにアタッチするようにデバッガに指示することです。 enable this behavior with WinDbg or ntsdにはいくつかの方法があります。こうすることで、デバッガを親プロセスにアタッチし、子プロセスprocAに自動接続し、適切なコードにブレークポイントを設定することができます。

さらに、logBのハンドルを作成するときにDebugBreak()関数を使用してブレークポイント例外を生成するコードを一時的に変更し、ジャストインタイムデバッグを使用してデバッガをアタッチします。例外的なフィルタ式を使用しないで構造化された例外を処理するコード(悪い考えです)では、うまくいかない(デッドロックやメモリリークなど)可能性があります。

+0

素敵なデバッグテクニック! –

関連する問題