2010-07-22 182 views
13

我正在调试一些随机崩溃错误,但实际上很难深入。因为当我打开崩溃转储,只找到一个错误:什么是WinDbg中的“Break指令异常”?

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

其实我还没有在代码中设置任何硬编码断点,所以我搜索一下这个例外在谷歌,有人说这个异常可能会引起由堆腐败。 所以我的问题是, 是否有任何其他原因导致此异常,除硬编码断点,调试时手动断点,堆损坏?

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

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

*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包。

下面是结果!分析-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 

...

在管理堆栈,有一个明确的错误,Microsoft.VisualStudio.NativeMethods.ThrowOnFailure .. 但是,意味着com异常导致break指令异常?

!分析似乎只是转储管理级别,com例外可能是管理级别中的最后一个错误。

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

对不起?

如果是这样,我认为Application Verifier应该是找到根本原因的最佳选择。

回答

12

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

套装微软符号服务器自动路径:

0:000> .symfix 

您还可以指定一个额外的位置在哪里,例如从下载符号:

0:000> .sympath+ c:\myproject 

检查当前符号搜索路径:

0:000> .sympath 

您应该看到这样的事情:

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

刷新符号:

0:000> .reload 

然后,你会能够看到关于curr的信息使用ENT例外此命令:

0:000> !analyze -v 

你应该会看到类似下面的一行:

ExceptionCode: c0000005 (Access violation) 

好运修复错误!

+0

谢谢你这个简洁的答案!创造了我的一天。 – 2013-03-22 20:11:34

+3

如何固定符号将INT3断点转换为访问冲突? – 2016-06-24 19:08:09

2

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