21

gdbプログラムのデバッグに使用してC++います。ラインで

assert(prevId ==  GetTagIdFromState(maxState));
  • パラメータprevId値は0;
  • メソッド; GetTagIdFromState(maxState) return_50

これをデバッグすると、次のエラーが発生します。

Assertion `prevId == GetTagIdFromState(maxState)' failed.
Program received signal SIGABRT, Aborted.
0x00007ffff6ecbba5 in raise (sig=<value optimized out>) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64    ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
      in ../nptl/sysdeps/unix/sysv/linux/raise.c
4

3 に答える 3

10

アプリケーションは意図したとおりに動作します。アサーションは失敗し (渡された値が等しくないため、assertマクロは 0 を受け取ります)、プログラムは中止されます。それがアサートの仕組みです:

NDEBUG が定義されていない場合、assert はその引数(スカラー型でなければならない)が 0 と等しいかどうかをチェックします。そうであれば、 assert は実装固有の診断情報を標準エラー出力に出力し、 std::abort を呼び出します

強調鉱山。

詳細については、このアサート リファレンスを確認してください。

于 2012-10-31T07:00:31.980 に答える
0

これにより、アサート関数の使用について理解できるはずです

void assert (int expression);

アサーションの評価 関数形式のこのマクロの引数式が 0 と等しい (つまり、式が false) 場合、メッセージが標準エラー デバイスに書き込まれ、abort が呼び出されて、プログラムの実行が終了します。

表示されるメッセージの詳細は、コンパイラの特定の実装に依存しますが、アサーションが失敗した式、ソース ファイルの名前、および発生した行番号が含まれます。通常の表現形式は次のとおりです。

アサーションに失敗しました: 式、ファイル名、行 行番号 NDEBUG という名前の assert.ha マクロが既に定義されている場合、このマクロは無効になります。これにより、コーダーはプログラムのデバッグ中にソース コードに多くの assert 呼び出しを含めることができ、次のような行を含めるだけで製品版ではそれらすべてを無効にすることができます。

#define NDEBUG at the beginning of its code, before the inclusion of assert.h.

したがって、このマクロは、ユーザー エラーや実行エラーではなく、プログラミング エラーをキャプチャするように設計されています。これは、通常、プログラムがデバッグ フェーズを終了すると無効になるためです。from: C++ リファレンス

于 2012-10-31T07:10:27.937 に答える