0

複数の子プロセスを生成するアプリケーションがあります。子を起動する前に、ログ ファイルへの stdOut および stdErr ハンドルを作成します (たとえば、procA を起動しようとしている場合は、logA.log へのハンドルを作成します)。これらのハンドルを子プロセスに設定しました。

ProcExplorer を見ると、各子プロセスがログ ファイルへのハンドルを持っていることがわかります (したがって、procA は logA、logB などへのハンドルを持っています)。これは後で問題を引き起こします。

procA が logB へのハンドルをいつ作成するかを確認できるようにしたいと考えています。アイデアはありますか?

4

2 に答える 2

1

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

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

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

もう 1 つの方法は、DebugBreak()logB へのハンドルを作成するときに関数を使用してブレークポイント例外を生成するようにコードを一時的に変更し、ジャストインタイム デバッグを使用してデバッガーをアタッチすることです。コードが例外フィルター式なしで構造化例外を処理する場合 (これは悪い考えです)、これは機能せず、驚くべき結果 (デッドロック、メモリ リークなど) が発生する可能性があることに注意してください。

于 2009-03-16T16:38:49.733 に答える
1

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

それを処理する var が 1 つだけになるように設計する場合、各子プロセスで複数のハンドル (各ログ ファイルに 1 つ) を持つ方法がわからないため、これが唯一の解決策です。

子プロセスでハンドルを作成してみませんか? 私はそれが質問に高くつくことを知っていますが、明らかにprocAがlogAへのハンドルのみを必要とする場合は、子プロセスprocAでlogAへのハンドルを作成することをお勧めします。

于 2009-03-16T10:41:49.733 に答える