Пути к символам
Библиотека DbgHelp использует путь поиска символов для поиска символов отладки (PDB и DBG-файлов). Путь поиска может быть составлен из одного или нескольких элементов пути, разделенных точкой с запятой.
Указание путей поиска
Чтобы указать, где обработчик символов будет искать каталоги дисков для файлов символов, вызовите функцию SymSetSearchPath . Кроме того, можно указать путь поиска символов в параметре UserSearchPath функции SymInitialize.
Параметр UserSearchPath в SymInitialize и параметр SearchPath в SymSetSearchPath принимают указатель на строку, завершающую значение NULL, которая задает путь или ряд путей, разделенных точкой с запятой. Обработчик символов использует эти пути для поиска файлов символов. Если этот параметр имеет значение NULL, обработчик символов выполняет поиск в каталоге, содержащем модуль, для которого выполняется поиск символов. В противном случае, если этот параметр указан как значение, отличное от NULL , обработчик символов сначала выполняет поиск путей, заданных приложением перед поиском в каталоге модулей. Если задать переменную среды _NT_SYМБOL_PATH или _NT_ALT_SYМБOL_PATH, обработчик символов ищет файлы символов в следующем порядке:
- Переменная среды _NT_SYМБOL_PATH.
- Переменная среды _NT_ALT_SYМБOL_PATH.
- Каталог, содержащий соответствующий модуль.
Чтобы получить пути поиска, вызовите функцию 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
пути, который является элементом пути к серверу символов.
В шестой строке показано, что файл копируется в кэш.
Последние две строки, которые файл открывается из кэша.