Получите правильные нативные символы .net для Windbg

Я занимаюсь отладкой аварийного дампа, где я ищу дамп, взятый с рабочего сервера. На машине, на которой я запускаю WinDbg, должна быть установлена ​​немного другая версия среды выполнения .NET - я получаю ошибки при загрузке собственных образов сборок .NET (поэтому не могу загрузить, например, System.Data.Linq).

Как лучше всего гарантировать, что моя отладочная машина имеет доступ ко всем нужным символам?

Edit Добавлен вывод lmv для Thomas Weller

000007fb`68660000 000007fb`68993000   System_Data_Linq_ni C (pdb symbols)          C:\Program Files\Debugging Tools for Windows (x64)\sym\System.Data.Linq.pdb\703A918D116A4558BB44245924371ACD1\System.Data.Linq.pdb
    Loaded symbol image file: System.Data.Linq.ni.dll
    Image path: C:\Windows\assembly\NativeImages_v4.0.30319_64\System.Data.Linq\acbd568cd3c2499fbb7b2639c4a46a81\System.Data.Linq.ni.dll
    Image name: System.Data.Linq.ni.dll
    Has CLR image header, track-debug-data flag not set
    Timestamp:        Fri Apr 11 20:41:26 2014 (534899C6)
    CheckSum:         00000000
    ImageSize:        00333000
    File version:     4.0.30319.34209
    Product version:  4.0.30319.34209
    File flags:       0 (Mask 3F)
    File OS:          4 Unknown Win32
    File type:        2.0 Dll
    File date:        00000000.00000000
    Translations:     0000.04b0 0000.04e4 0409.04b0 0409.04e4

person JMarsch    schedule 04.09.2015    source источник
comment
Я предполагаю, что вы задаете этот вопрос, потому что использование официального сервера символов (на msdl.microsoft.com/download/symbols) не работает, правильно?   -  person John Koerner    schedule 04.09.2015
comment
Достаю с официального сайта символа - без радости   -  person JMarsch    schedule 05.09.2015
comment
Какая версия System.Data.Linq затронута? Можете ли вы опубликовать результат lmv для этого модуля?   -  person Thomas Weller    schedule 05.09.2015
comment
Я добавил это выше. Пара странных проблем: 1. lmv m System.Data.Linq ничего не вернул, мне пришлось выполнить lmv (без параметров) и выполнить поиск 2. Вот сообщение об ошибке, которое я получаю во время .reload: Невозможно загрузить изображение C : \ Windows \ assembly \ NativeImages_v4.0.30319_64 \ System.Data.Linq \ acbd568cd3c2499fbb7b2639c4a46a81 \ System.Data.Linq.ni.dll, ошибка Win32 0n2 *** ВНИМАНИЕ: невозможно проверить контрольную сумму для System.Data.Linq.ni. dll   -  person JMarsch    schedule 05.09.2015
comment
lm заменяет специальные символы, такие как . на _. Вы можете использовать подстановочные знаки, такие как *Linq*, чтобы уменьшить вывод. В остальном кажется, что у вас есть символы, но нет DLL ... Какую команду вы хотите выполнить, для которой вам нужны символы Linq?   -  person Thomas Weller    schedule 05.09.2015
comment
На самом деле я просто пытался получить хороший стек. У нас переполнение стека, и мы проделываем довольно экзотическую работу с LINQ. Переполнение происходит из-за некоторых вещей, которые мы заставляем делать linq (поэтому переполнение происходит исключительно в linq). Я хочу посмотреть на некоторые значения в кадрах стека.   -  person JMarsch    schedule 09.09.2015


Ответы (3)


ni в названии показывает, что это собственная версия (оптимизированная для ngen), которая отличается от машины к машине. Вы должны создать PDB на машине, где у вас есть dmp, с помощью ngen:

ngen createpdb C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Data.Linq\
f989891b3a507d4aaec44ab1df12e9d5\System.Data.Linq.ni.dll c:\symbols /debug

Теперь добавьте PDB из символов C: \ в путь к символам Windbgs.

person magicandre1981    schedule 05.09.2015
comment
Вроде у него уже есть PDB. Кроме того, добавляет ли впоследствии создание PDB больше информации, чем доступно в самой DLL? - person Thomas Weller; 05.09.2015
comment
Я также хотел бы знать, распространено ли это. Если это требуется часто, я бы добавил такую ​​функцию в свой сборщик инструментов mscordacwks. - person Thomas Weller; 05.09.2015
comment
@ThomasWeller для трассировок ETW нам также понадобится NI PDB (WPRUI.exe генерирует их в то время, когда он записывает файл ETL на диск), чтобы показать стек. Так что, возможно, Windbg тоже нужна эта PDB. ngen /? показывает, что мы должны добавить / отладить в командную строку, чтобы сгенерировать PDB, который следует использовать для отладки. - person magicandre1981; 05.09.2015
comment
@ThomasWeller, когда я смотрю на стеки загрузки с помощью ETW / xperf / WPA, я вижу, что сначала загружается обычная DLL, а затем - версия NI. Похоже, вам также нужны обе PDB. - person magicandre1981; 07.09.2015

Вы можете заставить WINDBG загрузить официальные символы с серверов Microsoft, выполнив следующую команду:

.sympath srv*c:\symbols*http://msdl.microsoft.com/download/symbols
.reload /f

Это сохранит символы, загруженные с сервера, в локальном кэше по адресу C:\Symbols, а затем принудительно перезагрузит символы для всех загруженных в данный момент модулей.

person John Koerner    schedule 04.09.2015
comment
.symfix c:\symbols - это краткая форма - person Thomas Weller; 04.09.2015

При использовании .NET необходимо учитывать следующие моменты:

  1. Убедитесь, что у вас есть хороший дамп для .NET, т.е. 64-битный дамп 64-битного процесса или 32-битный дамп 32-битного процесса. Если lm m wow64 показывает модуль, это не "хороший" дамп.
  2. Настройте символы, по крайней мере, .symfix c:\symbols и .reload
  3. Получите файлы отладки .NET (SOS.dll и mscordacwks.dll) с исходного ПК и переименуйте их соответствующим образом. См. Подробности в другом ответе.

    Мой бесплатный инструмент Mscordacwks Collector сделает это за вас, включая переименование.

    Если этот компьютер больше недоступен, вы можете поискать эти файлы в моем mscordacwks и архиве SOS

    Заявление об ограничении ответственности: я являюсь их автором, если это недостаточно ясно.

person Thomas Weller    schedule 04.09.2015
comment
последние ссылки не работают - person Yomi1984; 13.04.2021