5

アサートが失敗した場合、またはセグメンテーション違反が発生した場合、次のいずれかが発生すると非常に便利です。

  • プログラムは、デバッガーを実行するかどうかを尋ねます。
  • デバッガーが接続されるまで、プログラムはクラッシュして待機します。
  • プログラムは、この時点から実行を再開して調査できる何か (コア ダンプ?) を残します。

さまざまなプラットフォーム、言語、デバッガーがあるため、質問は非常に一般的です。C++ について質問していますが、Windows (VS)、Linux (gdb)、Mac (gdb?) のソリューションがコミュニティにとって最も役立つと思います。Linux + gdb に興味があります。

4

6 に答える 6

3

Linux (およびおそらく OSX やその他の unixen) では、ulimitユーティリティを使用してプログラムがコアダンプを残すことを許可できます。

ここに簡単なハウツーがあります。

于 2009-09-23T11:24:46.307 に答える
2

Windows にはDebugBreak()(およびIsDebuggerPresent()) があり、これは が失敗したときに発生する可能性のあるオプションの 1 つですassert

MacOS では、同様の API 呼び出し (Debugger()またはSysBreak()) があります。

Linux についてはよくわかりませんが、私の知る限り、Linux でアサーションが失敗するとコアダンプが発生し、デバッガーで確認できます。

于 2009-09-23T11:21:20.313 に答える
1

Linux では、基本的に、何か恐ろしいことが起こると、プログラムはシグナルを受け取ります。このシグナルを「マスク」しない場合、プログラムにはデフォルトの動作がありますが、通常は「マスク」して別のことを行うことができます。 gdb。ここ、具体的にはここから、マスクの方法やその他の多くの情報を見つけることができます。

アサートに関しては、独自のバージョンのアサートを簡単に作成して、好きなことを行うことができます。

于 2009-09-23T11:23:37.580 に答える
1

残念ながら、私の回答は Windows に限られますが、Linux にもデバッガーに通知する何らかの方法があることは理にかなっています。

Visual Studio がインストールされているマシンでは、ジャスト イン タイムデバッグを有効にする必要があります。これは本質的に、プロセスで致命的な例外が発生したときにデバッガーを実行する必要がないことを意味します。

ジャスト イン タイム デバッグは、レジストリ キーを使用して有効にします。詳細については、上記のリンクを参照してください。

後で確認するためにプロセス スナップをキャプチャする場合は、通常、Adplus.vbs (有人) または DebugDiag (無人) を介して実行されます。Adplus はDebugging Toolkit for Windowsから入手できますが、DebugDiagは別のダウンロードです。

于 2009-09-23T12:08:08.720 に答える
0

gnud によって提案された ulimit に加えて、クラッシュ レポーターを使用することをお勧めします: http://code.google.com/p/google-breakpad/w/list

于 2010-07-23T11:07:02.273 に答える