Поделиться через


Пути к символам

Библиотека DbgHelp использует путь поиска символов для поиска символов отладки (PDB и DBG-файлов). Путь поиска может быть составлен из одного или нескольких элементов пути, разделенных точкой с запятой.

Указание путей поиска

Чтобы указать, где обработчик символов будет искать каталоги дисков для файлов символов, вызовите функцию SymSetSearchPath . Кроме того, можно указать путь поиска символов в параметре UserSearchPath функции SymInitialize.

Параметр UserSearchPath в SymInitialize и параметр SearchPath в SymSetSearchPath принимают указатель на строку, завершающую значение NULL, которая задает путь или ряд путей, разделенных точкой с запятой. Обработчик символов использует эти пути для поиска файлов символов. Если этот параметр имеет значение NULL, обработчик символов выполняет поиск в каталоге, содержащем модуль, для которого выполняется поиск символов. В противном случае, если этот параметр указан как значение, отличное от NULL , обработчик символов сначала выполняет поиск путей, заданных приложением перед поиском в каталоге модулей. Если задать переменную среды _NT_SYМБOL_PATH или _NT_ALT_SYМБOL_PATH, обработчик символов ищет файлы символов в следующем порядке:

  1. Переменная среды _NT_SYМБOL_PATH.
  2. Переменная среды _NT_ALT_SYМБOL_PATH.
  3. Каталог, содержащий соответствующий модуль.

Чтобы получить пути поиска, вызовите функцию SymGetSearchPath .

Путь поиска для файлов базы данных программы (PDB) отличается от пути к файлам отладки (DBG). Алгоритм определяется функциональными возможностями библиотеки символов. По умолчанию Microsoft Visual C/C++ создает символы формата Майкрософт, удаляет их из образа и помещает их в отдельный PDB-файл. Как правило, PDB-файл будет находиться в каталоге, содержащем исполняемый образ. Visual C/C++ внедряет абсолютный путь к PDB-файлу в исполняемом образе. Если обработчик символов не может найти PDB-файл в этом расположении или если PDB-файл был перемещен в другой каталог, обработчик символов будет находить PDB-файл с помощью пути поиска, описанного для DBG-файлов.

Типы элементов Path

Существует три типа элементов пути.

Элемент Standard Path

Элемент стандартного пути выполняется поиск по корневому каталогу, указанному элементом path. Обработчик символов также выглядит в подкаталоге "символов", который соответствует расширению файла модуля, который ищет символы. Обычно это "dll", "exe" или "sys". Наконец, он выглядит в подкаталоге с именем "символы" с каталогом того же имени, что и расширение. Например, если элемент пути к символам имеет значение "c:\mySymbols", а файл, который выполняется поиск символов, — "boo.dll", то будут искать следующие каталоги.

  • c:\mySymbols
  • c:\mySymbols\dll
  • c:\mySymbols\symbols\dll

Обработчик символов использует эту логику для поиска любого элемента пути, который не соответствует критериям для сервера символов или кэша (описано ниже).

Элемент пути к серверу символов

Элемент пути к серверу символов использует специальную технологию, которая может найти символ, соответствующий заданному модулю. Дополнительные сведения см. в статье об использовании SymSrv .

Обработчик символов обрабатывает элемент path как сервер символов, если начинается с текста "srv*".

Примечание.

Если текст "srv*" не указан, но фактический элемент пути является хранилищем сервера символов, обработчик символов будет действовать так, как если бы были указаны "srv*". Обработчик символов делает это определение путем поиска существования файла с именем "pingme.txt" в корневом каталоге указанного пути.

 

Элемент пути кэша

Элемент пути кэша — это вариант элемента пути к серверу символов.

Этот каталог выполняется поиск, как и любой другой сервер символов. Однако если символ не найден здесь, и он найден в элементе пути дальше по цепочке пути символа, то символ будет скопирован и сохранен на сервере символов, указанном в этом элементе.

Обработчик символов обрабатывает элемент path как элемент кэша, если начинается с текста "cache*". Чтобы указать кэш в "c:\myCache", используйте элемент пути символа "cache*c:\myCache".

Пример пути поиска

Чтобы узнать, как это работает, задайте этот путь поиска.

cache*c:\myCache;srv*\\symbols\symbols

Ниже приведен список подробных выходных данных обработчика символов при поиске ntdll.pdb, используя приведенный выше путь поиска.

DBGHELP: .\ntdll.pdb - file not found
DBGHELP: .\dll\ntdll.pdb - file not found
DBGHELP: .\symbols\dll\ntdll.pdb - file not found
SYMSRV: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb not found
SYMSRV: ntdll.pdb from \\symbols\symbols: 10497024 bytes - copied
DBGHELP: c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb already cached
DBGHELP: ntdll - private symbols & lines
c:\myCache\ntdll.pdb\0F7FCF88442F4B0E9FB51DC4A754D9DE2\ntdll.pdb

Первые три строки выходных данных показывают обработчик символов, обрабатывающий первый элемент .пути. Это стандартный элемент пути.

В четвертой строке показан обработчик символов с помощью сервера символов для поиска файла во втором элементе пути, cache*c:\myCache который является элементом пути кэша.

В пятой строке показано, что файл найден в третьем элементе srv*\\symbols\symbolsпути, который является элементом пути к серверу символов.

В шестой строке показано, что файл копируется в кэш.

Последние две строки, которые файл открывается из кэша.