簡體   English   中英

APPCRASH StackOverflowException clr.dll c00000fd

[英]APPCRASH StackOverflowException clr.dll c00000fd

我正在運行一個每天24小時執行的.Net控制台應用程序。 它有一個大約每6天發生一次的錯誤。

我希望得到您的幫助來解決這個問題。 首先,我將提供一些背景知識,然后我將提供異常消息。

不幸的是我沒有重現的步驟。 你會在閱讀時看到原因。

首先是一些背景:

我的代碼中有強大的異常處理(或者我認為)。 例如,我在Main()方法中有一個try ... catch塊,它捕獲任何未處理的異常,如果它們是FATAL,則重新啟動底層任務。 它適用於我自己的代碼生成的任何異常。

我無法解釋為什么我的代碼中沒有處理以下異常。 我最好的猜測是clr.dll異常不會在托管堆棧中被捕獲。 如果是這種情況,我不知道如何生成堆棧跟蹤。 我甚至不知道從哪里開始解決這個問題。

我正在運行的進程使用以下版本和模塊:

  • C#.Net Framework 4.6.1
  • Console App項目類型
  • System.Net.WebClient
  • log4net的
  • Windows 7 64位

在崩潰時我檢查了RAM和HDD:兩者都有足夠的可用空間。

關於我正在執行的代碼。 該過程是一個連續循環,從網站下載數據並將其保存到文本文件中。 如果有錯誤,則使用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>

然后使用Visual studiowindbgdebugdiagclrmd等工具之一分析轉儲文件。

我建議嘗試使用DebugDiag( https://www.microsoft.com/en-us/download/details.aspx?id=49924 )來捕獲崩潰並分析生成的進程轉儲。 確保在exe旁邊包含pdbs,以便於診斷:在Project屬性的Build選項卡中:將Configuration設置為用於構建exe的配置。 在“輸出”部分的“高級”按鈕中,將“調試信息”設置為“Pdb”(或“完整”)。

為了幫助收集堆棧跟蹤PHPTower,您可以執行我所做的操作並在Main()函數開頭訂閱程序的AppDomain.CurrentDomain.UnhandledException事件

事件處理程序的簽名如下所示,允許您獲取異常,並使用Exception.ToString()方法輸出堆棧跟蹤。

    private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        File.AppendAllLines(FileName, e.ExceptionObject.ToString());
    }

快樂狩獵!
-cadatoiva

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM