Что такое «исключение инструкции разрыва» в WinDbg? - PullRequest
14 голосов
/ 22 июля 2010

Я отлаживаю некоторые случайные ошибки при сбое, но на самом деле очень сложно углубиться.Потому что, когда я открываю аварийный дамп, найдите только одну ошибку:

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.

Ниже приведен результат из! Analyse -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 вызывает исключение инструкции прерывания?

! Analysis кажется просто сбросить управляемый уровень, исключение comвозможно, последняя ошибка в управляемом уровне.

Я также ищу что-то о прерывании и исключении из Google. Обычно исключение инструкции прерывания может быть вызвано в следующих условиях: 1. Жесткий запрос прерывания, например: __asm ​​int 3(ASM), System.Diagnostics.Debugger.Break (C #), DebugBreak () (WinAPI).2. ОС включает проверку памяти во время выполнения, как Application Verifier может срабатывать после повреждения кучи, переполнения памяти.3. Компилятор может иметь некоторую конфигурацию для включения того, что должно быть заполнено для неинициализированного блока памяти и конца функции (пустая область после повторной настройки ..).Например, компилятор Microsoft VC может заполнить 0xCC, если включить / GZ.На самом деле 0xCC - это код операции __asm ​​int 3. Поэтому, если из-за какой-то ошибки приложение запустится в такой блок, сработает точка останова.

Исправить?

Если это, я думаю, Application Verifier долженбыть лучшим выбором, чтобы найти причину.

Ответы [ 2 ]

13 голосов
/ 22 июня 2011

Для дальнейшего использования, Ваш отладчик не использует правильные символы. Предупреждение вызвано тем, что вам нужно добавить символы 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)

Удачи исправления ошибок!

2 голосов
/ 10 ноября 2011

Команда для поиска исключения, вызвавшего аварийный дамп, - .ecxr.Результат, полученный от .exr -1, неверен, поскольку адрес исключения - ноль.

...