C#堆栈溢出异常

C#堆栈溢出异常,c#,C#,我有一个堆栈溢出异常,我能够使用windbg来获取所有内容的日志,但是这个日志对我来说非常陌生,我不确定我在寻找什么。感谢您的帮助 FAULTING_IP: +1d42faf00b2df58 02dbb89f e9e3000000 jmp 02dbb987 EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 791a2c0c (clr!EECodeManager::EnumGc

我有一个堆栈溢出异常,我能够使用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
FAULTING\u IP:
+1d42faf00b2df58
02dbb89f e9e3000000 jmp 02dbb987
异常记录:ffffffff--(.exr 0xffffffffffffffff)
例外地址:791a2c0c(clr!EECodeManager::EnumGcRefs+0x0000001b)
例外代码:c00000fd(堆栈溢出)
例外标志:00000000
数字参数:2
参数[0]:00000001
参数[1]:02dd2edc
进程名称:crawler.exe
错误代码:(NTSTATUS)0xc00000fd-无法为堆栈创建新的保护页。
异常代码:(NTSTATUS)0xc00000fd-无法为堆栈创建新的保护页。
异常参数1:0000000 1
异常参数2:02dd2edc
循环_堆栈:从帧0x19到0x19
模块列表:
NTGLOBALFLAG:0
应用程序\验证程序\标志:0
托管_堆栈:!转储堆栈-EE
找不到导出转储堆栈
附加的\u调试\u文本:基于线程:[PSEUDO\u thread]上帧[0]的属性[Is\u ChosenCrashFollowupThread]的后续设置
最后一次控制转移:从791a2fad到791a2c0c
错误线程:ffffffff
默认_BUCKET_ID:NOSOS
主要问题类别:NOSOS
错误检查\u STR:应用程序\u故障\u故障\u堆栈\u溢出\u堆栈免疫
堆栈文本:
00000000 00000000爬虫程序.exe+0x0
SYMBOL_名称:crawler.exe
跟进名称:机器所有者
模块名称:爬虫
图像名称:crawler.exe
调试\u FLR\u映像\u时间戳:4e5a416f
STACK_命令:**伪上下文**;kb
失败\u BUCKET\u ID:NOSOS\u c0000fd\u crawler.exe!不为人知
BUCKET\u ID:APPLICATION\u FAULT\u NOSOS\u STACK\u OVERFLOW\u STACKIMMUNE\u crawler.exe
后续IP:**警告:无法验证crawler.exe的校验和
***错误:模块加载已完成,但无法为crawler.exe加载符号
爬虫+0
00400000 4d十二月ebp
WATSON_STAGEONE_网址:http://watson.microsoft.com/StageOne/crawler_exe/1_0_0_0/4e5a416f/clr_dll/4_0_30319_1/4ba1d9ef/c00000fd/00062c0c.htm?Retriage=1
跟进:机器所有者
---------
0:005>.exr 0xffffffffffffffff
例外地址:791a2c0c(clr!EECodeManager::EnumGcRefs+0x0000001b)
例外代码:c00000fd(堆栈溢出)
例外标志:00000000
数字参数:2
参数[0]:00000001
参数[1]:02dd2edc

找出流程当时在做什么,然后查找以下任一项:

  • 故意递归的方法,这些方法可能已经递归到超出其预期的位置
  • 意外递归属性,如下所示:

    private readonly string foo;
    public string Foo { get { return Foo; } } // Should have been return foo;
    
理想情况下,您应该有单元测试来帮助确定这一点——它们通常非常擅长发现此类问题。单元测试运行可能仍然会崩溃(无法捕获StackOverflowException),但它应该有助于隔离它


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

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

也许可以先试试DebugDiag-。它会自动分析你的垃圾

如果这还不够,您将需要SOS来分析.NET代码-

在这里你可以找到一些关于如何加载它的信息-

然后只需使用其中一个命令来分析转储。苔丝·费尔南德斯(Tess Fernandez)提供了关于如何将windbg与sos-结合使用的精彩教程

她还出版了帮助你学习windbg-的实验室


如果您的转储来自不同的系统,那么您在此系统上分析的转储可能会有帮助-

堆栈跟踪?什么代码导致问题?您的问题是什么?逐步完成代码并发布实际异常和它所涉及的行。如果您计划从windbg调试C#,请加载SOS。不过,如果您正在调试C,我会默认使用C#Express。如果你不熟悉windbg,它是免费的,而且更容易使用。这就是问题的全部,我不知道是什么导致了这个问题