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


Общедоступные, глобальные и локальные символы

Возможности обработки символов API DbgHelp развивались на протяжении многих лет. Чтобы убедиться, что код работает в различных сценариях и предоставляет полные сведения о символах, используйте новейшие функции всякий раз, когда это возможно. Например, SymEnumSymbols заменяет SymEnumerateSymbols64, SymFromName заменяет SymGetSymFromName64, а SymFromAddr заменяет SymGetSymFymFromAddr64.

Общедоступные символы

Начальные версии DbgHelp.dll поддерживают проверку только общедоступных символов. Эти символы создаются для любого элемента в коде, который должен быть предоставлен между различными исходными файлами. Они также включают все элементы, экспортированные из модуля.

Символы либо внедрены в изображение, либо хранятся отдельно в DBG или PDB-файле. Единственная информация, хранящуюся, — имя и адрес символа. Имена доступны в виде украшенных имен. Чтобы просмотреть неоцененные имена, вызовите функцию SymSetOptions с SYMOPT_UNDNAME или используйте функцию UnDecorateSymbolName.

Обратите внимание, что API DbgHelp изначально не был разработан для поддержки нескольких экземпляров одного и того же символа в модуле. Это связано с тем, что открытые символы ограничены уникальными именами в модуле. Поэтому SymGetSymFromName64 возвращает только первый символ, соответствующий. Чтобы получить все символы, соответствующие, вызовите SymEnumSymbols.

Глобальные и локальные символы

Более новые версии DbgHelp.dll поддерживают глобальные и локальные символы при использовании PDB-файлов. Эти новые версии включают статические функции, функции, область в исходном файле, параметрах функций и локальных переменных. При поиске символа DbgHelp проверка глобальные и локальные таблицы символов перед проверка общедоступной таблице символов. Это связано с тем, что для этих типов символов доступно больше информации, чем доступно для общедоступных символов.

Глобальные и локальные символы хранятся с неоценимыми именами. Поэтому флаг SYMOPT_UNDNAME не действует. Чтобы получить украшенные имена символов, необходимо использовать флаг SYMOPT_PUBLICS_ONLY. Это приводит к поиску только общедоступных символов DbgHelp.

Чтобы просмотреть локальные символы или параметры функции, вызовите функцию SymSetContext с элементом InstructionOffset структуры IMAGEHLP_STACK_FRAME, заданной для адреса любого символа функции. Последующие вызовы SymFromName и SymEnumSymbols могут работать в контексте этого адреса. Для этого задайте для параметра BaseOfDll значение NULL и опустите описатель модуля из параметра Name или Mask. Это заставляет DbgHelp искать соответствующие символы в область, указанных SymSetContext.

Чтобы определить, является ли символ параметром, проверка член флагов структуры SY МБOL_INFO. Если символ является параметром, элемент содержит SYMFLAG_PARAMETER. Если это локальный символ, элемент содержит SYMFLAG_LOCAL.