1日24時間実行される.Netコンソールアプリケーションを実行しています。約6日に1回発生するバグがあります。
このバグを修正するためにあなたの助けをお願いします。最初にいくつかの背景を説明し、次に例外メッセージを提供します。
残念ながら、再現する手順はありません。読み進めると、その理由がわかります。
最初のいくつかの背景:
私のコードには堅牢な例外処理があります(またはそう思っていました)。たとえば、Main()メソッドにtry ... catchブロックがあり、未処理の例外をキャプチャし、それらが致命的である場合は、基になるタスクを再開します。私自身のコードから生成された例外に対してはうまく機能します。
以下の例外が私のコードで処理されない理由を説明できません。私の最善の推測は、clr.dll例外がマネージスタック内でキャッチされないことです。その場合、スタックトレースを生成する方法がわかりません。どこから修正を始めればいいのかさえわかりません。
私が実行しているプロセスは、次のバージョンとモジュールを使用しています。
クラッシュ時に、RAMとHDD:両方に十分な空き容量があることを確認しました。
私が実行しているコードについて。このプロセスは、Webサイトからデータをダウンロードし、テキストファイルに保存する連続ループです。エラーがある場合は、log4netを使用してログに記録されます。
基本的なループは次のとおりです。
for (int i = 0; i < 5; i++)
{
try
{
return new WebClient().DownloadString(url);
}
catch
{
Thread.Sleep(500); // slow it down.
}
}
以下は、例外が発生したときにコンソールウィンドウに表示される唯一のメッセージです:(スタックトレースは表示されません)
Process is terminated due to StackOverflowException
コンソールアプリケーションが完全にフリーズし、ダイアログウィンドウがポップアップして次の情報が表示されます(このダイアログを閉じると、アプリケーションも終了します)
Problem signature:
Problem Event Name: APPCRASH
Application Name: foo.goo.BatchExecutor.exe
Application Version: 1.0.0.0
Application Timestamp: 5a50f3eb
Fault Module Name: clr.dll
Fault Module Version: 4.7.2117.0
Fault Module Timestamp: 59cf5105
Exception Code: c00000fd
Exception Offset: 0002429f
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1033
Additional Information 1: 28e8
Additional Information 2: 28e8aacd8abfe32876bc8363e8e5c526
Additional Information 3: 6916
Additional Information 4: 6916665ca52ff482d854f190abcf46b2
クラッシュに関する情報を見つけることができた他の唯一の場所は、Windowsイベントログです。
Log Name: Application
Source: Application Error
Date: 1/23/2018 5:51:46 PM
Event ID: 1000
Task Category: (100)
Level: Error
Keywords: Classic
User: N/A
Computer: FOOGOO
Description:
Faulting application name: foo.goo.BatchExecutor.exe, version: 1.0.0.0, time stamp: 0x5a50f3eb
Faulting module name: clr.dll, version: 4.7.2117.0, time stamp: 0x59cf5105
Exception code: 0xc00000fd
Fault offset: 0x0002429f
Faulting process id: 0x1e00
Faulting application start time: 0x01d39169354e41a7
Faulting application path: C:\Users\Owner\Desktop\SHARED\foo.goo.BatchExecutor\foo.goo.BatchExecutor.exe
Faulting module path: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll
Report Id: 21b9b2a4-00a9-11e8-9f6c-94c69110a719
Event Xml:
<Event xmlns="http://schemas.Microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="Application Error" />
<EventID Qualifiers="0">1000</EventID>
<Level>2</Level>
<Task>100</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2018-01-24T01:51:46.000000000Z" />
<EventRecordID>1852</EventRecordID>
<Channel>Application</Channel>
<Computer>FOOGOO</Computer>
<Security />
</System>
<EventData>
<Data>foo.goo.BatchExecutor.exe</Data>
<Data>1.0.0.0</Data>
<Data>5a50f3eb</Data>
<Data>clr.dll</Data>
<Data>4.7.2117.0</Data>
<Data>59cf5105</Data>
<Data>c00000fd</Data>
<Data>0002429f</Data>
<Data>1e00</Data>
<Data>01d39169354e41a7</Data>
<Data>C:\Users\Owner\Desktop\SHARED\foo.goo.BatchExecutor\foo.goo.BatchExecutor.exe</Data>
<Data>C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll</Data>
<Data>21b9b2a4-00a9-11e8-9f6c-94c69110a719</Data>
</EventData>
</Event>
*****ソリューションの回避策による更新*****
.Net内でこの例外を処理しようとするのをあきらめました。効果的な回避策を見つけました。この回避策は、Windows、特にイベントビューアを備えたすべてのバージョンに適用されます。
回避策の説明。
1)[コントロールパネル]-> [管理ツール]-> [イベントビューア]-> [Windowsログ]-> [アプリケーション]を開きます。
2)問題のあるイベントを選択します。私の場合、それは状態ERRORであり、上記の例と一致します。
3)右側の[このイベントにタスクを添付]をクリックします。
4)ウィザードを完了します。私の場合、アプリケーションを再起動します。
5)タスクを保存します。
6)次に、タスクスケジューラに切り替えて、タスクを見つけます。 [プロパティ]をクリックします。タブをクリックして、必要に応じてタスクを構成します。
*****ソリューションの回避策による更新*****
.Net内でこの例外を処理しようとするのをあきらめました。効果的な回避策を見つけました。この回避策は、Windows、特にイベントビューアを備えたすべてのバージョンに適用されます。
回避策の説明。
1)コントロールパネル->管理ツール->イベントビューア-> Windowsログ->アプリケーションを開きます。
2)問題のあるイベントを選択します。私の場合、それは状態ERRORであり、上記の例と一致します。
3)右側の[このイベントにタスクを添付]をクリックします。
4)ウィザードを完了します。私の場合、アプリケーションを再起動します。
5)タスクを保存します。
6)次に、タスクスケジューラに切り替えて、タスクを見つけます。 [プロパティ]をクリックします。タブをクリックして、必要に応じてタスクを構成します。
ProcDump を使用することをお勧めします。これは、StackOverflowExceptionが発生したときにクラッシュダンプを生成するように構成できます。
procdump -accepteula -e 1 -f C00000FD.STACK_OVERFLOW -g -ma <PID> <OUTPUT PATH>
次に、このツールの1つを使用してダンプファイルを分析します Visual studio 、 windbg 、 debugdiag 、 clrmd 。
DebugDiag( https://www.Microsoft.com/en-us/download/details.aspx?id=49924 )を試してクラッシュをキャプチャし、結果のプロセスダンプを分析することをお勧めします。診断を容易にするために、exeの横にpdbを含めるようにしてください。[プロジェクトのプロパティ]の[ビルド]タブで、[構成]を[exeのビルドに使用する構成]に設定します。 [出力]セクションの[詳細]ボタンで、デバッグ情報をPdb(またはフル)に設定します。