Где при использовании WinDbg должны быть размещены частные файлы символов (pdb?)?
Моя ситуация: у меня есть DLL, которую я хочу отладить. У меня есть исходный код и файлы символов для этой библиотеки DLL. Эта DLL вызывается другой DLL (для которой у меня нет символов или источника), которая, в свою очередь, вызывается EXE (для которой у меня также нет символов или источника).
Моя проблема в том, что я получаю предупреждение, в котором говорится
*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
Я думаю, это предупреждение является причиной того, что я получаю в стеке вызовов сообщения следующего типа:
MyDll!AClass::AFunction+SomeHexAddress
Моя файловая структура выглядит примерно так:
EXE: C: \ TheProgram \ program.exe
Вызывающая dll: C \ TheProgram \ SomeSubfolder \ caller. ???
Моя DLL, которую я хочу отладить: C: \ TheProgram \ SomeSubfolder \ AnotherSubfolder \ MyDll.dll
Примечание: я установил путь к символьному файлу и путь к исходному файлу там, где была сгенерирована отладочная DLL, в моей рабочей области на другом диске, отличном от exe. Но я скопировал файлы pdb + map и поместил их в нужную dll. отлаживать ..

Один из вариантов - оставить файлы символов на месте (то есть в выходной папке сборки), а затем использовать параметр командной строки -у 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.
Так как мне это использовать? введите в командной строке «WinDbg.exe -y BuildOutputFolderHere»?
У меня работает: windbg.exe -y "SRVc: \ websymbolsmsdl.microsoft.com/download/symbols"
Оставьте точку с запятой в конце. Не знаю, почему StackOverflow продолжает это добавлять.
Неважно, куда вы помещаете частные файлы символов, если вы можете сообщить отладчику, где они находятся.
Предупреждение, которое вы видите не, имеет какое-либо влияние на трассировку стека, но тот факт, что вам не хватает символов для caller.DLL и app.EXE делает.
Настроить символы в windbg (локально) так же просто, как использовать:
.sympath[+] path_to_pdbs
*and
.symfix+ path_to_system_pdb_store
Вы видите:
MyDll!AClass::AFunction+SomeHexAddressactually means nothing as long as SomeHexAddress is reasonable (and provided that MyDll.pdb has been found and loaded!) - it looks like a proper call stack entry.
Теперь мой вопрос: в чем проблема, с которой вы застряли?
P.S. вам не нужен файл .map с windbg.
В процессе сборки мы копируем частные файлы 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.
Извините за поздний ответ. В своем сообщении вы упоминаете, что видите следующее сообщение об ошибке.
*** WARNING: Unable to verify checksum for C:\TheProgram\SomeSubfolder\AnotherSubfolder\MyDll.dll
Вы также задаете вопрос: «Где мне поместить символы для моей библиотеки DLL в путь к символам?»
Вот ответ на первую проблему:
Шаги по выявлению несовпадающих символов.
Также вы можете запустить
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, прежде чем пытаться использовать кеш сервера символов.
Спасибо, Аарон
Однако , это неэффективно для моего windbg, я не знаю почему
Как оказалось, моя целевая машина, подготовленная внутри Visual Studio, не получила последнюю сборку при развертывании на ней, поэтому возникла ошибка «driver.sys имеет несоответствующие символы».
По сути, развертывание не заменило драйвер его модифицированной версией для меня. Используйте инструмент devcon, чтобы правильно установить его, и Windbg снова будет счастлив.
связанный вопрос: stackoverflow.com/questions/2743323