3

最初に、私は完全な WinDbg の初心者であると言わせてください。そのため、これは簡単な質問かもしれません...

例外をスローしているため、デバッグしようとしているアプリケーション (「MyApp」 - 罪のない人を保護するために名前が変更されました!) があります。これはユーザー マシンでのみ発生します。開発マシンでは再現できませんでした。そこで、ユーザーのマシンに DebugDiag をセットアップし、フル ダンプをキャプチャしました。次に、WinDbgにダンプをロードし、何が起こっているのかを把握しようanalyze -vkpしました...しかし、これらのどちらも、探している情報-関数(そしてできれば行番号)を提供していないようです問題を引き起こしている行の...シンボルファイルパスで「MyApp.pdb」へのパスを指定して、シンボルファイルをロードしたと思います:

srv*c:\symcache*http://msdl.microsoft.com/download/symbols;srv*c:\symcache*C:\dev\Customer\MyAppSln\MyApp\Debug

まず、 からの出力は次のkpとおりです。

0:004>kp
ChildEBP RetAddr  
警告: スタック アンワインド情報は利用できません。次のフレームは間違っている可能性があります。
0502f474 7c347966 MyApp!DllMain+0x3e8a6
0502f4bc 7c3a2448 msvcr71!_nh_malloc(unsigned int size = <メモリアクセスエラー>, int nhFlag = <メモリアクセスエラー>)+0x24 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 117]
0502f57c 7c3416b3 msvcp71!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::_Tidy(bool _Built = <メモリ アクセス エラー>, unsigned int _Newsize = <メモリ アクセス エラー>) +0x45 [f:\vs70builds\3077\vc\crtbld\crt\src\xstring @ 1520]
0502f610 7c3a32de msvcr71!_heap_alloc(unsigned int size = <メモリアクセスエラー>)+0xe0 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 212]
0502f620 7c3b3f63 msvcp71!wmemcpy(wchar_t * _S1 = 0x04e463b9 "ڸ???", wchar_t * _S2 = 0xffffffff "--- アドレス 0xffffffff でメモリ読み取りエラー ---", unsigned int _N = 0x4e25212)+0x14 [f:\ vs70builds\3077\vc\crtbld\crt\src\wchar.h @ 843]
0502f640 04e463b9 msvcp71!std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >::assign(class std::basic_string<wchar_t,std::char_traits<wchar_t>,std:: allocator<wchar_t> > * _Right = 0xffffffff、unsigned int _Roff = 0x4e25212、unsigned int _Count = 2)+0x7c [f:\vs70builds\3077\vc\crtbld\crt\src\xstring @ 601]
0502f770 04df1077 MyApp!DllMain+0x65329
0502f824 04e01b35 MyApp!DllMain+0xffe7
0502ff08 04dfe034 MyApp!DllMain+0x20aa5
0502ff48 04dfde4f MyApp!DllMain+0x1cfa4
0502ff88 7648d0e9 MyApp!DllMain+0x1cdbf
0502ffc4 773499f9 kernel32!BaseThreadInitThunk+0xe
0502ffd4 7738198e ntdll!RtlQueryInformationAcl+0x8b
0502ffec 00000000 ntdll!_RtlUserThreadStart+0x1b

私が具体的にデコードしようとしている行は「MyApp!DllMain+0x65329」です。これは実行中と思われる最後の行であり、例外がスローされているように見える malloc 呼び出し内でエラーが発生しているためです。 . ソースファイルと行番号の代わりにモジュールとオフセットのみを表示するのは何が間違っていますか?

また、malloc 呼び出しの上の行が再び MyApp に戻っている理由もわかりません。誰かがそれを説明できるかもしれません。

念のため、「analyze -v」の出力は次のとおりです。

0:004> !分析 -v
****************************************************** ****************************
* *
* 例外分析 *
* *
****************************************************** ****************************

*** 警告: MyApp.exe のチェックサムを確認できません
*** エラー: モジュールのロードは完了しましたが、MyApp.exe のシンボルをロードできませんでした
*** 警告: ThirdPartyDll.dll のチェックサムを確認できません
*** エラー: シンボル ファイルが見つかりませんでした。ThirdPartyDll.dll のシンボルをエクスポートするようにデフォルト設定 -
*** 警告: mdnsNSP.dll のチェックサムを確認できません
*** エラー: シンボル ファイルが見つかりませんでした。mdnsNSP.dll のシンボルをエクスポートするデフォルト -
*** エラー: シンボル ファイルが見つかりませんでした。SLC.dll のシンボルをエクスポートするデフォルト -

FAULTING_IP:
MyApp!DllMain+3e8a6
04e1f936 8b16 mov edx、dword ptr [esi]

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 04e1f936 (MyApp!DllMain+0x0003e8a6)
   ExceptionCode: c0000005 (アクセス違反)
  例外フラグ: 00000000
数値パラメーター: 2
   パラメータ[0]: 00000000
   パラメータ[1]: 00000000
アドレス 00000000 から読み取ろうとしています

PROCESS_NAME: MyApp.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" の命令が "0x%08lx" のメモリを参照しました。メモリを "%s" にすることはできません。

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - "0x%08lx" の命令が "0x%08lx" のメモリを参照しました。メモリを "%s" にすることはできません。

EXCEPTION_PARAMETER1: 00000000

EXCEPTION_PARAMETER2: 00000000

READ_ADDRESS: 00000000

FOLLOWUP_IP:
msvcr71!_heap_alloc+e0 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 212]
7c3416b3 e88e0c0000 呼び出し msvcr71!__SEH_epilog (7c342346)

NTGLOBALFLAG: 0

APPLICATION_VERIFIER_FLAGS: 0

LAST_CONTROL_TRANSFER: 00000000 から 773bbb33 まで

FAULTING_THREAD: ffffffff

BUGCHECK_STR: APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_NULL_POINTER_READ_SHUTDOWN

PRIMARY_PROBLEM_CLASS: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN

DEFAULT_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN

STACK_TEXT:  
773bbb33 ntdll!RtlpAllocateHeap+0x7ad
773a6e0c ntdll!RtlAllocateHeap+0x1e3
7c3416b3 msvcr71!_heap_alloc+0xe0


FAULTING_SOURCE_CODE:  
「f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c」のソースが見つかりません


SYMBOL_STACK_INDEX: 2

SYMBOL_NAME: msvcr71!_heap_alloc+e0

FOLLOWUP_NAME: MachineOwner

MODULE_NAME: msvcr71

IMAGE_NAME: msvcr71.dll

DEBUG_FLR_IMAGE_TIMESTAMP: 3e561eac

STACK_COMMAND: dds 7740c078 ; キロバイト

FAILURE_BUCKET_ID: ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_SHUTDOWN_c0000005_msvcr71.dll!_heap_alloc

BUCKET_ID: APPLICATION_FAULT_ACTIONABLE_HEAP_CORRUPTION_heap_failure_freelists_corruption_NULL_POINTER_READ_SHUTDOWN_msvcr71!_heap_alloc+e0
4

2 に答える 2

8

PDB がシンボル パスにあると思われる場合は、次のように実行する必要があります。

!sym noisy
.reload MyApp.dll
kp

!sym ノイジーにより、デバッガーは、シンボルを読み込めなかった理由 (MyApp.pdb が見つからない、見つかったが一致しないなど) に関するより詳細な情報を提供します。これは、シンボルを読み込めない理由を見つけるのに役立ちます。!sym noise は、冗長なシンボル出力をオフにします。

于 2009-08-18T18:58:24.230 に答える
6

シンボルのパスを設定したときに、再読み込みしましたか?

.reload

あなたの追加がわからない

srv*c:\symcache*C:\dev\Customer\MyAppSln\MyApp\Debug

シンボル パスに追加すると、目的の効果が得られます。通常、最初に .sympath 内のすべてのローカル パスを一覧表示し、最後の手順として .symfix+ を実行して、Microsoft シンボル サーバーを使用してパブリック シンボルを構成します。

.sympath C:\dev\Customer\MyAppSln\MyApp\Debug
.symfix+ c:\symcache

ローカル パスを最初にリストする理由は、単にローカルで取得するのではなく、デバッガーがリモート サーバーで pdbs (とにかく存在しない) をチェックする必要がないからです。

とにかく、あなたの問題は、MyApp のシンボルがロードされていないため、スタック ウォーキングがうまく機能しないことです。Debugger はスタックを先頭から逆方向にたどります。そのため、MyApp が表示されます。これがアクセス違反が発生した場所です。現在、デバッガーはこの時点でシンボルを持っていないため、どの呼び出しチェーンが一番上の関数につながったかを推測することしかできません。そして、誤解を招く経路をたどることで、間違った推測をします。

于 2009-07-31T21:41:15.107 に答える