0

MSVC ++ 2010のCreateProcess関数を使用して子プロセスを作成しており、その前にSetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);を使用してエラーレベルを設定しています。

タスクは、コンソールプログラムを実行し、有名な「送信しない」ダイアログなどの迷惑なメッセージを非表示にして、重大なエラーの後にプログラムが正常に終了しないようにすることです。

したがって、エラー(たとえば、0による除算)を含む子プロセスを作成すると正常に機能しますが、ベクトルインデックスオーバーフローを使用してサブプロセスを作成すると、(もちろんデバッグモードで)避けられないアサートエラーメッセージが表示されます。このプログラムのコードは次のとおりです。

#include <stdlib.h>
#include <vector>

int main(int argc, char *argv[])
{
    int index = atoi(argv[1]);
    switch(index)
    {
    case 0:
    {
        int k = 3, j = 3;
        j -= k;
        k = k/j;//division by zero
    }
    case 1:
    {
        std::vector<int> k(2);
        int i = k.at(2);//index is out of bounds and it causes assert failure
    }
    }
}

リリース構成では正常に機能しますが、デバッグではエラーのアサートダイアログが表示されます。もちろん、子プログラムコードに_set_abort_behaviorを追加することもできますが、それは私にとってのオプションではありません。

デバッグ構成でコンパイルされたプログラムのこのアサートエラーダイアログを超える方法はありますか?

4

1 に答える 1

0

一般的な方法は、プロセスをデバッグ対象として起動するか、未処理の例外を常に無視する単純なデバッガーを作成することです。すでにこれを行う既存のデバッガーさえあるかもしれませんが、私は知りません。

このアプローチについていくつかの良い点があります。

  1. このすべての動作を封じ込めるのは簡単です。発信者に多くを課すことはありません
  2. たとえば、ミニダンプを自動的かつサイレントに保存するなど、未処理の例外情報を自分でログに記録する機会が与えられます。
  3. これらのアサーション ダイアログ ウィンドウは、アプリがデバッグされていないときにのみ表示されると思います。これは、デバッガーのアプローチが、これらを処理するための具体的な方法でもあることを意味します。ただし、デバッグ対象を再開すると、ダイアログがポップアップする可能性があります。あなたがそれをどのように処理するかわかりません。それは通常のプログラムの継続です。たぶん、デバッグブレークでレジスタを変更してバイパスすることができます。

ただし、サブプロセスツリー全体に対してこれを行う必要がある場合、またはメッセージボックスやユーザー入力なしでアプリを「サイレント」にしたい場合は、さらに注意が必要です。

これらのデバッグ アサーション ダイアログ ウィンドウは通常、デバッグ ビルドでのみ有効になることに注意してください。本番環境では、それらはまったく表示されません。

于 2012-10-16T15:27:56.617 に答える