2016-05-20 3 views
2

通常のビルドとして実行されたときにプログラムをクラッシュさせる可能性のあるエラーはあるものの、デバッガで実行すると抑制されることがあります。私は最近、クラッシュの原因となる99%のエラーがヌルポインタの逆参照によって引き起こされたセグメンテーションフォールトであるQtプロジェクトでこれを体験しました。デバッガでどのようなエラーを抑止できますか?

Linuxでは、私はvalgrindを持つ人を追跡します。今、私のプロジェクトはクラッシュなしでLinux上でうまく構築されていますが、Windows上のQt作成者のビルドは特定の操作でクラッシュします。デバッガを使用する場合、デバッガは使用しません。私はvalgrindと同じことを経験しました。

この現象が発生する可能性があります。また、デバッガとvalgrindがその動作を抑止するときにクラッシュの原因を追跡するにはどうすればよいですか?

Linux上のコンパイラはg ++ 4.4.7で、ウィンドウズではmingw492_32です。

+0

デバッガを使用して最適化されたビルドをデバッグ情報で実行し、バックトレースを取得することができます。 – TartanLlama

+0

2つ以上のスレッドを使用するプログラム。 –

答えて

1

デバッガでマスクされることが多いバグの1つは、「競合状態」です。 デバッガは通常、スレッドの実行/スケジュールのタイミングを変更するため、デバッガでプログラムを実行すると競合状態が発生しないことがあります。

1

Windowsのデバッグで例外が明示的に抑制されていることに気づいていません。 Debug Menu->Exceptionsの下にプログラムブレークを引き起こす例外を設定できますが、それはあなたが求めているとは思いません。

私はVisual Studio 20xxを意味するデバッガからWindowsプログラムを実行したときに再現しない問題を発見しました。これは、IDEが異なるWin32およびCRTヒープメモリ管理フラグを設定するためです。おそらく、デバッガで実行していると微妙にタイミングが変わります(Heisenbug)。これは、私がDebugビルドを実行するかReleaseビルドを実行するかにかかわらず当てはまりました。このような場合、私の最初のステップは、おそらく起動遅延でSleep(15000);または類似のものを使用して、プログラムを「通常」起動することです。その後、デバッガを開始されたプロセスにアタッチしてください。ただし、人為的な遅延はあなたに時間を与えます。

これは、デバッガから実行する方法でプログラムの動作特性を保持しているようです。私は奇妙なクラッシュを再現することが複数回可能であることを発見しました。

まだクラッシュを再現しない場合は、より創造的にする必要があります。 Process Dumperを使用してクラッシュ時にメモリダンプを強制してから、の郵便番号をダンプしてデバッグしてください。

うまくいけば、私が言及した最初のステップはうまくいきません。

+0

公式ビルドを使用している場合、リリースPDB(少なくともVSでは、MinGWについてはわかりません)が含まれていないため、Qtリリースビルドの死後のデバッグは通常は苦労します。あなたはそれらを生成することができますが、Qtを再コンパイルする必要があります。これらのデバッグシンボルをリリースビルドに追加することを目的とするQTBUG-3934を参照してください。 – Uflex

0

通常、この違いは、デバッグモードでは、レイアウトが異なるためにメモリ障壁を乗り越えるのではなく、デバッガが何らかの問題を抑制するためではないために表示されます。いずれかのプラットフォームでクラッシュする場合は、バグを修正する必要があります。さもなければあなたのプログラムの中のランダムなイベントで中継するレッグを吹き飛ばすでしょう。

リリース時にクラッシュする理由の1つに、プログラムの最適化があります。また、メモリのレイアウトが変更され、クラッシュが増えます。これらの問題を追跡するには、最適化をオンにして、デバッグ情報をトレースしておくことができます。

+0

コンパイラのバグの可能性を無視して、最適化されていないプログラムとは異なる動作を期待する理由はありません。いずれの場合も、標準で定義されている "シンボリックマシン"の規則を遵守する必要があります。したがって、コンパイラがバグでない限り、2つのシナリオは同じ(速度を除いて)実行する必要があります。それ以外のものは*あなたの*コードのバグです。 –

+0

標準には、「未定義の動作」のケースが多数含まれています。壊れたポインタに言及することも未定義の動作であり、この場合に起こることは実際には最適化、メモリ、コード構造に依存します。この場合、標準もコンパイラもプログラムの動作を保証することはできません。 – Dmytro

関連する問題