本文介绍了如何调试腐败托管堆中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的程序抛出,它不能由一个赶上(例外五)处理错误块,然后它崩溃了:

My program throws an error which it cannot handle by a catch(Exception e) block and then it crashes:

访问冲突损坏状态的异常。

这是奇怪的事情,因为,我知道,损坏状态异常的从非托管code抛出,而在这里同时调用StringBuilder方法。

This is the weird thing, because, as I know, corrupted state exceptions are thrown from unmanaged code, while here I get this exception while calling a StringBuilder method.

的code在从时间后台线程和崩溃运行到时间不能容易地再现。所以,我连着的WinDbg 的过程,并有异常的下面的堆栈:

The code runs in a background thread and crashes from time to time which cannot be easily reproduced. So I attached WinDbg to the process and have the following stack of the exception:

000000001dabd8c8 000007feea129a1d [HelperMethodFrame: 000000001dabd8c8]
000000001dabda00 000007fee90cfce8 System.Text.StringBuilder.ExpandByABlock(Int32)
000000001dabda40 000007fee90cfba4 System.Text.StringBuilder.Append(Char*, Int32)
000000001dabdaa0 000007fee9102955 System.Text.StringBuilder.Append(System.String, Int32, Int32)
000000001dabdaf0 000007ff00bf5ce3 MineUtils.Common.Strings.Strings.Replace(System.String, System.String, System.String, Boolean, Boolean)
000000001dabdb90 000007ff00bf5a59 MineUtils.Common.Strings.Strings.RemoveSubstrings(System.String, System.String, System.String, Boolean) [D:\Programs\Visual Studio 2005 Projects\MineUtils.Common\Strings\Strings.Common-Main.cs @ 1481

WinDbg中显示出现此异常:

WinDbg shows this exception occurred:

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000007feea129a1d (clr!WKS::gc_heap::find_first_object+0x0000000000000092)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: 0000000000003d80
Attempt to read from address 0000000000003d80

我读到这样的异常可以用一个方法属性[HandleProcessCorruptedStateExceptions]进行处理,但为什么这个异常曾想到,如果我只使用StringBuilder的?

I read such exceptions can be handled with a method attribute [HandleProcessCorruptedStateExceptions], but why does this exception ever occur if I only use StringBuilder?

这是previous WinDbg的分析( StringBuilder.ToString()引起的除外):

This is the previous WinDbg analysis (StringBuilder.ToString() causes the exception):

*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

FAULTING_IP:
clr!WKS::gc_heap::find_first_object+92
000007fe`ea129a1d f70100000080    test    dword ptr [rcx],80000000h

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000007feea129a1d (clr!WKS::gc_heap::find_first_object+0x0000000000000092)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000001
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: 0000000000001c98
Attempt to read from address 0000000000001c98

ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

EXCEPTION_PARAMETER1:  0000000000000000

EXCEPTION_PARAMETER2:  0000000000001c98

READ_ADDRESS:  0000000000001c98

FOLLOWUP_IP:
clr!WKS::gc_heap::find_first_object+92
000007fe`ea129a1d f70100000080    test    dword ptr [rcx],80000000h

MOD_LIST: <ANALYSIS/>

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

MANAGED_STACK:
(TransitionMU)
000000001AB7DFC0 000007FEE90CFE07 mscorlib_ni!System.Text.StringBuilder.ToString()+0x27
000000001AB7E010 000007FF00C750A9 SgmlReaderDll!Sgml.Entity.ScanToken(System.Text.StringBuilder, System.String, Boolean)+0x169
000000001AB7E080 000007FF00C760E6 SgmlReaderDll!Sgml.SgmlDtd.ParseParameterEntity(System.String)+0xc6
000000001AB7E0F0 000007FF00C76FD8 SgmlReaderDll!Sgml.SgmlDtd.ParseModel(Char, Sgml.ContentModel)+0x298
000000001AB7E160 000007FF00C7701C SgmlReaderDll!Sgml.SgmlDtd.ParseModel(Char, Sgml.ContentModel)+0x2dc
000000001AB7E1D0 000007FF00C7701C SgmlReaderDll!Sgml.SgmlDtd.ParseModel(Char, Sgml.ContentModel)+0x2dc
000000001AB7E240 000007FF00C76BA5 SgmlReaderDll!Sgml.SgmlDtd.ParseContentModel(Char)+0x65
000000001AB7E290 000007FF00C763D7 SgmlReaderDll!Sgml.SgmlDtd.ParseElementDecl()+0xe7
000000001AB7E320 000007FF00C747A1 SgmlReaderDll!Sgml.SgmlDtd.Parse()+0xc1
000000001AB7E370 000007FF00C73EF5 SgmlReaderDll!Sgml.SgmlDtd.Parse(System.Uri, System.String, System.IO.TextReader, System.String, System.String, System.Xml.XmlNameTable)+0x175
000000001AB7E410 000007FF00C73B33 SgmlReaderDll!Sgml.SgmlReader.LazyLoadDtd(System.Uri)+0x163
000000001AB7E480 000007FF00C737B9 SgmlReaderDll!Sgml.SgmlReader.OpenInput()+0x19
000000001AB7E4E0 000007FF00C7334C SgmlReaderDll!Sgml.SgmlReader.Read()+0x1c
000000001AB7E530 000007FEE5983C4C System_Xml_ni!System.Xml.XmlLoader.Load(System.Xml.XmlDocument, System.Xml.XmlReader, Boolean)+0xac
000000001AB7E590 000007FEE5983730 System_Xml_ni!System.Xml.XmlDocument.Load(System.Xml.XmlReader)+0x90
...
000000001AB7F0A0 000007FEE97ED792 mscorlib_ni!System.Threading.Tasks.Task.Execute()+0x82
000000001AB7F100 000007FEE90A181C mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)+0xdc
000000001AB7F160 000007FEE97E7F95 mscorlib_ni!System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)+0x1b5
000000001AB7F1E0 000007FEE97E7D90 mscorlib_ni!System.Threading.Tasks.Task.ExecuteEntry(Boolean)+0xb0
000000001AB7F220 000007FEE90EBA83 mscorlib_ni!System.Threading.ThreadPoolWorkQueue.Dispatch()+0x193
000000001AB7F2C0 000007FEE90EB8D5 mscorlib_ni!System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()+0x35
(TransitionUM)

EXCEPTION_OBJECT: !pe 2a61228
Exception object: 0000000002a61228
Exception type:   System.ExecutionEngineException
Message:          <none>
InnerException:   <none>
StackTrace (generated):
<none>
StackTraceString: <none>
HResult: 80131506

MANAGED_OBJECT_NAME:  System.ExecutionEngineException

MANAGED_STACK_COMMAND:  _EFN_StackTrace

LAST_CONTROL_TRANSFER:  from 000007feea12bce4 to 000007feea129a1d

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

FAULTING_THREAD:  ffffffffffffffff

DEFAULT_BUCKET_ID:  INVALID_POINTER_READ_CALL

PRIMARY_PROBLEM_CLASS:  INVALID_POINTER_READ_CALL

BUGCHECK_STR:  APPLICATION_FAULT_INVALID_POINTER_READ_WRONG_SYMBOLS_CALL__SYSTEM.EXECUTIONENGINEEXCEPTION

修订AGAIN

下面是我启用分页堆异常的WinDbg的堆栈:

Here is the WinDbg stack of the exception after I enabled paged heap:

 (1480.e84): Access violation - code c0000005 (first chance)
ntdll!ZwTerminateProcess+0xa:
00000000`77c415da c3              ret
0:023> !clrstack
OS Thread Id: 0xe84 (23)
Child SP         IP               Call Site
0000000037ded848 0000000077c415da [HelperMethodFrame: 0000000037ded848]
0000000037dedab0 000007fee9effd17 System.Text.StringBuilder.ToString()*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\mscorlib\8f7f691aa155c11216387cf3420d9d1b\mscorlib.ni.dll

0000000037dedb00 000007ff00cceae9 Sgml.Entity.ScanToken(System.Text.StringBuilder, System.String, Boolean)

0000000037dedb70 000007ff00cd19b2 Sgml.SgmlDtd.ParseAttDefault(Char, Sgml.AttDef)
0000000037dedbc0 000007ff00cd120b Sgml.SgmlDtd.ParseAttDef(Char)
0000000037dedc00 000007ff00cd1057 Sgml.SgmlDtd.ParseAttList(System.Collections.Generic.Dictionary`2<System.String,Sgml.AttDef>, Char)
0000000037dedc50 000007ff00cd10cd Sgml.SgmlDtd.ParseAttList(System.Collections.Generic.Dictionary`2<System.String,Sgml.AttDef>, Char)
0000000037dedca0 000007ff00cd0e9a Sgml.SgmlDtd.ParseAttList()
0000000037dedd10 000007ff00cce1f1 Sgml.SgmlDtd.Parse()
0000000037dedd60 000007ff00ccd945 Sgml.SgmlDtd.Parse(System.Uri, System.String, System.IO.TextReader, System.String, System.String, System.Xml.XmlNameTable)
0000000037dede00 000007ff00ccd582 Sgml.SgmlReader.LazyLoadDtd(System.Uri)
0000000037dede70 000007ff00ccd1f9 Sgml.SgmlReader.OpenInput()
0000000037deded0 000007ff00cccd8c Sgml.SgmlReader.Read()
0000000037dedf20 000007fee67b3bfc System.Xml.XmlLoader.Load(System.Xml.XmlDocument, System.Xml.XmlReader, Boolean)*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\System.Xml\8e4323f5bfb90be4621456033d8b404b\System.Xml.ni.dll
*** ERROR: Module load completed but symbols could not be loaded for C:\Windows\assembly\NativeImages_v4.0.30319_64\System.Xml\8e4323f5bfb90be4621456033d8b404b\System.Xml.ni.dll

0000000037dedf80 000007fee67b36e0 System.Xml.XmlDocument.Load(System.Xml.XmlReader)
[deleted]
0000000037deea90 000007feea61d432 System.Threading.Tasks.Task.Execute()
0000000037deeaf0 000007fee9ed17ec System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
0000000037deeb50 000007feea617c35 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef)
0000000037deebd0 000007feea617a30 System.Threading.Tasks.Task.ExecuteEntry(Boolean)
0000000037deec10 000007fee9f1b953 System.Threading.ThreadPoolWorkQueue.Dispatch()
0000000037deecb0 000007fee9f1b7a5 System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()
0000000037def310 000007feeae4dc54 [DebuggerU2MCatchHandlerFrame: 0000000037def310]
0:023> !verifyheap
-verify will only produce output if there are errors in the heap
The garbage collector data structures are not in a valid state for traversal.
It is either in the "plan phase," where objects are being moved around, or
we are at the initialization or shutdown of the gc heap. Commands related to
displaying, finding or traversing objects as well as gc heap segments may not
work properly. !dumpheap and !verifyheap may incorrectly complain of heap
consistency errors.
object 000000000e34caf8: bad member 000000001024b9a0 at 000000000e34cb08
curr_object:      000000000e34caf8
Last good object: 000000000e34cab0
----------------
0:023> !analyze
Last event: 1480.e84: Exit process 0:1480, code 80131506
  debugger time: Sun Sep 18 14:22:42.592 2011 (UTC + 1:00)
0:023> !analyze -v
Last event: 1480.e84: Exit process 0:1480, code 80131506
  debugger time: Sun Sep 18 14:22:42.592 2011 (UTC + 1:00)
0:023> .do e34cab0
          ^ Syntax error in '.do e34cab0'
0:023> !do e34cab0
Name:        System.String
MethodTable: 000007feea026870
EEClass:     000007fee9baed58
Size:        72(0x48) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
String:      appliedFiltersContainer
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feea02c758  4000103        8         System.Int32  1 instance               23 m_stringLength
000007feea02b298  4000104        c          System.Char  1 instance               61 m_firstChar
000007feea026870  4000105       10        System.String  0   shared           static Empty
                                 >> Domain:Value  00000000021343a0:000000000db21420 <<
0:023> !do e34caf8
<Note: this object has an invalid CLASS field>
Name:        System.Reflection.RuntimeAssembly
MethodTable: 000007feea02a128
EEClass:     000007fee9baf968
Size:        48(0x30) bytes
File:        C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll
Fields:
              MT    Field   Offset                 Type VT     Attr            Value Name
000007feea9ef7f0  4000e14        8 ...solveEventHandler  0 instance 0000000000000000 _ModuleResolve
000007feea036338  4000e15       10 ...che.InternalCache  0 instance 000000001024b9a0 m_cachedData
000007feea0259c8  4000e16       18        System.Object  0 instance 000000000e3abd18 m_syncRoot
000007feea033450  4000e17       20        System.IntPtr  1 instance         37a95f10 m_assembly

这里是什么地方?

What can it be?

推荐答案

最近,我面临着一个托管堆损坏这是新的东西给我。我感到非常沮丧,并有学习很多东西要能够调试。我要感谢舍瓦季托夫谁给了我正确的方向开始。他的回答很简洁,非常有帮助。我想记录我已经为我自己参考调试问题的行动。也许这将是为别人谁是新的这很有帮助。

Recently, I was faced with a managed heap corruption which was something new to me. I was very frustrated with it and had to learn many things to be able to debug it. I want to thank Seva Titov who gave me right direction to start. His answer was concise and very helpful. I want to log the actions I have taken to debug the problem for my own reference. Probably this will be helpful for others who are new to this.

调试堆损坏.NET 4:

如何怀疑堆损坏?

简而言之:

  1. 随机,没有问候应用异常捕获应用程序崩溃,甚至经历像抓毯(异常),这是为了捕获所有异常。

  1. The application crashes randomly with no regards to the applied exception catching and even goes through blankets like catch(Exception) which are supposed to catch all exceptions.

检查在应用程序崩溃的CLR堆栈转储显示了堆栈顶部的垃圾收集器:

Examining the CLR stack in the application crash dumps shows the garbage collector on the top of the stack:

000000001dabd8c8 000007feea129a1d [**HelperMethodFrame**: 000000001dabd8c8]
000000001dabda00 000007fee90cfce8 System.Text.StringBuilder.ExpandByABlock(Int32)
000000001dabda40 000007fee90cfba4 System.Text.StringBuilder.Append(Char*, Int32)
...

EXCEPTION_RECORD:  ffffffffffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 000007feea129a1d (**clr!WKS::gc_heap**::find_first_object+0x0000000000000092)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: 0000000000003d80
...

  • 在CLR堆栈始终表现出不同的点。无论发生崩溃或显示在code显然是不相关的,像这证明造成异常的StringBuilder的方法。

  • The CLR stack always shows different points. Whether the crash occurred or the code which is shown is clearly irrelevant, like StringBuilder's method which is shown to cause the exception.

    欲了解更多详情,请参阅 .NET崩溃:托管堆损坏调用非托管code

    的有序进行。每下一步是使用,如果在previous一个不帮忙。

    第1步:检查code。

    检查code为不安全或本地code用途:

    Check the code for unsafe or native code usages:

    1. 查看$ C $下不安全的DllImport 语句。
    2. 在下载 .net反射,并用它来分析的PInvoke 。以同样的方式,分析其中所使用的应用程序的第三方组件。
    1. Review the code for unsafe, DllImport statements.
    2. Download .NET Reflector and use it to analyze the application assemblies for PInvoke. In the same way, analyze the third-party assemblies which are used by the application.

    如果发现不安全或本地code用途,直接格外注意这些。在这种情况下,堆损坏的最常见原因是缓冲区溢出或参数类型不匹配。确保提供给本地code中的缓冲区,以填补足够大,并传递给本地code所有参数都是预期的类型。

    If unsafe or native code usage is found, direct extra attention to those. The most common cause of the heap corruption in such cases is a buffer overflow or an argument type mismatch. Ensure that the buffer supplied to the native code to fill is big enough and that all arguments passed to the native code are of the expected type.

    第2步:检查是否这种的损坏状态异常的可以被捕获。

    Step 2. Check if this corrupted state exception can be caught.

    要处理这样的例外,人们需要装饰包含赶上(例外)与 [HandleProcessCorruptedStateExceptions] 语句的方法$ C>属性或适用于的app.config 文件如下:

    To handle such exceptions, one need to decorate the method which contains the catch(Exception) statement with the [HandleProcessCorruptedStateExceptions] attribute or apply the following in the app.config file:

    <configuration>
        <runtime>
            <legacyCorruptedStateExceptionsPolicy enabled="true" />
        </runtime>
    </configuration>
    

    在这种情况下的异常成功抓住了,你可以登录并检查它。这意味着这不是一个已损坏的堆问题。

    In the case the exception was caught successfully, you can log and examine it. This means this is not a corrupted heap issue.

    损坏堆异常不能在所有被处理: HandleProcessCorruptedStateExceptions似乎并没有工作 的。

    Corrupted heap exceptions cannot be handled at all: HandleProcessCorruptedStateExceptions doesn't seem to work.

    在损坏的状态异常的详细信息,请参阅 所有关于在.NET4损坏的状态异常 的。

    More information on corrupted state exceptions, see All about Corrupted State Exceptions in .NET4.

    第三步:现场调试。

    在这一步中,我们调试应用程序崩溃的现场生产环境(在这里我们可以重现崩溃)。

    In this step, we debug the crashing application live in the production environment (or where we can reproduce the crash).

    对于Windows 的从下载的调试工具的的(一个网络安装程序将被下载,这将允许您选择所需的组件进行安装 - 标记所有组件)。这将安装32位和64位(如果你的系统是64位)所需要的调试工具版本。

    Download Debugging Tools for Windows from Microsoft Windows SDK for Windows 7 and .NET Framework 4 (a web installer will be downloaded which will allow selecting the required components to install - mark all components). It will install both 32 and 64 bit (if your system is x64) versions of the required debugging tools.

    在这里,人们需要知道如何把WinDbg连接到实时进程,如何采取崩溃转储,并检查它们,如何加载的扩展WinDbg中(谷歌的详情)。

    Here one needs to know how to attach WinDbg to a live process, how to take crash dumps and examine them, how to load SOS extension in WinDbg (google for details).

    启用调试助手:

    1. 启动应用程序验证程序( C:\ Program Files文件\应用程序验证 - 使用所需的版本,x86或x64,这取决于你的可执行文件的编译方式),在左窗格中,在右侧窗格中检查一个节点基础/堆添加可执行文件存在。保存更改。

    1. Launch Application Verifier (C:\Program Files\Application Verifier - use the required edition, either x86 or x64, depending on your executable compilation mode), add your executable there in the left pane and in the right pane check one node "Basics / Heaps". Save the changes.

    启动全局标志帮手( C:\ Program Files文件\ Windows调试工具\ gfl​​ags.exe - 再次选择了正确的版本,x86或x64)。一旦全局标志的开始,到图像文件选项卡,然后在最上面的文本框中输入您的可执行文件的名称,没有任何路径(例如,MyProgram.exe)。然后preSS的标签键并设置以下框:

    Launch Global Flags helper (C:\Program Files\Debugging Tools for Windows\gflags.exe - again select the correct edition, x86 or x64). Once Global Flags is started, go to the "Image File" tab and at the top text box enter the name of your executable file without any paths (for example, "MyProgram.exe"). Then press the key and set the following boxes:

    • 启用堆尾部检查
    • 启用堆免费检查
    • 启用堆参数检查
    • 启用堆验证呼叫
    • 禁用堆凝聚自由
    • 启用页堆
    • 启用堆标记
    • 启用应用程序验证
    • 在调试器(请在文本框中正确的路径,安装的WinDbg,例如, C:\ Program Files文件\ Windows调试工具(x64)的\ windbg.exe -g )。
    • Enable heap tail checking
    • Enable heap free checking
    • Enable heap parameter checking
    • Enable heap validation on call
    • Disable heap coalesce on free
    • Enable page heap
    • Enable heap tagging
    • Enable application verifier
    • Debugger (type the path to the installed WinDbg in the text box to the right, for example, C:\Program Files\Debugging Tools for Windows (x64)\windbg.exe -g).

    有关详细信息,请参阅 堆损坏,第2部分

    For more details, refer to Heap Corruption, Part 2.

    进入控制面板/系统和安全/系统(或右键单击开始菜单中的计算机,选择属性。里面点击高级系统设置,在弹出的对话框中,去到高级选项卡,然后单击环境变量按钮,在弹出的对话框中,添加一个新的系统变量。(如果你是一个系统管理员 - 用户变量,否则 - 你需要需要注销/登录在这种情况下)的所需的变量是COMPLUS_HeapVerify与1的值。更多细节可以在堆栈溢出问题被发现的 .NET/C#:如何设置调试环境变量COMPLUS_HeapVerify? 的。

    Go to "Control Panel/System and Security/System" (or right-click "Computer" in the Start menu and select "Properties". There click "Advanced system settings", in the displayed dialog, go to "Advanced" tab and click the "Environment Variables" button. In the displayed dialog, add a new System variable (if you are an system administrator - a User variable otherwise - you need need to logout/login in this case). The required variable is "COMPLUS_HeapVerify" with a value of "1". More details can be found in Stack Overflow question .NET/C#: How to set debugging environment variable COMPLUS_HeapVerify?.

    现在,我们已经准备好开始调试。启动应用程序。 WinDbg中应该会自动启动。保持运行的应用程序,直到它撞上WinDgb然后检查转储。

    Now we are ready to start debugging. Start the application. WinDbg should start automatically for it. Leave the application running until it crashes into WinDgb and then examine the dump.

    提示:要快速删除的全局标志应用程序验证的和调试器附件设置,删除以下注册表项:64 - HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \微软\的Windows NT \ CURRENTVERSION \图像文件执行选项\ * YourAppName *

    TIP: To quickly remove Global Flags, Application Verifier and the debugger attachment settings, delete the following key in the registry:x64 - HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\*YourAppName*

    第四步:启用有关部委。

    尝试使用托管调试助手。详细情况请堆栈溢出问题的 What里程碑决策者是有用的跟踪堆损坏? 的。

    Try to use the Managed Debugging Assistants. Details are in Stack Overflow question What MDAs are useful to track a heap corruption?.

    的MDAs必须连同WinDbg的使用。我用他们甚至一起的全局标志应用程序验证的。

    MDAs must be used along with WinDbg. I used them even along with Global Flags and Application Verifier.

    第5步:启用GCStress。

    使用GCStress是一个极端的选择,因为该应用程序变得几乎不可用的,但它仍是一个路要走。更多详细信息都在的 GCStress:如何打开Windows 7 ? 的。

    Using GCStress is an extreme option, because the application becomes almost unusable, but it is still a way to go. More details are in GCStress: How to turn on in Windows 7?.

    第6步:编译为86。

    如果您的应用程序,目前正在编制的任何CPU或64的平台,尝试编译它为86,如果没有区别的,你要使用的平台。我看到这个报道来解决别人的问题。

    If your application is currently being compiled for "Any CPU" or "x64" platform, try to compile it for "x86" if there is no difference for you which platform to use. I saw this reported to solve the problem for somebody.

    步骤7.禁用并发GC - 这是为我工作

    有一个报告的已知问题,在.NET 4日报道,在线程的 Access冲突在.NET 4运行在gc_heap :: garbage_collect没有非托管模块 的。这个问题可以通过禁用的的app.config 文件并发GC来解决:

    There is a reported known issue in .NET 4 reported in the thread Access Violation in .NET 4 Runtime in gc_heap::garbage_collect with no unmanaged modules. The problem can be solved by disabling the concurrent GC in the app.config file:

    <?xml version="1.0"?>
    <configuration>
        <runtime>
            <gcConcurrent enabled="false" />
        </runtime>
    </configuration>
    

    这篇关于如何调试腐败托管堆中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

  • 08-02 02:41