C++ で記述された Windows アプリケーションが時々蒸発します。Windows からの「申し訳ありません」というメッセージも、ワトソン博士の施設からのクラッシュ ダンプもありません...
デバッガーでクラッシュが発生した場合、デバッガーは壊れず、アプリケーションがまだ実行中であることが示されました。手動で実行を一時停止すると、プロセスにスレッドがなくなっていることがわかりました。
このプロセスが終了する理由を把握するにはどうすればよいですか?
Windows デバッグ ツール パッケージの adplus ユーティリティを使用してみてください。
adplus -crash -p yourprocessid
自動ダンプ ツールは、例外のミニ ダンプと、アプリケーションがクラッシュした場合のフル ダンプを提供します。
Visual Studio 2003 以降を使用している場合は、Debug メニュー | 例外ダイアログ。デバッガー内でプロセスのデバッグ ビルドを開始する前に、EVERY オプションをオンにします。
デフォルトでは、デバッガーのこれらの First Chance Exception ハンドラーのほとんどがオフになっているため、Windows またはコードが例外をスローした場合、デバッガーはアプリケーションがそれを処理することを期待します。
First Chance Exception システムにより、デバッガーは、プロセスやシステムによってスローされる可能性のあるすべての例外をインターセプトできます。
投稿された他のすべてのアイデアは良いです。
しかし、アプリケーションが abort() または terminate() を呼び出しているようにも聞こえます。
デバッガーで実行する場合は、これらのメソッドと exit() の両方にブレークポイントを設定してください。
以下は、例外がうまくいかないために terminate が呼び出される原因となる状況のリストです。
これは、例外がキャッチされない場合、アプリケーションが terminate() することを示しています。そのため、main() にエラーを (ログ ファイルに) 報告する catch ブロックを貼り付けてから、再スローします。
int main()
{
try
{
// Do your code here.
}
catch(...)
{
// Log Error;
throw; // re-throw the error for the de-bugger.
}
}
問題は、アクセス違反が発生していることです。WinDBG にアタッチし、すべての例外フィルターをオンにすることができます。それでも解決しない場合があります-私の推測では、例外をスローしていないメモリ破損が発生していると思います。
完全なページヒープチェックを有効にすることを検討することをお勧めします
ツールに関するいくつかのアイデアについては、ヒープの破損に関するこの古い質問を確認することもできます。
この種の突然の消失の最も一般的な原因はスタック オーバーフローであり、通常はある種の無限再帰によって引き起こされます (もちろん、互いに呼び出しているいくつかの関数のチェーンが関係している可能性があります)。
あなたのアプリでそれは可能ですか?
Windows のイベント ビューアーでWindows ログを確認できます。
まず最初に、私は Windows 開発に関して中程度の経験しかないと言いたいです。その後、これはログが役立つ典型的なケースだと思います。
通常、デバッグとロギングは直交情報を提供します。デバッガが役に立たない場合は、おそらくログが役立ちます。
これは、_exit() または Windows の同等の呼び出しである可能性があります。_exit にブレークポイントを設定してみてください...
PC Lint などを試して、コード上で実行しましたか? 最大の警告でコンパイルしてみてください。これが .NET アプリの場合は、FX Cop を使用してください。
考えられる原因が思い浮かびます。
特に最後のものは、アプリケーションの即時の失敗につながります。
スタック オーバーフロー - 通知を受け取る場合がありますが、ほとんどありません。
デバッガーにドロップし、すべての例外通知を「処理されない場合は停止する」ではなく「常に停止する」に変更してから、プログラムの失敗を引き起こすために行うことを行います。例外が発生した場合、デバッガーは停止し、これが探している例外であるかどうかを判断できます。
Windows 7 で 64 ビット アプリケーションを実行している Visual Studio 2017 でこれを掘り下げるのに数時間を費やしました。結局、 ntdll.dllファイルにあるRtlReportSilentProcessExit関数にブレークポイントを設定する必要がありました。Visual Studio がそれを見つけるには、基本関数名だけで十分でした。
そうは言っても、Visual Studio に C 標準ライブラリのシンボルを自動的にダウンロードさせた後、問題の原因となったランタイム例外で Visual Studio も自動的に停止しました。