C#stackoveflowexception

我有一个堆栈溢出exception,我能够使用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:  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 

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

弄清楚当时流程正在做什么,并寻找:

  • 故意递归的方法可能已经超出了它们的意图
  • 像这样的意外递归属性:

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

理想情况下,你应该进行unit testing,这可以帮助解决这个问题 – 他们通常很擅长发现这些问题。 unit testing运行可能仍会崩溃(无法捕获StackOverflowException)但它应该有助于隔离它。

在进行高级调试技术之前,我个人会尝试以常规方式重现问题。

也许首先尝试DebugDiag – http://www.microsoft.com/download/en/details.aspx?id=26798 。 它会自动分析你的转储。

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

在这里您可以找到有关如何加载它的一些信息 – 无法在WinDbg中加载SOS 。

然后只需使用其中一个命令来分析转储。 Tess Fernandez有很多关于如何使用sb的windbg的教程 – 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

如果您的转储来自不同的系统,那么您在此处分析的转储可能有所帮助 – 是否可以在Windows XP上使用windbg调试win2003 IIS崩溃转储?