Страницы

Поиск по вопросам

понедельник, 30 марта 2020 г.

Виды отладочной информации в PE файлах

#отладка #pe


Существует несколько форматов отладочной информации. Меня интересует 4 наиболее известных:
CodeView, PDB, FPO, MISC. В сети ответов не нашёл и решил задать вопрос тут.

Верно ли, что PDB - это тот же CodeView только вынесенный в отдельный файл?
Что кроме отладочных символов может содержать файл PDB?

Что такое Frame Pointer Omission?

Поскольку любая отладочная информация в PE описывается структурой IMAGE_DEBUG_DIRECTORY,
что должно находиться в соответствующей директории отладки, если вся информация вынесена
в отдельный файл (в случае использования MISC это вроде DBG, PDB - файл PDB)? Наверное
есть какая то ссылка на этот файл?..

MISC - это какой то конкретный формат отладочных данных или просто обозначает то,
что отладочная информация вынесена в отдельный файл DBG?
    


Ответы

Ответ 1



Типы отладочной информации перечислены документации формата PE, а также в заголовочном файле winnt.h: #define IMAGE_DEBUG_TYPE_UNKNOWN 0 #define IMAGE_DEBUG_TYPE_COFF 1 #define IMAGE_DEBUG_TYPE_CODEVIEW 2 #define IMAGE_DEBUG_TYPE_FPO 3 #define IMAGE_DEBUG_TYPE_MISC 4 #define IMAGE_DEBUG_TYPE_EXCEPTION 5 #define IMAGE_DEBUG_TYPE_FIXUP 6 #define IMAGE_DEBUG_TYPE_OMAP_TO_SRC 7 #define IMAGE_DEBUG_TYPE_OMAP_FROM_SRC 8 #define IMAGE_DEBUG_TYPE_BORLAND 9 #define IMAGE_DEBUG_TYPE_RESERVED10 10 #define IMAGE_DEBUG_TYPE_CLSID 11 #define IMAGE_DEBUG_TYPE_VC_FEATURE 12 #define IMAGE_DEBUG_TYPE_POGO 13 #define IMAGE_DEBUG_TYPE_ILTCG 14 #define IMAGE_DEBUG_TYPE_MPX 15 #define IMAGE_DEBUG_TYPE_REPRO 16 Из всего этого зоопарка наибольшее значение имеют следующие: IMAGE_DEBUG_TYPE_COFF Наиболее старый формат, предполагает встраивание отладочной информации в исполняемый файл. Поддерживает только ограниченный набор отладочной информации (соответствие строк исходников адресам в бинарнике и FPO, если оно применяется для файла). Такой тип информации использовали версии Visual C++ примерно до 2005, современные версии его не используют. IMAGE_DEBUG_TYPE_CODEVIEW Более новый формат, он допускает как встраивание информации в EXE-файл, так и вынесение в отдельный файл (.PDB). Однако в современных версиях Visual C++ отладочная информация всегда вынесена в .PDB, и Debug Directory данного формата содержит только ссылку на внешний PDB-файл. (Отдельного типа записи "PDB" в Debug Directory не существует.) IMAGE_DEBUG_TYPE_FPO Если программа компилируется без оптимизации FPO, ее стек представляет из себя связный список, в котором каждый элемент содержит указатель на следующий, так что отладчик может легко его обходить без дополнительной информации. Если же включена оптимизация FPO, указателя на следующий элемент не будет, поэтому для успешного анализа стека нужен размер данных на стеке у конкретной функции. Эта информация и включается в Debug Directory типа FPO. IMAGE_DEBUG_TYPE_MISC Ссылка на внешний файл .DBG, содержащий отладочную информацию формата COFF и/или CodeView. Файл .DBG аналогичен по структуре PE файлам, его обычно получали с помощью утилиты rebase, входящей в состав старых версий Visual Studio. Сейчас редко используется. IMAGE_DEBUG_TYPE_VC_FEATURE Некоторая служебная информация компилятора (для Visual C++ начиная с версии 2010 при сборке с параметром /GL). Для иллюстрации возьмем программу, собранную Visual C++ 2012 в отладочной конфигурации, и изучим ее Debug Directory с помощью команды dumpbin /headers: Debug Directories Time Type Size RVA Pointer -------- ------- -------- -------- -------- 5BAC500B cv 3E 000167B0 5BB0 Format: RSDS, {A11BDEB7-1F5D-4BFC-8E80-CE407A215DE8}, 39, C:\PROJECTS\CppTest\Debug\CppTest.pdb 5BAC500B feat 10 000167F0 5BF0 Counts: Pre-VC++ 11.00=7, C/C++=27, /GS=27, /sdl=0, guardN=unreported Первая строка - запись формата IMAGE_DEBUG_TYPE_CODEVIEW. RSDS - это сигнатура формата, дальше идет GUID, номер версии файла (для отслеживания изменений) и путь к файлу. Вторая строка - запись формата IMAGE_DEBUG_TYPE_VC_FEATURE. Из надписи sdl=0, например, можно сделать вывод, что параметр /sdl (дополнительные проверки безопасности) был выключен. Источники PE Format Generating debug information with Visual C++ Параметр компоновки /DEBUG Параметры компиляции /Z7, /Zi, /ZI Walking the Stack Without Symbols and With FPO (Frame Pointer Omission) The .dbg Files

Комментариев нет:

Отправить комментарий