2010-04-16 45 views
0

我们的C#/ COM/C++应用程序崩溃了,我需要帮助调试它。运行启用了gflags和WinDbg后,我们确定崩溃是由访问冲突造成的,但我们还没有能够缩小它的范围。我们没有看到所有机器上的问题;有几台机器似乎经常重现这个问题,但不是确定性的。我们观察到应用程序崩溃时,只需从应用程序切换(例如Alt-Tab),然后再切换回来。 WinDbg的输出如下。如何调试非确定性访问冲突崩溃?

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

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

分析-v

EXCEPTION_RECORD:FFFFFFFF - (.exr 0xffffffffffffffff)ExceptionAddress: 1a584ff2 (+ 0x1a584ff1)
ExceptionCode:0000005(访问 冲突)ExceptionFlags:00000000 NumberParameters: 2参数[0]: 00000000参数[1]:1a584ff2 尝试从地址1a584ff2读取

PROCESS_NAM E: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:上螺纹[0]:[E30]

BUGCHECK_STR:基于属性[ip_not_executable] 从帧跟进设置 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。润+ 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

+1

您是否尝试过在启用第一次机会异常处理的情况下运行附加到调试器? (在Visual Studio中按Ctrl + Alt + E)。 – 2010-04-16 18:33:39

+0

是的,奇怪的是:我们什么都看不到。它似乎只能在一台机器上重现,而不是在我们的开发机器上重现。 – 2010-04-16 18:36:50

+0

堆已损坏。你会在这个线程中找到很好的调试提示:http://stackoverflow.com/questions/1010106/how-to-debug-heap-corruption-errors或者通过Google搜索“如何调试堆损坏”。 – 2010-04-16 20:07:26

回答

3

查找相当频繁再现崩溃的计算机,并在计算机上安装的WinDbg。然后运行windbg.exe -I,这将使WinDbg成为死后处理程序。

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

+0

我以前已经预先附加了'windbg.exe',并试图将其配置为不会经常中断,但我不知道'-I'开关,这看起来像是一种更简洁的方法。 – 2015-09-25 09:54:52

0

感谢您的回复。

我们最终通过评估自上次软件版本(未发生崩溃)以来的所有代码更改来发现问题。罪魁祸首是HideSelection在文本控件的OnLostFocus覆盖中被设置为false。每this后 - 导致不好的事情发生(无论如何,在某些机器上)。