WinDbg не показывает полезную информацию - PullRequest
2 голосов
/ 31 июля 2009

Во-первых, позвольте мне сказать, что я полный нуб WinDbg, так что это может быть простой вопрос ...

У меня есть приложение («MyApp» - имя изменено для защиты невинных!), Которое я пытаюсь отладить, поскольку оно вызывает исключение. Это происходит только на пользовательских машинах - я не смог воспроизвести его на своей машине для разработки. Поэтому я установил DebugDiag на компьютере пользователя и записал полный дамп. Затем я загрузил дамп в WinDbg и выполнил analyze -v и kp, чтобы попытаться выяснить, что происходит ... но ни один из них, кажется, не дает мне информацию, которую я ищу - функция ( и, надеюсь, номер строки) строки, которая вызывает проблему ... Я думаю, что я загрузил файл символов, указав путь к «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  
WARNING: Stack unwind information not available. Following frames may be wrong.
0502f474 7c347966 MyApp!DllMain+0x3e8a6
0502f4bc 7c3a2448 msvcr71!_nh_malloc(unsigned int size = <Memory access error>, int nhFlag = <Memory access error>)+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 = <Memory access error>, unsigned int _Newsize = <Memory access error>)+0x45 [f:\vs70builds\3077\vc\crtbld\crt\src\xstring @ 1520]
0502f610 7c3a32de msvcr71!_heap_alloc(unsigned int size = <Memory access error>)+0xe0 [f:\vs70builds\3052\vc\crtbld\crt\src\malloc.c @ 212]
0502f620 7c3b3f63 msvcp71!wmemcpy(wchar_t * _S1 = 0x04e463b9 "Ҹ???", wchar_t * _S2 = 0xffffffff "--- memory read error at address 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 - может быть, кто-то тоже может это объяснить.

На всякий случай, вот результат 'анализа -v':

0:004> !analyze -v
*******************************************************************************
*                                                                             *
*                        Exception Analysis                                   *
*                                                                             *
*******************************************************************************

*** WARNING: Unable to verify checksum for MyApp.exe
*** ERROR: Module load completed but symbols could not be loaded for MyApp.exe
*** WARNING: Unable to verify checksum for ThirdPartyDll.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for ThirdPartyDll.dll - 
*** WARNING: Unable to verify checksum for mdnsNSP.dll
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for mdnsNSP.dll - 
*** ERROR: Symbol file could not be found.  Defaulted to export symbols for 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 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 00000000
   Parameter[1]: 00000000
Attempt to read from address 00000000

PROCESS_NAME:  MyApp.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory could not be "%s".

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - The instruction at "0x%08lx" referenced memory at "0x%08lx". The memory could not be "%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      call    msvcr71!__SEH_epilog (7c342346)

NTGLOBALFLAG:  0

APPLICATION_VERIFIER_FLAGS:  0

LAST_CONTROL_TRANSFER:  from 00000000 to 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:  
No source found for '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 ; kb

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

Ответы [ 2 ]

7 голосов
/ 18 августа 2009

Если вы считаете, что PDB должен находиться на пути вашего символа, вы должны выполнить что-то вроде этого:

!sym noisy
.reload MyApp.dll
kp

! Sym noisy заставляет отладчик выдавать более подробную информацию о том, почему он не может загрузить символы - MyApp.pdb не найден, не найден, но не совпадает и т. Д. Это поможет вам выяснить, почему он не загружает символы , ! sym noisy снова отключает вывод подробных символов.

5 голосов
/ 01 августа 2009

Когда вы указали путь для символов, вы перезагрузили их?

.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 не загружены, поэтому обход стека не совсем работает. Отладчик перемещает стек назад, начиная сверху, поэтому вы видите MyApp - здесь произошло нарушение доступа. Теперь, так как отладчик не имеет символов на данный момент, он может только догадываться, какая цепочка вызовов привела к функции сверху. И он угадывает, следуя ложному пути.

...