Разрешение символа WinDbg
При использовании WinDbg, где должны быть размещены файлы личных символов (pdb?)?
Моя ситуация: у меня есть DLL, которую я хочу отлаживать. У меня есть исходный код и файлы символов для этой DLL. Эта DLL вызывается другой DLL (в которой у меня нет символов или источников), которые, в свою очередь, вызывается EXE (у которого у меня также нет символов или источников).
Моя проблема в том, что я получаю предупреждение о том, что
*** ПРЕДУПРЕЖДЕНИЕ: невозможно проверить контрольную сумму для C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
Это предупреждение, по моему мнению, является причиной того, что я получаю следующие сообщения в стеке вызовов:
MyDLL! AClass:: + SomeHexAddress прекращение функции
Моя файловая структура выглядит примерно так:
Экземпляр: C:\TheProgram\program.exe
Вызывающая dll: C\TheProgram\SomeSubfolder\caller.
Моя DLL, которую я хочу отлаживать: C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
Примечание. Я установил путь к файлу Symbol и путь к исходному файлу, где была создана отладочная DLL, в моей рабочей области на другом диске из exe. Но я скопировал файлы pdb + map и поместил их в dll что я хотел отлаживать.
Ответы
Ответ 1
Извините за поздний ответ.
В своем сообщении вы упоминаете, что вы видите следующее сообщение об ошибке.
*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
Вы также задаете вопрос: "Где я помещаю свои символы для своей DLL в путь символа?"
Вот ответ на первую проблему:
Шаги для идентификации несогласованных символов.
-
- ! sym noisy
- .reload
- x MyDll! * class *
* Это перезагружает вашу DLL, в качестве альтернативы вы можете ввести kb для отображения стека вызовов DLL, который также должен загрузить его.
- ! sym quiet
* Reset вернуться к первоначальной тихой загрузке символов
Также вы можете запустить
0:001> lmv m myDll *(and examine the Checksum)
Примечание. Если у вас есть контрольная сумма, то Windbg может сопоставлять контрольную сумму DLL с контрольной суммой PDB. Каждая среда разработки имеет другой способ генерации контрольной суммы.
Вот ответ на вопрос о том, где поставить PDB
Если вы добавили MyDll.pdb в хранилище символов, вы можете использовать следующий синтаксис
.sympath SRV*c:\symcache*http://msdl.microsoft.com/download/symbols
Как предложил Роджер выше...
Однако, если вы просто используете PDB локально, вы можете сначала перенести путь в PDB, прежде чем отправляться на сервер символов, например,
.sympath C:\TheProgram\SomeSubfolder\AnotherSubfolder\;SRV*c:\symcache*http://msdl.microsoft.com/download/symbols
Таким образом, Windbg должен выглядеть локально в вашей директории SomSubFolder, прежде чем пытаться использовать кэш Symbols Server.
Спасибо,
Аарон
Ответ 2
Не имеет значения, где вы помещаете личные файлы символов, пока вы можете сказать отладчику, где они находятся.
Предупреждение, которое вы видите , не влияет на трассировку стека, но факт, что вам не хватает символов для caller.DLL и app.EXE , делает,
Конфигурирование символов в windbg (локально) так же просто, как использование:
.sympath [+] path_to_pdbs
* и
.symfix + path_to_system_pdb_store
Вы видите:
MyDLL! AClass:: + SomeHexAddress прекращение функции
фактически ничего не значит, поскольку SomeHexAddress является разумным (и при условии, что MyDll.pdb был найден и загружен!) - он выглядит как запись в стеке надлежащего вызова.
Теперь, мой вопрос будет, в чем проблема, с которой вы застряли?
P.S. вам не нужен файл .map с windbg.
Ответ 3
В рамках нашего процесса сборки мы копируем частные файлы PDB и выпущенные файлы EXE/DLL на сервер символов. В простейшем случае это всего лишь путь UNC, но вы можете настроить его для доступа с помощью HTTP.
Чтобы скопировать выходные файлы, используйте программу SYMSTORE.EXE.
Затем настройте ваш отладчик (мы используем Visual Studio и WinDbg), чтобы посмотреть на этот путь. Для WinDbg самый простой способ сделать это - установить переменную среды:
_NT_SYMBOL_PATH=
SRV*C:\WebSymbols*http://msdl.microsoft.com/download/symbols;
\\symsvr\Symbols
(все должно быть на одной строке)
Это настраивает WinDbg для просмотра на сервере Microsoft Symbol Server (кэширование файлов в C:\WebSymbols), а также для поиска в локальном хранилище символов (\\symsvr\Symbols
).
Мы также используем инструменты исходного сервера для хранения сведений о SVN в файле PDB, что означает, что мы можем вернуться к точному исходному файлу, используемому для создания конкретной версии. Посмотрите ...\Debugging Tools for Windows (x86)\srcsrv
.
Ответ 4
Один из вариантов - оставить файлы символов там, где они есть (например, в выходной папке сборки), а затем использовать опцию командной строки -y WinDbg, чтобы найти эти файлы. Использование этого подхода должно гарантировать, что файлы символов всегда будут обновлены.
В справке Microsoft:
-y SymbolPath
Specifies the symbol search path. Separate multiple paths with a
semicolon (;). If the path contains spaces, it should be enclosed
in quotation marks. For details, and for other ways to change this
path, see Symbol Path.