0:000> .exr -1 ExceptionAddress: 00000000 ExceptionCode: 80000003 (Break instruction exception) ExceptionFlags: 00000000 NumberParameters: 0
其实我没有在代码中设置任何硬代码断点,所以我在google中搜索这个异常,有人说这个异常可能是由于堆损坏引起的.
所以我的问题是
是否有任何其他原因导致此异常,除了硬代码断点,手动断点调试,堆损坏?
另一个问题是,我尝试使用Application Verifier检查堆损坏,我明白它是如何工作的,应用程序验证程序将在堆损坏时触发中断指令异常.但是目前我没有应用程序验证程序,谁会提出中断指令异常?
附加信息:当前线程的调用堆栈.
*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,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异常会导致break指令异常?
!分析似乎只是转储管理级别,com例外可能是托管级别的最后一个错误.
我也从google搜索关于中断和异常的东西,通常可以在以下条件下触发break指令异常:
1.硬编码中断请求,如:__asm int 3(ASM),System.Diagnostics.Debugger.Break(C#),DebugBreak()(WinAPI).
2.操作系统启用内存运行时检查,如应用程序验证程序可以在堆损坏后触发内存溢出.
3.编译器可以有一些配置来为未初始化的内存块和功能结束(空白区域,重新调试后)填充什么.例如,如果启用/ GZ,Microsoft VC编译器可以填写0xCC. 0xCC实际上是一个__asm int 3的操作码.所以如果一些错误导致应用程序运行到这样的块中,将触发一个断点.
正确?
如果是这样,我认为应用验证者应该是寻找根本原因的最佳选择.
自动设置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)
祝好运修错误!