What is the “Break instruction exception” in WinDbg?
我正在调试一些随机的崩溃错误,但实际上很难深入研究。因为当我打开故障转储时,只会发现一个错误:
1 2 3 4 5 | 0:000> .exr -1 ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0 |
实际上我没有在代码中设置任何硬代码断点,因此我在Google中搜索了此异常,有人说此异常可能是由堆损坏引起的。
所以我的问题是
除了硬代码断点,调试时的手动断点,堆损坏之外,还有其他原因导致此异常的原因吗?
另一个问题是,我尝试使用应用程序验证程序检查堆损坏,我了解它是如何工作的,应用程序验证程序将在堆损坏时触发中断指令异常。但是目前,我在没有应用验证程序的情况下运行,谁会引发中断指令异常?
附加信息:为当前线程调用堆栈。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | *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的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | 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 |
...
在托管堆栈中,存在一个显式错误Microsoft.VisualStudio.NativeMethods.ThrowOnFailure。
但这是否意味着com异常导致中断指令异常?
!analyze似乎只是转储托管级别,com异常可能是托管级别中的最后一个错误。
我也从google搜索有关中断和异常的信息,通常,可以在以下情况下触发break指令异常:
1.硬代码中断请求,例如:__asm int 3(ASM),System.Diagnostics.Debugger.Break(C#),DebugBreak()(WinAPI)。
2. OS启用内存运行时检查,就像Application Verifier可以在堆损坏,内存溢出后触发。
3.编译器可以进行一些配置,以填充应为未初始化的存储块和函数结尾填充的内容(重新调谐后为空白区域)。例如,如果启用/ GZ,则Microsoft VC编译器可以填充0xCC。 0xCC实际上是__asm int 3的操作码。因此,如果某些错误导致应用程序运行到此类块中,将触发断点。
正确?
如果是这样,我认为Application Verifier应该是找到根本原因的最佳选择。
供以后参考,因为您需要将Windows符号添加到Windbg符号路径,所以会导致您的调试器使用的符号错误警告。 这样做的方法如下:
自动设置Microsoft符号服务器路径:
1 | 0:000> .symfix |
(可选)您可以指定其他位置来下载符号,例如:
1 | 0:000> .sympath+ c:\\myproject |
检查当前符号搜索路径:
1 | 0:000> .sympath |
您应该会看到以下内容:
1 | SRV**http://msdl.microsoft.com/download/symbols |
重新加载符号:
1 | 0:000> .reload |
然后,您将可以使用以下命令查看有关当前异常的信息:
1 | 0:000> !analyze -v |
您应该看到类似于以下内容的行:
1 | ExceptionCode: c0000005 (Access violation) |
祝您改正错误!
查找导致崩溃转储的异常的命令为