WinDbg中的“Break指令exception”是什么?

我正在debugging一些随机的崩溃错误,但实际上很难深入。 因为当我打开崩溃转储,只发现一个错误:

0:000> .exr -1 ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 

其实我没有在代码中设置任何硬代码断点,所以我在谷歌search这个exception,有人说这个exception可能是由损坏造成的。 所以我的问题是,除了硬代码断点,debugging时手动断点,堆损坏,为什么会导致此exception还有其他原因吗?

另一个问题是,我尝试使用应用程序validation程序来检查堆损坏,我明白它是如何工作的,应用程序validation器将在堆损坏时触发中断指令exception。 但目前,我运行没有应用程序validation,谁会提高中断指令exception?

附加信息:调用当前线程的堆栈。

 *0:000> k ChildEBP RetAddr 0012f96c 7c827d19 ntdll!KiFastSystemCallRet 0012f970 77e6202c ntdll!NtWaitForMultipleObjects+0xc 0012fa18 7739bbd1 kernel32!WaitForMultipleObjectsEx+0x11a 0012fa74 3b288523 user32!RealMsgWaitForMultipleObjectsEx+0x141 0012fab8 3b32b9bd msenv!EnvironmentMsgLoop+0x1ea 0012fae4 3b32b94d msenv!CMsoCMHandler::FPushMessageLoop+0x86 0012fb0c 3b32b8e9 msenv!SCM::FPushMessageLoop+0xb7 0012fb28 3b32b8b8 msenv!SCM_MsoCompMgr::FPushMessageLoop+0x28 0012fb48 3b32be4e msenv!CMsoComponent::PushMsgLoop+0x28 0012fbe0 3b327561 msenv!VStudioMainLogged+0x482 0012fc0c 3000a4a6 msenv!VStudioMain+0xc1 0012fc38 30007301 devenv!util_CallVsMain+0xff 0012ff14 3000760c devenv!CDevEnvAppId::Run+0x91f 0012ff30 30007680 devenv!WinMain+0x74 0012ffc0 77e6f23b devenv!License::GetPID+0x258 0012fff0 00000000 kernel32!BaseProcessStart+0x23* 

我们的应用程序是一个Visual Studio包。

下面是!analyze -v的结果

 0:000> !analyze -v ******************************************************************************* * * * Exception Analysis * * * ******************************************************************************* *** WARNING: Unable to verify checksum for mscorlib.ni.dll ************************************************************************* *** *** *** *** *** Your debugger is not using the correct symbols *** *** *** *** In order for this command to work properly, your symbol path *** *** must point to .pdb files that have full type information. *** *** *** *** Certain .pdb files (such as the public OS symbols) do not *** *** contain the required information. Contact the group that *** *** provided you with these symbols if you need this command to *** *** work. *** *** *** *** Type referenced: kernel32!pNlsUserInfo *** *** *** ************************************************************************* ************************************************************************* *** *** *** *** *** Your debugger is not using the correct symbols *** *** *** *** In order for this command to work properly, your symbol path *** *** must point to .pdb files that have full type information. *** *** *** *** Certain .pdb files (such as the public OS symbols) do not *** *** contain the required information. Contact the group that *** *** provided you with these symbols if you need this command to *** *** work. *** *** *** *** Type referenced: kernel32!pNlsUserInfo *** *** *** ************************************************************************* FAULTING_IP: +0 00000000 ?? ??? EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff) ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 FAULTING_THREAD: 00001f1c DEFAULT_BUCKET_ID: STATUS_BREAKPOINT PROCESS_NAME: devenv.exe ERROR_CODE: (NTSTATUS) 0x80000003 - {EXCEPTION} Breakpoint A breakpoint has been reached. EXCEPTION_CODE: (HRESULT) 0x80000003 (2147483651) - One or more arguments are invalid NTGLOBALFLAG: 0 APPLICATION_VERIFIER_FLAGS: 0 MANAGED_STACK: SP IP Function 0012E584 09C8A903 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure(Int32, Int32[])+0x3b 0012E590 09C8C604 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.Design.VSDesignSurfaceManager.Microsoft.VisualStudio.Shell.Interop.IVsSelectionEvents.OnElementValueChanged(UInt32, System.Object, System.Object)+0x144 StackTraceString: <none> HResult: 80004005 EXCEPTION_OBJECT: !pe 3115d464 Exception object: 3115d464 Exception type: System.Runtime.InteropServices.COMException Message: Error HRESULT E_FAIL has been returned from a call to a COM component. InnerException: <none> StackTrace (generated): SP IP Function 0012E584 09C8A903 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure(Int32, Int32[])+0x3b 0012E590 09C8C604 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.Design.VSDesignSurfaceManager.Microsoft.VisualStudio.Shell.Interop.IVsSelectionEvents.OnElementValueChanged(UInt32, System.Object, System.Object)+0x144 StackTraceString: <none> HResult: 80004005 MANAGED_OBJECT: !dumpobj 3201988 Name: System.String MethodTable: 79330a00 EEClass: 790ed64c Size: 158(0x9e) bytes (C:\WINDOWS\assembly\GAC_32\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll) String: Error HRESULT E_FAIL has been returned from a call to a COM component. Fields: MT Field Offset Type VT Attr Value Name 79332c4c 4000096 4 System.Int32 1 instance 71 m_arrayLength 79332c4c 4000097 8 System.Int32 1 instance 70 m_stringLength 793316e0 4000098 c System.Char 1 instance 45 m_firstChar 79330a00 4000099 10 System.String 0 shared static Empty >> Domain:Value 00219c28:03031198 << 79331630 400009a 14 System.Char[] 0 shared static WhitespaceChars >> Domain:Value 00219c28:03031798 << EXCEPTION_MESSAGE: Error HRESULT E_FAIL has been returned from a call to a COM component. MANAGED_OBJECT_NAME: System.Runtime.InteropServices.COMException LAST_CONTROL_TRANSFER: from 7c827d19 to 7c82860c PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT STACK_TEXT: 09c8a903 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure 09c8c604 Microsoft_VisualStudio_Design!Microsoft.VisualStudio.Design.VSDesignSurfaceManager.Microsoft.VisualStudio.Shell.Interop.IVsSelectionEvents.OnElementValueChanged STACK_COMMAND: dds 12e584 ; kb FOLLOWUP_IP: +9c8a903 09c8a903 8bc6 mov eax,esi SYMBOL_STACK_INDEX: 0 SYMBOL_NAME: Microsoft_VisualStudio_Design!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure+9c8a903 FOLLOWUP_NAME: MachineOwner MODULE_NAME: Microsoft_VisualStudio_Design IMAGE_NAME: Microsoft.VisualStudio.Design.dll DEBUG_FLR_IMAGE_TIMESTAMP: 0 FAILURE_BUCKET_ID: STATUS_BREAKPOINT_80000003_Microsoft.VisualStudio.Design.dll!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_Microsoft_VisualStudio_Design!Microsoft.VisualStudio.NativeMethods.ThrowOnFailure+9c8a903 Followup: MachineOwner 

在托pipe堆栈中,有一个明确的错误,Microsoft.VisualStudio.NativeMethods.ThrowOnFailure ..但是这意味着comexception导致break指令exception?

!分析似乎只是转储pipe理级别,com例外也许是pipe理级别的最后一个错误。

通常情况下,可以在以下情况下触发中断指令exception:1.硬编码中断请求,如:__asm int 3(ASM),System.Diagnostics.Debugger.Break(C#), DebugBreak()(WinAPI)。 2. OS启用内存运行时检查,就像Application Verifier可以在堆损坏后触发内存溢出一样。 3.编译器可以有一些configuration,以便能够填充未初始化的内存块和函数结尾(空白区域,retun之后)。 例如,如果启用/ GZ,Microsoft VC编译器可以填充0xCC。 0xCC实际上是一个__asm int 3的操作码。所以如果一些错误导致应用程序运行到这样的块,将会触发一个断点。

正确?

如果是这样,我认为Application Verifier应该是find根本原因的最佳select。

为了将来的参考, 您的调试器不使用正确的符号警告是由于您需要将Windows符号添加到Windbg符号路径引起的。 这是如何做到这一点:

自动设置Microsoft符号服务器路径:

 0:000> .symfix 

您也可以指定一个附加的位置来下载符号,例如:

 0:000> .sympath+ c:\myproject 

检查当前符号搜索路径:

 0:000> .sympath 

你应该看到这样的东西:

 SRV**http://msdl.microsoft.com/download/symbols 

重新加载符号:

 0:000> .reload 

然后,您将能够使用以下命令查看有关当前异常的信息:

 0:000> !analyze -v 

您应该看到类似于以下内容的一行:

 ExceptionCode: c0000005 (Access violation) 

祝你好运,修复错误!

用于查找导致崩溃转储的异常的命令是.ecxr 。 从.exr -1得到的输出不正确,因为ExceptionAddress是零。