web-dev-qa-db-ja.com

アドレス0で例外0xc0000005が発生してプログラムがクラッシュした場合はどうすればよいですか?

私のDelphiプログラムはNTサービスとして実行され、2か月以上正常に実行されていますが、突然停止してクラッシュダンプが生成されます。

障害のあるアプリケーション名:tca_shctisvc_ip.exe、バージョン:7.1.0.1843、タイムスタンプ:0x2a425e19障害のあるモジュール名:不明、バージョン:0.0.0.0、タイムスタンプ:0x00000000例外コード:0xc0000005障害オフセット:0x00000000

Windowsイベントログの情報に基づいて動作する実際のアドレスはありませんでした。ミニダンプをWinDbgに読み込むことができ、例外はあるがスタックフレームに問題があることがわかりました。別のツール(Viewminidump)で、実行中のスレッドのスタックを表示できました。

この問題の解決はどこから始めますか?

12
samanne

例外コード0xc0000005はアクセス違反です。障害オフセットのAV 0x00000000は、サービスのコード内の何かがnilポインターにアクセスしていることを意味します。アクセスしているものを見つけるには、実行中のサービスをデバッグする必要があります。デバッガー内で実行できない場合は、少なくとも EurekaLog または MadExcept などのサードパーティの例外ロガーフレームワークをインストールして、サービスが何をしていたかを調べます。 AVの時間。

30
Remy Lebeau

別のアプリケーションでも同じ問題が発生していましたが、

Faulting application name: javaw.exe, version: 8.0.51.16, time stamp: 0x55763d32
Faulting module name: mscorwks.dll, version: 2.0.50727.5485, time stamp: 0x53a11d6c
Exception code: 0xc0000005
Fault offset: 0x0000000000501090
Faulting process id: 0x2960
Faulting application start time: 0x01d0c39a93c695f2
Faulting application path: C:\Program Files\Java\jre1.8.0_51\bin\javaw.exe
Faulting module path:C:\Windows\Microsoft.NET\Framework64\v2.0.50727\mscorwks.dll

私はMicrosoftのEnhanced Mitigation Experience Toolkit(EMET)を使用していましたが、これは障害のあるアプリケーションであるため、javaw.exeのEMET機能を無効にすると、アプリケーションが正常に実行できるようになりました。メモリにセキュリティ保護を備えた同様のソフトウェアがないことを確認してください。

0
Lismore

スタックフレームの問題は、スタックの破損(本当に恐ろしい獣)、最適化、またはC/C++/C#/ Delphiなどのフレームワークの混合、およびその他の狂気を示している可能性があります-スタックフレームに関する絶対的な標準はありません。 (一部の言語にはそれらさえありません!)。

そのため、スタックフレームの問題に少し悩まされ、それを無視して、Remyの答えを使用することをお勧めします。

0
Arafangion