【问题标题】:C# stackoverflow exceptionC# 堆栈溢出异常
【发布时间】:2011-08-28 20:40:13
【问题描述】:

我有一个堆栈溢出异常,我可以使用 windbg 来获取所有内容的日志,但是该日志对我来说非常希腊化,我不确定我在寻找什么。任何帮助表示赞赏。

FAULTING_IP: 
+1d42faf00b2df58
02dbb89f e9e3000000      jmp     02dbb987

EXCEPTION_RECORD:  ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 791a2c0c (clr!EECodeManager::EnumGcRefs+0x0000001b)
   ExceptionCode: c00000fd (Stack overflow)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 02dd2edc

PROCESS_NAME:  crawler.exe

ERROR_CODE: (NTSTATUS) 0xc00000fd - A new guard page for the stack cannot be created.

EXCEPTION_CODE: (NTSTATUS) 0xc00000fd - A new guard page for the stack cannot be created.

EXCEPTION_PARAMETER1:  00000001

EXCEPTION_PARAMETER2:  02dd2edc

RECURRING_STACK: From frames 0x19 to 0x19

MOD_LIST: <ANALYSIS/>

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK: !dumpstack -EE
No export dumpstack found

ADDITIONAL_DEBUG_TEXT:  Followup set based on attribute [Is_ChosenCrashFollowupThread] from Frame:[0] on thread:[PSEUDO_THREAD]

LAST_CONTROL_TRANSFER:  from 791a2fad to 791a2c0c

FAULTING_THREAD:  ffffffff

DEFAULT_BUCKET_ID:  NOSOS

PRIMARY_PROBLEM_CLASS:  NOSOS

BUGCHECK_STR:  APPLICATION_FAULT_NOSOS_STACK_OVERFLOW_STACKIMMUNE

STACK_TEXT:  
00000000 00000000 crawler.exe+0x0


SYMBOL_NAME:  crawler.exe

FOLLOWUP_NAME:  MachineOwner

MODULE_NAME: crawler

IMAGE_NAME:  crawler.exe

DEBUG_FLR_IMAGE_TIMESTAMP:  4e5a416f

STACK_COMMAND:  ** Pseudo Context ** ; kb

FAILURE_BUCKET_ID:  NOSOS_c00000fd_crawler.exe!Unknown

BUCKET_ID:  APPLICATION_FAULT_NOSOS_STACK_OVERFLOW_STACKIMMUNE_crawler.exe

FOLLOWUP_IP: *** WARNING: Unable to verify checksum for crawler.exe
*** ERROR: Module load completed but symbols could not be loaded for crawler.exe

crawler+0
00400000 4d              dec     ebp

WATSON_STAGEONE_URL:  http://watson.microsoft.com/StageOne/crawler_exe/1_0_0_0/4e5a416f/clr_dll/4_0_30319_1/4ba1d9ef/c00000fd/00062c0c.htm?Retriage=1

Followup: MachineOwner
---------

0:005> .exr 0xffffffffffffffff
ExceptionAddress: 791a2c0c (clr!EECodeManager::EnumGcRefs+0x0000001b)
   ExceptionCode: c00000fd (Stack overflow)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000001
   Parameter[1]: 02dd2edc

【问题讨论】:

  • 堆栈跟踪?什么代码导致了问题?
  • 您的问题是什么?单步执行代码并发布实际的异常及其所在的行。
  • 如果您打算从 windbg 调试 C#,请加载 SOS。如果您正在调试 C#,我会默认使用 C# Express。如果你不熟悉windbg,它是免费的,对用户更友好。
  • 这就是整个问题我不知道是什么导致了问题

标签: c#


【解决方案1】:

加载 SOS(.loadby sos clr.loadby sos mscorwks,如果您不在 .NET 4 上)并使用 !pe 命令显示异常。如果您没有异常对象,请使用!threads 列出线程及其可能具有的任何异常。

【讨论】:

    【解决方案2】:

    弄清楚该过程当时正在做什么,然后寻找其中一个:

    • 故意递归的方法可能已经超出了它们的预期位置
    • 意外的递归属性如下:

      private readonly string foo;
      public string Foo { get { return Foo; } } // Should have been return foo;
      

    理想情况下,您应该进行单元测试来帮助确定这一点——它们通常非常擅长发现此类问题。运行的单元测试可能仍然会崩溃(无法捕获 StackOverflowException),但它应该有助于隔离它。

    在采用高级调试技术之前,我个人会尝试以传统方式重现问题。

    【讨论】:

      【解决方案3】:

      也许先试试 DebugDiag - http://www.microsoft.com/download/en/details.aspx?id=26798。它将自动分析您的转储。

      如果这还不够,您将需要 SOS 来分析 .NET 代码 - http://msdn.microsoft.com/en-us/library/bb190764.aspx

      在这里您可以找到有关如何加载它的一些信息 - Unable to load SOS in WinDbg

      然后只需使用其中一个命令来分析转储。 Tess Fernandez 提供了有关如何将 windbg 与 sos 一起使用的精彩教程 - http://blogs.msdn.com/b/tess/archive/tags/debugging/

      她还发布了实验室来帮助您学习 windbg - http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx

      如果您的转储来自不同的系统,那么您对此进行分析的系统可能会有所帮助 - Is it possible to debug win2003 IIS crash dump using windbg on windows XP?

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 2010-12-08
        • 2020-11-14
        • 1970-01-01
        相关资源
        最近更新 更多