APPCRASH StackOverflowException clr.dll c00000fd

APPCRASH StackOverflowException clr.dll c00000fd

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

我需要你的帮助来修复这个错误。首先我将提供一些背景知识,然后我将提供异常消息。

不幸的是我没有重现的步骤。当你继续阅读时,你会明白为什么。

首先是一些背景:

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

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

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

崩溃时我检查了 RAM 和硬盘:两者都有足够的空闲空间 space。

关于我正在执行的代码。该过程是一个连续循环,从网站下载数据并将其保存到文本文件中。如果有错误,将使用 log4net 记录。

基本循环是这样的:

 for (int i = 0; i < 5; i++)
            {
                try
                {
                    return new WebClient().DownloadString(url);
                }
                catch 
                {
                    Thread.Sleep(500); // slow it down.
                }
            }

以下是发生异常时我的控制台 window 中显示的唯一消息:(未显示堆栈跟踪)

Process is terminated due to WhosebugException

我的控制台应用程序完全冻结,并弹出一个对话框 window,其中包含以下信息(关闭此对话框也会终止我的应用程序)

 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) Select 违规事件。在我的例子中,它是状态错误,并且与您在上面看到的示例匹配。

3) 在右侧单击 "Attach Task to This Event"。

4) 完成向导。就我而言,我重新启动了我的应用程序。

5) 保存任务。

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

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

*****更新解决方案 *****

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

解决方法说明。

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

2) Select 违规事件。在我的例子中,它是状态错误,并且与您在上面看到的示例匹配。

3) 在右侧单击 "Attach Task to This Event"。

4) 完成向导。就我而言,我重新启动了我的应用程序。

5) 保存任务。

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

为了帮助收集堆栈跟踪信息,PHPTower,您可以像我一样做,并在 Main() 函数

开头订阅程序的 AppDomain.CurrentDomain.UnhandledException 事件

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

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

狩猎愉快!
-cadatoiva

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

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

然后使用其中一种工具分析转储文件 Visual studio, windbg, debugdiag, clrmd