如何调试非确定性访问冲突崩溃?

时间:2010-04-16 18:32:00

标签: c# c++ com crash access-violation

我们的C#/ COM / C ++应用程序崩溃了,我需要帮助调试它。在启用gflags并附加WinDbg的情况下运行,我们确定崩溃是由访问冲突引起的,但我们无法将其缩小范围。我们没有在所有机器上看到这个问题;有几台机器似乎经常重现这个问题,但没有确定性。我们已经观察到应用程序崩溃,只需从应用程序(例如,Alt-Tab)切换,然后再返回。 WinDbg的输出低于。

我们一直试图系统地评论可能导致问题的代码区域,但我们还没有取得多大成功。

有关我们应该尝试哪些调试步骤或工具的任何建议?

  

!analyze -v

     

EXCEPTION_RECORD:ffffffff - (.exr   0xffffffffffffffff)异常地址:   1a584ff2   (+ 0x1a584ff1)
  ExceptionCode:c0000005(Access   违规)ExceptionFlags:00000000   NumberParameters:2参数[0]:   00000000参数[1]:1a584ff2   尝试从地址1a584ff2读取

     

PROCESS_NAME:ProcessFiles.exe

     

ERROR_CODE:(NTSTATUS)0xc0000005 -   引用0x%08lx的指令   内存在0x%08lx。记忆可以   不是%s。

     

EXCEPTION_CODE:(NTSTATUS)0xc0000005    - 0x%08lx处的指令引用0x%08lx处的内存。该   记忆不能是%s。

     

EXCEPTION_PARAMETER1:00000000

     

EXCEPTION_PARAMETER2:1a584ff2

     

READ_ADDRESS:1a584ff2

     

FOLLOWUP_IP:Ed20 + 1a584ff1 1a584ff2   ?? ???

     

NTGLOBALFLAG:2000000

     

APPLICATION_VERIFIER_FLAGS:0

     

IP_MODULE_UNLOADED:Ed20 + 1a584ff1   1a584ff2 ?? ???

     

MANAGED_STACK:(TransitionMU)   0EC6F6F4 7B1D8CCE   System_Windows_Forms_ni!System.Windows.Forms.Application + ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(的Int32,   Int32,Int32)+ 0x24e 0EC6F790 7B1D8937   System_Windows_Forms_ni!System.Windows.Forms.Application + ThreadContext.RunMessageLoopInner(的Int32,   System.Windows.Forms.ApplicationContext)+ 0x177   0EC6F7E4 7B1D8781   System_Windows_Forms_ni!System.Windows.Forms.Application + ThreadContext.RunMessageLoop(的Int32,   System.Windows.Forms.ApplicationContext)+ 0x61   0EC6F814 7B195911   System_Windows_Forms_ni!System.Windows.Forms.Application.Run(System.Windows.Forms.Form中)+ 0X31   0EC6F828 0969D97A   Extract_Utilities_Forms!Extract.Utilities.Forms.VerificationForm`1 [系统.__佳能,   mscorlib程序]。A(System.Object的)+ 0x23a   0EC6F8C0 79A00EEE   mscorlib_ni!System.Threading.ThreadHelper.ThreadStart_Context(System.Object的)+ 0x72a25e   0EC6F8CC 792E019F   mscorlib_ni!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,   System.Threading.ContextCallback,   System.Object)+ 0x6f 0EC6F8E4 797DB48A   mscorlib_ni!System.Threading.ThreadHelper.ThreadStart(System.Object的)+ 0x4a   (TransitionUM)

     

LAST_CONTROL_TRANSFER:来自7e418734   到1a584ff2

     

FAULTING_THREAD:ffffffff

     

ADDITIONAL_DEBUG_TEXT:后续设置   基于属性[ip_not_executable]   来自Frame:[0] on thread:[e30]

     

BUGCHECK_STR:   APPLICATION_FAULT_BAD_INSTRUCTION_PTR_INVALID_POINTER_READ_WRONG_SYMBOLS_WINDOW_HOOK

     

PRIMARY_PROBLEM_CLASS:   BAD_INSTRUCTION_PTR

     

DEFAULT_BUCKET_ID:   BAD_INSTRUCTION_PTR

     

STACK_TEXT:7b1d8cce   System_Windows_Forms_ni!System.Windows.Forms.Application + ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop + 0xC的   7b1d8937   System_Windows_Forms_ni!System.Windows.Forms.Application + ThreadContext.RunMessageLoopInner + 0x0 7b1d8781   System_Windows_Forms_ni!System.Windows.Forms.Application + ThreadContext.RunMessageLoop +为0x0   7b195911   System_Windows_Forms_ni!System.Windows.Forms.Application.Run + 0X31   0969d97a   Extract_Utilities_Forms!Extract.Utilities.Forms.VerificationForm`1 [系统.__佳能,   mscorlib]]。A + 0x23a 79a00eee   mscorlib_ni!System.Threading.ThreadHelper.ThreadStart_Context + 0x72a25e   792e019f   mscorlib_ni!System.Threading.ExecutionContext.Run + 0x6f   797db48a   mscorlib_ni!System.Threading.ThreadHelper.ThreadStart + 0x4a

     

STACK_COMMAND:.ecxr; ~~ [e30];   .frame 0; **伪上下文**; KB

     

FAILED_INSTRUCTION_ADDRESS:   Ed20 + 1a584ff1 1a584ff2 ??
  ???

     

SYMBOL_NAME:Ed20

     

FOLLOWUP_NAME:MachineOwner

     

MODULE_NAME:Ed20

     

IMAGE_NAME:Ed20

     

DEBUG_FLR_IMAGE_TIMESTAMP:0

     

FAILURE_BUCKET_ID:   BAD_INSTRUCTION_PTR_c0000005_Ed20!空载

     

BUCKET_ID:   APPLICATION_FAULT_BAD_INSTRUCTION_PTR_INVALID_POINTER_READ_WRONG_SYMBOLS_WINDOW_HOOK_BAD_IP_Ed20

     

跟进:MachineOwner

2 个答案:

答案 0 :(得分:3)

找到一台经常重现崩溃的计算机,并在该计算机上安装WinDbg。然后运行windbg.exe -I,这将使WinDbg成为事后崩溃处理程序。

等待崩溃发生。当发生这种情况时,WinDbg将在崩溃时自动打开。使用WinDbg命令kpn获取堆栈跟踪。 (您可能还需要确保机器上还有符号。)

答案 1 :(得分:0)

感谢您的回复。

我们最终通过评估自上一版本软件(未崩溃)以来的所有代码更改来找到问题。罪魁祸首是在文本控件的OnLostFocus重写中将HideSelection设置为false。每this个帖子 - 导致坏事发生(好吧,无论如何,在某些机器上)。