web-dev-qa-db-ja.com

WinDbgの「ブレーク命令例外」とは何ですか?

私はいくつかのランダムなクラッシュバグをデバッグしていますが、実際には深く掘り下げるのは非常に困難です。クラッシュダンプを開いたときに、エラーが1つだけ見つかるためです。

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*

私たちのアプリケーションはVisualStudioパッケージです。

以下は!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

.。

管理対象スタックに、明示的なエラーMicrosoft.VisualStudio.NativeMethods.ThrowOnFailure ..があります。しかし、これは、com例外がブレーク命令例外を引き起こすことを意味しますか?

!analyzeは管理対象レベルをダンプしているようですが、com例外は管理対象レベルの最後のエラーである可能性があります。

また、グーグルから割り込みと例外について何かを検索します。通常、ブレーク命令の例外は、次の条件でトリガーできます。1。ハードコード割り込み要求:__ asm int 3(ASM)、System.Diagnostics.Debugger.Break(C#)、 DebugBreak()(WinAPI)。 2. OSは、ヒープの破損やメモリのオーバーランの後にApplication Verifierがトリガーできるように、メモリランタイムチェックを有効にします。 3.コンパイラは、初期化されていないメモリブロックと関数の終わり(再調整後の空白領域)に何を入力する必要があるかを有効にするための構成を持つことができます。たとえば、Microsoft VCコンパイラは、/ GZを有効にすると0xCCを埋めることができます。0xCCは、実際には__asm int 3のオペコードです。したがって、エラーによってアプリケーションがそのようなブロックにぶつかると、ブレークポイントがトリガーされます。 。

正しい?

もしそうなら、根本的な原因を見つけるにはApplicationVerifierが最良の選択だと思います。

15
Winston

今後の参考のために、デバッガーが正しいシンボルを使用していません 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)

バグ修正を頑張ってください!

13
kiewic

クラッシュダンプの原因となった例外を見つけるために使用するコマンドは.ecxrです。 ExceptionAddressがゼロであるため、.exr -1から取得した出力は正しくありません。

2
John