APPCRASH StackOverflowException clr.dll c00000fd

时间:2018-01-26 17:01:11

标签: c# .net stack-overflow

我正在运行一个每天24小时执行的.Net控制台应用程序。它有一个大约每6天发生一次的错误。

我希望得到您的帮助来修复此错误。首先,我将提供一些背景信息,然后我将提供异常消息。

不幸的是我没有重现的步骤。你会在阅读时看到原因。

首先是一些背景:

我的代码中有强大的异常处理(或者我认为)。例如,我在Main()方法中有一个try ... catch块,它捕获任何未处理的异常,如果它们是FATAL,则重新启动底层任务。它适用于我自己的代码生成的任何异常。

我无法解释为什么我的代码中没有处理以下异常。我最好的猜测是clr.dll异常不会在托管堆栈中被捕获。如果是这种情况,我不知道如何生成堆栈跟踪。我甚至不知道从哪里开始解决这个问题。

我正在运行的进程使用以下版本和模块:

  • C#.Net Framework 4.6.1
  • 控制台应用项目类型
  • System.Net.WebClient
  • log4net的
  • Windows 7 64位

在崩溃时我检查了RAM和HDD:两者都有足够的可用空间。

关于代码I' m执行。该过程是一个连续循环,从网站下载数据并将其保存到文本文件中。如果有错误,则使用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)打开控制面板 - &gt;管理工具 - &gt;事件查看器 - &gt; Windows日志 - &gt;应用程序。

2)选择违规事件。在我的例子中,它是状态ERROR,并匹配您在上面看到的示例。

3)在右侧单击&#34;将任务附加到此事件&#34;。

4)完成向导。在我的情况下,我重新启动我的应用程序。

5)保存任务。

6)现在切换到任务计划程序并找到任务。单击属性。单击选项卡并根据需要配置任务。

4 个答案:

答案 0 :(得分:4)

*****更新解决方案办法*****

我已放弃尝试在.Net中处理此异常。我找到了一个有效的解决方法。此解决方法适用于Windows,特别是任何带有事件查看器的版本。

解决方法说明。

1)打开控制面板 - &gt;管理工具 - &gt;事件查看器 - &gt; Windows日志 - &gt;应用程序。

2)选择违规事件。在我的例子中,它是状态ERROR,并匹配您在上面看到的示例。

3)在右侧单击“将任务附加到此事件”。

4)完成向导。在我的情况下,我重新启动我的应用程序。

5)保存任务。

6)现在切换到任务计划程序并找到任务。单击属性。单击选项卡并根据需要配置任务。

答案 1 :(得分:0)

我建议尝试使用DebugDiag(https://www.microsoft.com/en-us/download/details.aspx?id=49924)来捕获崩溃并分析生成的进程转储。确保在exe旁边包含pdbs,以便于诊断:在Project属性的Build选项卡中:将Configuration设置为用于构建exe的配置。在“输出”部分的“高级”按钮中,将“调试信息”设置为“Pdb(或完整)”。

答案 2 :(得分:0)

我建议使用ProcDump,可以将其配置为在StackOverflowException发生时生成故障转储。

procdump -accepteula -e 1 -f C00000FD.STACK_OVERFLOW -g -ma <PID> <OUTPUT PATH>

然后使用此工具之一分析转储文件 Visual studiowindbgdebugdiagclrmd

答案 3 :(得分:-1)

为帮助收集PHPTower堆栈跟踪,您可以执行我的操作,并在Main()函数开始时订阅程序的AppDomain.CurrentDomain.UnhandledException事件

事件处理程序的签名如下所示,允许您获取异常,并使用Exception.ToString()方法输出堆栈跟踪。

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

狩猎愉快!
-cadatoiva