WinDbg x64: не удается отладить аварийный дамп - не удалось загрузить DLL доступа к данным

Я подключил WinDbg к работающему процессу и у него произошел сбой (у меня есть отдельный вопрос по этому поводу). После сбоя программы WinDbg остановился и позволил мне отладить программу. Я взял аварийный дамп для дальнейшего исследования с помощью команды.dump /ma.

Программа была скомпилирована как "Любой процессор", и я использовал WinDbg x64, чтобы взять дамп. Теперь я снова открываю WinDbg x64 на том же компьютере и открываю дамп сбоя. Вот что это говорит:

Loading Dump File [C:\crashdump.dmp]
User Mini Dump File with Full Memory: Only application data is available

Symbol search path is: SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Mon Aug 15 10:24:57.000 2011 (UTC + 1:00)
System Uptime: 17 days 0:54:39.021
Process Uptime: 12 days 14:01:31.000
................................................................
...............................................................
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1be0.b78): Access violation - code c0000005 (first/second chance not available)
*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
clr!WKS::gc_heap::find_first_object+0x92:
000007fe`ea129a1d f70100000080    test    dword ptr [rcx],80000000h ds:00000000`00003d80=????????

Затем я пытаюсь загрузить SOS с помощью ".load sos clr", и это ошибки в:

The call to LoadLibrary(sos clr) failed, Win32 error 0n2
    "The system cannot find the file specified."
Please check your debugger configuration and/or network access.

Попытка с ".loadby SOS CLR", и это работает. Теперь я хочу увидеть стек с "! Clrstack" и вставить сюда:

Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is 
                in the version directory
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.

Я пробовал ".symfix" и ".reload":

0:027> .symfix
0:027> .reload
..................*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
..............................................
...............................................................

Штука. В то же время, когда процесс выполняется под WinDgb, я могу приостановить выполнение, загрузить SOS и успешно выполнить команду "! Clrstack".

Есть идеи? Спасибо.

ОБНОВЛЕНИЕ - Выполнены шаги, указанные во втором ответе, по-прежнему не работает.

1) Мой путь к символам: SRV * c: \ symbols * http: //msdl.microsoft.com/download/symbols; srv *

2) загружен CLR: 4.0.30319.237:

0:027> lm v clr
Unknown option 'r'
start             end                 module name
00000000`77b60000 00000000`77d09000   ntdll      (pdb symbols)          c:\symbols\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12\ntdll.pdb
    Loaded symbol image file: ntdll.dll
    Image path: C:\Windows\System32\ntdll.dll
    Image name: ntdll.dll
    Timestamp:        Sat Nov 20 13:11:21 2010 (4CE7C8F9)
    CheckSum:         001B55EA
    ImageSize:        001A9000
    File version:     6.1.7601.17514
    Product version:  6.1.7601.17514
    File flags:       0 (Mask 3F)
    File OS:          40004 NT Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® Windows® Operating System
    InternalName:     ntdll.dll
    OriginalFilename: ntdll.dll
    ProductVersion:   6.1.7601.17514
    FileVersion:      6.1.7601.17514 (win7sp1_rtm.101119-1850)
    FileDescription:  NT Layer DLL
    LegalCopyright:   © Microsoft Corporation. All rights reserved.
000007fe`e9fb0000 000007fe`ea915000   clr      # (pdb symbols)          c:\symbols\clr.pdb\1A7EA01DA29549DAB2B0BD012A6C5BA12\clr.pdb
    Loaded symbol image file: clr.dll
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
    Image name: clr.dll
    Timestamp:        Tue May 17 09:35:10 2011 (4DD2333E)
    CheckSum:         00967144
    ImageSize:        00965000
    File version:     4.0.30319.237
    Product version:  4.0.30319.237
    File flags:       8 (Mask 3F) Private
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0409.04b0
    CompanyName:      Microsoft Corporation
    ProductName:      Microsoft® .NET Framework
    InternalName:     clr.dll
    OriginalFilename: clr.dll
    ProductVersion:   4.0.30319.235
    FileVersion:      4.0.30319.235 (RTMGDR.030319-2300)
    PrivateBuild:     DDBLD240
    FileDescription:  Microsoft .NET Runtime Common Language Runtime - WorkStation
    LegalCopyright:   © Microsoft Corporation.  All rights reserved.
    Comments:         Flavor=Retail

3) "C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ mscordacwks.dll" имеет версию 4.0.30319.239

4) Я обнаружил, что когда я загружаю дамп в WinDbg, он загружает правильный "mscordacwks.dll" из Интернета, таким образом, в папке "C:\symbols\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000" У меня есть файл " mscordacwks_AMD64_AMD64_4.0.30319.237.dll".

5)

0:027> .cordll -ve -u -l
CLR DLL status: No load attempts

6)

0:027> !sym noisy
noisy mode - symbol prompts on
0:027> .restart

Loading Dump File [C:\crashdump.dmp]
User Mini Dump File with Full Memory: Only application data is available

DBGHELP: Symbol Search Path: srv*;srv*c:\symbols*http://msdl.microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.microsoft.com/download/symbols;srv*c:\symbols*http://msdl.microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.microsoft.com/download/symbols;srv*c:\symbols*http://msdl.microsoft.com/download/symbols
Symbol search path is: srv*;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols
Executable search path is: 
Windows 7 Version 7601 (Service Pack 1) MP (8 procs) Free x64
Product: WinNt, suite: SingleUserTS
Machine Name:
Debug session time: Mon Aug 15 10:24:57.000 2011 (UTC + 1:00)
System Uptime: 17 days 0:54:39.021
Process Uptime: 12 days 14:01:31.000
................................................................
...............................................................
DBGHELP: ntdll - public symbols  
         C:\Program Files\Debugging Tools for Windows (x64)\sym\ntdll.pdb\6192BFDB9F04442995FFCB0BE95172E12\ntdll.pdb
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.microsoft.com/download/symbols;srv*c:\symbols*http://msdl.microsoft.com/download/symbols
DBGHELP: Symbol Search Path: cache*;SRV*http://msdl.microsoft.com/download/symbols;srv*c:\symbols*http://msdl.microsoft.com/download/symbols
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
(1be0.b78): Access violation - code c0000005 (first/second chance not available)
*** WARNING: symbols timestamp is wrong 0x4dd2333e 0x4da4281c for clr.dll
DBGHELP: clr - public symbols  
         C:\Program Files\Debugging Tools for Windows (x64)\sym\clr.pdb\1A7EA01DA29549DAB2B0BD012A6C5BA12\clr.pdb
clr!WKS::gc_heap::find_first_object+0x92:
000007fe`ea129a1d f70100000080    test    dword ptr [rcx],80000000h ds:00000000`00003d80=????????

7)

0:027> !clrstack
SYMSRV:  C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll not found
SYMSRV:  mscordacwks_AMD64_AMD64_4.0.30319.237.dll from http://msdl.microsoft.com/download/symbols: 502892 bytes - copied         
DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD2333E965000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll cached to C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD233F317b000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll
DBGHELP: C:\Program Files\Debugging Tools for Windows (x64)\sym\mscordacwks_AMD64_AMD64_4.0.30319.237.dll\4DD233F317b000\mscordacwks_AMD64_AMD64_4.0.30319.237.dll - OK
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of clr.dll is 
                in the version directory
            3) or, if you are debugging a dump file, verify that the file 
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger's
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to clr.dll as well.

4 ответа

Решение

Я регулярно сталкиваюсь с этим при отладке мини-дампов с сайта. Как это случилось в вашем случае, я не уверен. Обычно это происходит, когда версия CLR, которая была загружена во время создания дампа, недоступна на вашем компьютере отладки. В вашем случае это одна и та же машина, так что, вероятно, все должно работать. Я уверен, что найдутся другие, которые могут точно объяснить, почему это не так.

В то же время, вот что я делаю с дампами моего сайта. Windbg ищет "правильную версию" mscordacwks.dll. Таким образом, мы даем ему эту версию и сообщаем, где ее искать.

Во-первых - если я подделываю все это, удаляя mscordacwks.dll, windbg выключается и загружает его с сервера символов Microsoft, поэтому убедитесь, что ваши символы настроены правильно для загрузки символов с сервера символов Microsoft и еще раз,

Теперь - если предположить, что это не сработало, проверьте, какая именно версия является "правильной версией". Вывести информацию о модуле с помощью "lm v clr" и проверить версию CLR, которая НАСТОЯЩАЯ загружена. Мой 4.0.30319.239. Хорошо - теперь найдите эту версию mscordacwks.dll. Предположим, что его можно найти в обычной установке.NET Framework на вашем компьютере (C:\Windows\Microsoft.NET\Framework64\v4.0.30319). Убедитесь, что версия соответствует точно (щелкните правой кнопкой мыши, свойства и т. Д.)! Возьмите его и положите в безопасное место (я использую D:\Symbols\_Images). Следуйте инструкциям, которые windbg дал вам при переименовании файла. mscordacwks_.dll будет mscordacwks_AMD64_AMD64_4.0.30319.239.dll.

Теперь настройте путь к исполняемому образу (".exepath D:\Symbols\_Images"), чтобы windbg знал, куда вы его положили.

Теперь у вас есть "правильная версия mscordacwks", и вы переименовали ее, чтобы Windbg знал, что она ищет, и сказали, где вы ее поместили.

Если этот STILL не работает, попробуйте ".cordll -ve -u -l", а также "! Sym noisy", чтобы включить подробное ведение журнала как загрузки шнура, так и сервера символов, затем попробуйте!CLRStack снова. Возможно, результат этих двух команд точно скажет вам, что он пытается загрузить, и вы сможете понять, почему он этого не сделает...

Я просто потратил день на отладку множества случаев, когда мы сталкивались с этим сценарием. SOS+CLR в том же окне, что и сбой, не удалось загрузить в WinDbg, и "lm v" сообщил о двух разных версиях для одного и того же модуля:

 0: 011> lm vM * clr.dll
имя начала и конца модуля
000007fe`f2f50000 000007fe`f38b0000   clr      # (символы pdb)          c:\symbols\clr.pdb\EDFF900AC9B94C1D9B32696A7759891A2\clr.pdb
    Загружен файл изображения символа: clr.dll
    Путь к изображению: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
    Название изображения: clr.dll
    Отметка времени: вс 21 апреля 03:36:04 2013 (5173C114)
    Контрольная сумма:         0095F379
    Размер изображения:        00960000
    Версия файла: 4.0.30319.18052
    Версия продукта: 4.0.30319.18052
    Флаги файлов:       8 (Маска 3F) Приват
    Файл ОС: 4 Неизвестный Win32
    Тип файла:        2.0 Dll
    Дата файла: 00000000.00000000
    Переводы:     0409.04b0
    CompanyName: корпорация Майкрософт
    ProductName:      Microsoft® .NET Framework
    InternalName:     clr.dll
    Исходное имя файла: clr.dll
    ProductVersion: 4.0.30319.18047
    FileVersion: 4.0.30319.18047, созданный: FX45RTMGDR
    PrivateBuild:     DDBLD320
    Описание файла: общеязыковая среда выполнения Microsoft.NET - WorkStation
    LegalCopyright:   © Корпорация Microsoft. Все права защищены.
    Комментарии:         Flavor=Retail 

Детали поддержки

Метка времени (0x5173C114), контрольная сумма (0x0095F379) и версия (4.0.30319.18052), хранящиеся в структуре MINIDUMP_MODULE в потоке списка модулей minidump, предназначались для более новой CLR. Взломав файл минидампа сам и глядя прямо на данные потока:

 MINIDUMP_MODULE: (упаковка: 8 размер: 112) 
  + 0x000.BaseOfImage UInt64: 8791579230208 (0x7FEF2F50000)
  + 0x008.SizeOfImage UInt32: 9830400 (0x960000)
  + 0x00C .CheckSum UInt32: 9827193 (0x95F379)
  + 0x010 .TimeDateStamp UInt32: 1366540564 (0x5173C114)
  + 0x014.ModuleNameRva UInt32: 107828 (0x1A534)
  + 0x018.VersionInfo tagVS_FIXEDFILEINFO: (упаковка: 8 размер: 52) 
    + 0x000.dwSignature UInt32: 4277077181 (0xFEEF04BD)
    + 0x004.dwStrucVersion UInt32: 65536 (0x10000)
    + 0x008 .dwFileVersionMS UInt32: 262144 (0x40000)
    + 0x00C .dwFileVersionLS UInt32: 1987004036 (0x766F4684) 

Разделив старшие и младшие слова из dwFileVersionMS, мы получим 4 и 0.
Разделив верхние и нижние слова из dwFileVersionLS, мы получим 30319 и 18052.


Используя dumpchk.exe и просматривая сведения о модуле в PEB, мы можем увидеть другую метку времени (0x515530CE), которая на самом деле соответствует более старой (18047) версии:

 7fef2f50000 515530ce 28 марта 23:12:30 2013 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll 


Глядя на сырую память в аварийном дампе, куда загружается clr.dll, вы можете увидеть контрольную сумму (0x00965F80) и метку времени (0x515530CE) версии 4.0.30319.18047:

0: 011> дБ 000007fe`f2f50000 
000007fe`f2f50000  4d 5a 90 00 03 00 00 00-04 00 00 00 ff ff 00 00  MZ..............
000007fe`f2f50010  b8 00 00 00 00 00 00 00-40 00 00 00 00 00 00 00  ........@.......
000007fe`f2f50020  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
000007fe`f2f50030  00 00 00 00 00 00 00 00-00 00 00 00 18 01 00 00  ................
000007fe`f2f50040  0e 1f ba 0e 00 b4 09 cd-21 b8 01 4c cd 21 54 68  ........!..L.!Th
000007fe`f2f50050  69 73 20 70 72 6f 67 72-61 6d 20 63 61 6e 6e 6f является программой canno
000007fe`f2f50060  74 20 62 65 20 72 75 6e-20 69 6e 20 44 4f 53 20  t для запуска в DOS 
000007fe`f2f50070  6d 6f 64 65 2e 0d 0d 0a-24 00 00 00 00 00 00 00  mode....$.......
0:011> db
000007fe`f2f50080  39 e4 28 ed 7d 85 46 be-7d 85 46 be 7d 85 46 be  9.(.}.F.}.F.}.F.
000007fe`f2f50090  81 f2 f8 будет 79 85 46 be-81 f2 fa будет 74 85 46 be  ....yF.... tF 000007fe`f2f500a0  74 fd c5 будет 73 85 46 be-74 fd c2 be c9 85 46 be  t...sFt....F.
000007fe`f2f500b0  ee 41 8d be 7f 85 46 be-e3 25 81 be 7c 85 46 be  .A....F..%..|.F.
000007fe`f2f500c0  ee 41 88 be 6b 85 46 beee 41 89 be 78 85 46 be  .A..kF.A..xF 000007fe`f2f500d0  ee 41 8b be 64 85 46 be-7d 85 47 be ca 87 46 be  .A..dF}.G...F.
000007fe`f2f500e0  81 f2 ff быть 76 85 46 beeee 41 9e be 70 87 46 be  ....vF.A..pF 000007fe`f2f500f0  ee 41 8c быть 7c 85 46 beeee 8 8f быть 7c 85 46 be.A.. |.F..A.. |.F. 0: 011> 000007fe`f2f50100 ee 41 8a be 7c 85 46 be-52 69 63 68 7d 85 46 be.A.. |.F.Rich}.F. 000007fe`f2f50110 00 00 00 00 00 00 00 00-50 45 00 00 64 86 06 00........ PE..d... 000007fe`f2f50120 ce 30 55 51 00 00 00 00-00 00 00 00 f0 00 22 20.0UQ.......... "000007fe`f2f50130 0b 02 0b 00 00 90 69 00-00 c2 2b 00 00 00 00 00...... i... +..... 000007fe`f2f50140 40 51 13 00 00 10 00 00-00 00 f5 f2 fe 07 00 00 @Q.............. 000007fe`f2f50150 00 10 00 00 00 02 00 00-06 00 00 00 0a 00 00 00................ 000007fe`f2f50160 06 00 00 00 00 00 00 00-00 e0 95 00 00 04 00 00................ 000007fe`f2f50170 80 5f 96 00 02 00 60 01-00 00 10 00 00 00 00 00._.... `......... 

Я также прыгнул вперед в памяти, посмотрел на ресурс Version в памяти и увидел строку версии 18047 года.


Так что теперь у нас есть мини-дамп с противоречивой информацией о том, какая версия clr.dll действительно использовалась.

Что вызвало это

Я также узнал, что наш ИТ-отдел недавно выпустил несколько обновлений Windows, поэтому:

  • Во время работы приложения было установлено обновление для CLR.
  • Файл в C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ был обновлен до более новой версии (4.0.30319.18052)
  • Приложение разбилось
  • MiniDumpWriteDump очевидно использовал информацию о файле на диске при сохранении списка модулей в файле аварийного дампа (4.0.30319.18052)
  • WinDbg не смог сопоставить версию, помеченную в аварийном дампе, с тем, что было в памяти процесса, поскольку в нем была противоречивая информация.

Чтобы убедиться в этом, я вручную изменил запись MINIDUMP_MODULE для clr.dll, чтобы изменить контрольную сумму, метку времени и версию с 18052 на 18047. После перезагрузки взломанного файла.dmp в WinDbg и установки exepath на соответствующие библиотеки sos+clr, Мне удалось успешно выполнить команды SOS и получить действительный след стека.

Нижняя линия

По сути, мы получили файл мини-дампов, который содержит противоречивую информацию о том, какая версия clr.dll загружена в процесс, не позволяя SOS определить правильный механизм clr. Вероятно, это ошибка в MiniDumpWriteDump, поскольку она сохраняет файл аварийного дампа. Но должно происходить только тогда, когда базовая версия CLR была обновлена ​​во время работы вашего приложения.

Является ли процесс, который вы пытаетесь отладить, 32-разрядным? Что говорит список процессов менеджера задач? Если это 32-битный процесс, то вам нужно использовать 32-битный windbg. В противном случае я не понимаю, почему .load sos clr должен потерпеть неудачу.

PS: (windbg noob alert), поэтому я прошу прощения, если это звучит неубедительно. Просто пытаюсь помочь.

Похоже, вы сделали пользовательскую установку windbg и не выбрали все необходимые вам расширения. Ошибка Win32 n2 обычно является признаком этой проблемы.

Другие вопросы по тегам