Загрузка символов
Обработчик символов загружает символы при вызове функции SymInitialize с параметром fInvadeProcess, установленным значение TRUE или при вызове функции SymLoadModuleEx, чтобы указать модуль. В любом случае обработчик символов загружает символы или откладывает загрузку символов до тех пор, пока не будут запрошены символы, в зависимости от параметров, заданных функцией SymSetOptions .
Обработчик символов можно использовать для получения символьных сведений для любого модуля; Он не должен быть связан с процессом, указанным в вызове SymInitialize . Чтобы использовать произвольный модуль, укажите полный путь к изображению модуля в параметре ImageName . Путь к любому исполняемому модулю с сведениями об отладке (.exe, .dll, DRV, .sys, SCR, .cpl или .com). Используйте параметр BaseOfDll, чтобы указать любой адрес загрузки, а затем адреса символов будут основываться на этом адресе.
Возможно, не требуется хранить модуль символов, загруженный в течение длительности приложения. Чтобы освободить модуль символов из списка модулей обработчика символов, используйте функцию SymUnloadModule64 . Эта функция освобождает память, выделенную для модуля символов. Чтобы использовать символы для этого модуля снова, необходимо вызвать функцию SymLoadModuleEx , даже если задан параметр отложенной загрузки символа.
Диагностика проблем с загрузкой символов
Чтобы просмотреть все попытки загрузки символов, вызовите SymSetOptions с SYMOPT_DEBUG. Это приводит к тому, что DbgHelp вызовет функцию OutputDebugString с подробными сведениями о поиске символов, таких как каталоги, которые он выполняет поиск и сообщения об ошибках. Если код использует SymRegisterCallback64, DbgHelp вызовет функцию обратного вызова вместо вызова OutputDebugString. Параметр ActionCode имеет значение CBA_DEBUG_INFO, а параметр CallbackData — это строка, которую можно отобразить.
Чтобы включить отображение выходных данных отладки в консоли без изменения исходного кода, задайте для переменной среды DBGHELP_DBGOUT значение, отличное от NULL, перед вызовом функции SymInitialize. Чтобы записать сведения в файл, задайте для переменной среды DBGHELP_LOG имя используемого файла журнала.
Обратите внимание, что эти функции следует использовать только при необходимости. Они могут замедлить загрузку символов модулей, содержащих много символов.