2

マルチプラットフォームの C++ ファジング アプリケーションを開発しています。アプリは子プロセスを生成し、予期せず停止したかどうかを確認します。私はすでにLinuxでこれを行うことができましたが、Windowsの例外処理メカニズムが私にとって困難です。

私のコードは現在、次のことを行っています。 - CreateProcess を呼び出して、プロセスを生成します。- 終了するまで待機する WaitForSingleObject。- 次に、GetExitCodeProcess を呼び出して、終了コードが例外に対応するかどうかを確認します。

すべてが正常に機能し、null デリファレンス テスト アプリケーションでテストしたところ、例外を適切にキャッチできました。ただし、これをテストするたびに、エラー レポートを送信するか送信しないかを示す Windows エラー メッセージ ボックスが表示されます。ファザーは自動テスト アプリケーションであると想定されているため、何らかの方法でこの通知を無効にして、例外がキャッチされた場合でもファザーがテストを続行できるようにする必要があります。

すでに SEH ハンドラーをインストールしようとしましたが、運がありませんでした (明らかに、これらのハンドラーは子プロセスに継承されません)。ベクトル化された例外処理の使用について何か読んだことがありますが、同じであると仮定すると、ベクトルハンドラーは継承されないと思います。

誰でもこの問題を解決できますか? 何を検索すればよいかわかりません。すでにたくさんグーグル検索しましたが、何も見つかりませんでした。

ありがとう!

4

3 に答える 3

2

デバッグAPIは1つのオプションです。これがMSDNの出発点です。

于 2010-11-30T14:18:00.890 に答える
2

frast の答えに従って、適切なSetErrorModeを持つプロセスのとしてプロセスを生成できます。この (継承可能な) 設定は、どのエラーがダイアログのポップアウトをもたらすかを決定します - 自動テスト アプリケーションでまったく同じことを達成しようとしているときに、あなたの質問を見つけました。

エラー ダイアログを回避するには、次を使用します。

SetErrorMode(
    SEM_FAILCRITICALERRORS 
    | SEM_NOALIGNMENTFAULTEXCEPT 
    | SEM_NOGPFAULTERRORBOX 
    | SEM_NOOPENFILEERRORBOX);

インジェクションはおそらくやり過ぎです - ラッパープロセスを使用する方が良いです。

于 2011-01-13T13:57:08.670 に答える
1

次のコードを子プロセスに挿入してみてください。

SetErrorMode(SEM_NOGPFAULTERRORBOX);

MSDNでSetErrorModeの詳細を参照してください。

インジェクション手法については、こちらをご覧ください: インポート テーブル内のインジェクション コード

于 2010-11-30T14:33:26.613 に答える