Подтвердить что ты не робот

Разрешение символа 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 что я хотел отлаживать.

4b9b3361

Ответ 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.