Символы и файлы символов
Файлы диспетчера аудиосжатия (Майкрософт)
Исполняемые файлы (. com)
Программы панели управления
Файлы библиотеки динамической компоновки (.dll)
Файлы драйверов (. drv)
Исполняемые файлы (.exe)
Файлы заставки экрана
Файлы драйверов (.sys)
Файлы символов содержат разнообразные данные, которые фактически не требуются при запуске двоичных файлов, но могут быть очень полезны в процессе отладки.
Как правило, файлы символов могут содержать:
Имена функций и адреса их точек входа
Записи подавление указателя фрейма (FPO)
Номера строк исходного кода
Каждый из этих элементов называется, по отдельности, символом. Например, один файл символов MyProgram. PDB может содержать несколько сотен символов, включая глобальные переменные и имена функций и сотни локальных переменных. Часто производители программного обеспечения выпускают две версии каждого файла символов: полный файл символов, содержащий общедоступные символы и закрытые символы, и сокращенный файл, содержащий только открытые символы. Дополнительные сведения см. в разделе открытые и закрытые символы.
При отладке необходимо убедиться, что отладчик может получить доступ к файлам символов, связанным с целевым объектом, для которого выполняется отладка. Для отладки в режиме реального времени и отладки файлов аварийного дампа требуются символы. Необходимо получить правильные символы для кода, который вы хотите отладить, и загрузить эти символы в отладчик.
Windows символы
Windows сохраняет свои символы в файлах с расширением pdb.
Компилятор и компоновщик управляют форматом символов. Компоновщик Visual C++ помещает все символы в PDB-файлы.
Windowsная операционная система была построена в двух версиях. Бесплатная сборка (или Окончательная сборка) имеет относительно небольшие двоичные файлы, а проверенная сборка (или отладочная сборка) содержит большие двоичные файлы с дополнительными символами отладки в самом коде. проверенные сборки были доступны в более ранних версиях Windows до Windows 10 версии 1803. Каждая из этих сборок имела свои собственные файлы символов. при отладке целевого объекта на Windows необходимо использовать файлы символов, которые соответствуют сборке Windows на целевом объекте.
в следующей таблице перечислены некоторые каталоги, существующие в стандартном Windows дереве символов.
символы для Windows отладки (WinDbg, KD, CDB, NTSD)
Файлы символов содержат разнообразные данные, которые фактически не требуются при запуске двоичных файлов, но могут быть очень полезны в процессе отладки.
Символы могут включать имя, тип (если применимо), адрес или регистр, где он хранится, а также любые родительские или дочерние символы. Примеры символов включают имена переменных (локальные и глобальные), функции и любую точку входа в модуль.
Отладчик получает сведения о символах из файлов символов, расположенных в локальной файловой системе или загруженных с удаленного сервера символов. При использовании сервера символов отладчик автоматически использует правильную версию файла символов для сопоставления модуля в целевом объекте.
символы для отладчиков Windows (WinDbg, KD, CDB и NTSD) доступны на общедоступном сервере символов через интернет.
Если вы выполняете отладку в пользовательском режиме, вам понадобятся символы для целевого приложения. если вы выполняете отладку в режиме ядра, вам потребуются символы для отлаживаемого драйвера, а также Windows открытые символы.
В этих разделах объясняется, как получить доступ к символам во время сеанса отладки, как управлять параметрами символов отладчика и совпадающими символами.
В этих разделах объясняется, что такое символы, а также описывается поддержка WinDbg для переносимых символов PDB.
Дополнительные сведения о работе с символами см. на этих страницах.
если вы просто хотите настроить отладчик для доступа к символам для собственных программ, а также для Windows, возможно, вам будет удобнее прочитать менее детализированные вводные разделы путь к символам и общедоступный сервер символов майкрософт. Используйте команду «USE ! SYM шумный «, чтобы отобразить дополнительные сведения о загрузке символов для устранения неполадок с символами.
Русские Блоги
Начало работы с Windbg Debugging Tool для Windows
предисловие
Во-первых, скачать
Windbg, предоставленный официальным веб-сайтом Microsoft, является версией Windows 10, которую нельзя использовать под Win 7. Чтобы использовать Windbg под Win7, вам нужно скачать его через Windows SDK.//www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en
Если вас не интересует другое содержимое Windows SDK, вы можете просто проверить Windbg.
После завершения установки вы можете найти Windbg в строке меню Windows Пуск.
Установка может быть неудачной. Если она не удалась, вы можете перейти в Панель управления \ Программы \ Программы и компоненты » Microsoft Visual C++ 2010 Redistributable Удалите, установка прошла успешно.
Перед использованием необходимо выполнить следующие задачи
Для режима отладки ядра, пожалуйста, обратитесь к:
Кроме того, вам необходимо сделать следующее:
Таблица символов в Windows отладки
Это так называемые символы. Например, простой файл символов Myprogram.pdb может содержать сотни таблиц символов. Вообще говоря, компании-разработчики выпускают две версии файла символов: одна представляет собой полный файл символов, содержащий все публичные символы и частные символы, а другая представляет собой упрощенную версию файла, которая содержит только публичные символы.
При отладке вы должны знать, что отладчик может получить файлы символов, которые соответствуют цели отладки. Для файлов оперативной отладки и аварийного дампа при сбое требуются символы.
Суффикс Windows pdb сохраняет символы, а vs сохраняет все символы в файлах pdb.
Настройка символов является сложной задачей, особенно для отладки в режиме ядра. Часто требуется, чтобы вы знали все названия и выпуски ваших компьютерных продуктов. Отладчик должен иметь возможность найти файл символов каждого продукта.
Официальный сайт Microsoft более эвфемичен и не прост в управлении. Вот простой метод настройки.
Это предложение сообщает WinDbg, что мой файл символов хранится в папке c: \ mysymbol. На самом деле в нем ничего нет, даже эта папка не существует, но это не имеет значения. Если система не может найти ее, она создаст ее и загрузит по указанному выше URL-адресу. Перейти, чтобы помочь вам загрузить файл символов в нем.
После перезагрузки компьютера, если вы найдете дополнительный файл mysymbol на диске C и откроете exe-файл с помощью windbg, вы увидите Symbol search path is: SRV*c:\mysymbol* http://msdl.microsoft.com/download/symbolsПодсказка указывает, что конфигурация прошла успешно.
Примечание: После выполнения этого шага, если вы снова запустите VS, VS прочитает переменную среды _NT_SYMBOL_PATH и загрузит и прочитает из нее символ, что приведет к очень медленному запуску и отладке VS. Рекомендуется изменить _NT_SYMBOL_PATH на другое имя, когда Windbg не используется.
Начало работы с отладкой в пользовательском режиме
Отладка вашей собственной программы
Предположим, вы написали следующую программу
(1) Используйте Visual studio 2015 для создания Helloworld.exe в x64 и режиме отладки, а также Helloworld.pdb.
(2) Скопируйте Helloworld.pdb в локальную папку символов (обратитесь к:Таблица символов конфигурации)。
(3) Откройте Helloworld.exe и Helloworld.cpp с помощью windbg.
Затем вы можете ввести команды отладки, например:
Средства установки точки останова в главном модуле HelloWorld
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
00000001`3f2a16d3 f7bd28010000 idiv eax,dword ptr [rbp+128h] ss:00000000`0014f648=00000000
Это означает, что произошла ошибка деления на 0.
Будет сгруппирован анализ ошибок.
Обязательным условием для этого раздела является настройка символа (ссылка:Таблица символов конфигурации)。
Найти все с WinMain согласование symbols 。
Выше две команды могут войти 0 Хороший прогресс и просмотр трассировки стека
Отладка с использованием символов
В этой статье представлен общий обзор того, как лучше использовать символы в процессе отладки. В нем объясняется, как использовать сервер символов Майкрософт, а также как настроить и использовать собственный частный сервер символов. Эти рекомендации помогут повысить эффективность и способность отлаживать проблемы даже в тех случаях, когда все символы и исполняемые файлы, связанные с проблемой, не находятся на компьютере.
Символы
Для отладки доступен ряд различных типов символов. К ним относятся Информация CodeView символы, COFF, DBG, SYM, PDB и даже экспорт символов, созданных из таблицы экспорта двоичных файлов. В этом техническом документе обсуждаются только VS.NET и символы формата PDB, так как они являются самыми последними Предпочтительными форматами. Они создаются по умолчанию для проектов, компилируемых с помощью Visual Studio.
Создание PDB-файлов для исполняемых объектов выпуска не влияет на оптимизацию или значительно изменяет размер создаваемых файлов. Как правило, единственным отличием является путь, а имя файла PDB-файла внедряется в исполняемый файл. По этой причине следует всегда создавать PDB-файлы, даже если вы не хотите поставлять их вместе с исполняемым файлом.
PDB-файлы создаются, если проект строится с помощью параметра компилятора /Zi или /Zi (создание сведений о PDB), а также коммутатора компоновщика /Debug (создание отладочной информации). PDB-файлы, созданные компилятором, объединяются и записываются в один файл PDB, который размещается в том же каталоге, что и исполняемый объект.
По умолчанию PDB-файлы содержат следующие сведения:
По умолчанию очищенные PDB-файлы содержат следующие сведения:
Это минимальные сведения, необходимые для обеспечения надежной отладки. Минимальная информация также затрудняет получение дополнительных сведений о исходном коде. Так как создается и очищенный PDB-файл, и обычный PDB-файл, можно предоставить удаленную версию пользователям, которым могут потребоваться ограниченные возможности отладки, но оставить полные файлы PDB конфиденциальными. Обратите внимание, что /PDBSTRIPPED создает второй, меньший PDB-файл, поэтому при создании сборок для широкого распределения следует использовать правильный PDB-файл. Для типичного проекта обычная PDB-файл может быть размером в несколько мегабайт, но удаленная версия PDB может составлять всего несколько сотен килобайт.
Использование символов для отладки
При отладке приложения, в котором произошел сбой, отладчик пытается отобразить в стеке функции, которые привели к сбою. Без файла PDB отладчик не может разрешить имена функций, их параметры или любые локальные переменные, хранимые в стеке. При отладке 32-разрядных исполняемых файлов существуют ситуации, когда невозможно даже получить надежные трассировки стека без символов. Иногда можно просмотреть необработанные значения в стеке и определить, какие значения могут возвращать адреса, но они могут быть легко путают со ссылками на функции или данными.
Если функции в текущем стеке скомпилированы с использованием оптимизации указателей на фреймы (/Oy), и если символы отсутствуют, отладчик не может надежно определить, какая функция вызвала текущую функцию. Это связано с тем, что без сведений о оптимизации указателя кадров (FPO), содержащихся в PDB, отладчик не может полагаться на регистр указателя кадра (EBP), указывающий на сохраненный предыдущий указатель на кадр и на обратный адрес родительской функции. Вместо этого он догадаться. Иногда он получает право. Однако он часто получает неправильный, что может привести к неправильному получению. Если отображается предупреждение об отсутствующих символах или символы не загружены, как показано в следующем примере, не следует доверять стеку с этого момента.
Во многих случаях можно продолжить отладку без символов, так как проблема находится в расположении с точными символами, и вам не нужно просматривать функции в стеке вызовов. Даже если в библиотеке, находящихся в стеке вызовов, нет доступных PDB-файлов, при условии, что они были скомпилированы с помощью указателей на фреймы, отладчик должен иметь возможность правильно угадать в родительских функциях. начиная с версии Windows XP с пакетом обновления 2 (sp2) все Windows DLL и исполняемые файлы компилируются с отключением FPO, так как это делает отладку более точной. Отключение FPO также позволяет профилировщикам выборки проходить по стеку во время выполнения с минимальным влиянием на производительность. в версиях Windows до Windows XP с пакетом обновления 2 (SP2) для всех двоичных файлов операционной системы требуются соответствующие файлы символов, содержащие сведения о завершении, чтобы обеспечить точную отладку и профилирование.
При отладке 64-разрядных машинных исполняемых файлов не требуется использовать файлы символов для создания правильных трассировок стека, так как операционная система и компиляторы x64 не требуют их. Однако по-прежнему требуются файлы символов для получения имен функций, вызова параметров и локальных переменных.
Однако некоторые случаи особенно сложны для отладки без символов. Например, если выполняется отладка программы, для которой был создан PDB-файл, и при сбое обратного вызова из функции в библиотеке DLL, для которой отсутствуют символы, вы не сможете увидеть, какая функция вызывала обратный вызов, так как вы не сможете декодировать стек. Это часто происходит в библиотеках сторонних производителей, если PDB не предоставлены или в старых компонентах операционной системы, если PDB недоступны. Обратные вызовы часто происходят во время передачи сообщения, перечисления, выделения памяти или обработки исключений. Отладка этих функций без точного стека может оказаться неприятной.
Получение необходимых символов
Расположение, указанное в библиотеке DLL или в исполняемом файле.
Если на компьютере была создана библиотека DLL или исполняемый файл, по умолчанию компоновщик поместит полный путь и имя файла соответствующего PDB-файла в библиотеку DLL или исполняемый файл. При отладке отладчик сначала проверяет, существует ли файл символов в расположении, указанном в библиотеке DLL или в исполняемом файле. Это полезно, так как у вас всегда есть символы, доступные для кода, скомпилированного на компьютере.
PDB, которые могут присутствовать в одной папке с библиотекой DLL или исполняемым файлом.
Все папки локального кэша символов.
Любые серверы символов локальной сетевой папки.
Любые серверы символов Интернета, например Microsoft Symbol Server.
Чтобы убедиться в наличии всех PDB, необходимых для точной отладки, установите средства отладки для Windows. Битовые версии 32 и 64 можно найти в средствах отладки для Windows.
Полезным средством, устанавливаемым с этим пакетом, является symchk.exe. Он может помочь определить отсутствующие или неверные символы. Это средство имеет большое количество возможных параметров командной строки. Ниже приведены две из наиболее полезных и часто используемых.
Параметр /s. параметр указывает симчк искать символы только в текущей папке, а не на серверах символов.
Убедитесь, что все библиотеки DLL и исполняемые файлы в наборе папок соответствуют PDB
Как работает симчк
Вы также можете использовать служебную программу DUMPBIN, поставляемую вместе с VS.NET, чтобы показать пути к символам, в которых выполняется поиск, и определить, найдены ли файлы символов, соответствующие заданной библиотеке DLL или исполняемому файлу. Например:
Серверы символов
Сервер символов — это репозиторий для нескольких версий исполняемого файла и файлов символов. Он содержит либо сами файлы символов, либо ссылки на соответствующие файлы символов. Отладчики понимают, как использовать серверы символов и могут использовать их для поиска отсутствующих или неизвестных символов.
DLL и исполняемые файлы также доступны на сервере символов Майкрософт. Это позволяет отлаживать сбои и проверять код для файлов операционной системы, которые могут отсутствовать на компьютере. Если отладчик обнаруживает исполняемый файл или библиотеку DLL, которая не существует в системе, используемой для отладки, она автоматически запрашивает как символы, так и копию двоичного файла на серверах символов Майкрософт. Это полезно при отладке компонента, имеющего много версий, например msvcrt.dll, и необходимо изучить код для версии, которая не существует на компьютере. Это также помогает отлаживать Мини-дампы, созданные в операционной системе, отличной от системы, используемой для отладки.
Корпорация Майкрософт публикует все PDB-файлы для всех операционных систем и других перераспределенных компонентов, таких как пакет SDK DirectX, на внешнем доступном сервере символов. Это упрощает отладку приложения, использующего эти библиотеки DLL или исполняемые файлы. Сервер символов Майкрософт можно использовать для разрешения символов вместе с любыми локальными символами для компонентов, созданных на компьютере.
Можно настроить компьютер для использования сервера символов Майкрософт, который предоставляет доступ ко всем файлам символов Майкрософт. Можно также настроить частный сервер символов для вашей компании, группы или сети, который можно использовать для хранения нескольких более ранних версий проекта, над которым вы работаете, или для предоставления локального кэша для символов, используемых на сервере символов Майкрософт.
Когда отладчик выполняет поиск символов, он сначала выполняет поиск в локальной среде. Затем он выполняет поиск на серверах символов. При обнаружении совпадающего символа он передает файл символов в локальный кэш. Символы для типовой библиотеки DLL или исполняемого файла, размер которых составляет от 1 до 100 МБ. Поэтому при отладке процесса, включающего множество библиотек DLL, может потребоваться некоторое время для разрешения всех символов и их перемещения в локальный кэш.
Использование сервера символов Майкрософт
Доступ к серверу символов можно получить одним из следующих способов.
Введите адрес сервера напрямую. в Visual Studio в меню сервис выберите пункт параметры, затем пункт отладка, а затем выберите пункт символы.
Это используется всеми средствами отладки. он также используется Visual Studio и считывается и декодирован при открытии Visual Studio. Поэтому при его изменении необходимо перезапустить Visual Studio.
Эта переменная среды позволяет указать несколько серверов символов, например внутренний частный сервер символов. Он также позволяет указать каталог локального кэша для хранения PDB-файлов для всех символов, которые вы ищете на серверах символов — как внутри, так и через Интернет.
Для _ _ переменной пути к символам NT используется следующий синтаксис _ :
Замените [ локальный кэш ] именем каталога на компьютере, где будет храниться кэш любых используемых символов, например% systemroot% \ SYMBOLS или c: \ SYMBOLS.
[Частный сервер символов ] является необязательным. Он может указывать на сервер символов, расположенный в сети, или на сервер символов, который совместно используется вашей командой, группой продуктов или компанией.
Чтобы использовать только сервер символов Майкрософт вместе с локальным кэшем символов, чтобы ускорить доступ через Интернет, используйте следующий параметр для _ _ пути к символам NT _ :
другие параметры для _ _ пути к символам NT можно найти _ в файле справки, который устанавливается вместе с пакетом средств отладки Microsoft для Windows.
Исполняемые файлы без символов могут увеличить время, затрачиваемое на запуск отладчика, если используется сервер символов. Это происходит потому, что отладчик запрашивает сервер символов каждый раз при попытке загрузить исполняемый файл. По этой причине лучше всегда запрашивать символы для всех компонентов.
Может оказаться невозможным запрашивать символы для каждого компонента — например, видеодрайверы могут иметь библиотеки DLL в пространстве процесса, а необходимые PDB-файлы доступны на сервере символов Майкрософт. В этом случае при запуске сеанса отладки возникает небольшая задержка.
Чтобы избежать такой небольшой задержки, можно запустить отладчик один раз, чтобы кэшировать все символы локально с сервера символов Майкрософт. Затем измените путь к _ _ символам NT, _ чтобы удалить сервер символов Майкрософт. Если исполняемые файлы не изменяются, для проверки исполняемых файлов, не имеющих символов, запрос через Интернет не потребуется, так как у вас есть локальные кэшированные копии всех символов, необходимых на сервере символов Майкрософт.
Получение символов вручную
Если отладчик настроен правильно, он автоматически загружает все необходимые символы из локального кэша или с сервера символов. Если вы хотите получить символы только для одного исполняемого файла или для папки исполняемых файлов, можно использовать симчк. например, если вы хотите скачать символы для _ файла d3dx930.dll в системной папке Windows в текущем каталоге, можно использовать следующую команду:
Средство симчк имеет много других целей. дополнительные сведения см. в разделе симчк/? или в документации по средствам отладки Microsoft для Windows.
Настройка сервера символов
Настройка сервера символов очень проста. Это полезно по следующим причинам.
Настройка сервера символов в собственной локальной сети — это просто создание общей папки на сервере и предоставление пользователям полных разрешений на доступ к общей папке для создания файлов и папок. эта общая папка должна быть создана в серверной операционной системе, например Windows server 2003, чтобы количество пользователей, которые могут одновременно получить доступ к ней, не ограничено.
Например, если вы настроили общую папку на \ \ mainserver- \ символах, члены вашей команды настроили _ _ путь к символам NT _ следующим образом:
По мере извлечения символов файлы и папки отображаются в \ \ \ общем каталоге mainserver Symbols, а также в отдельных кэшах в каталоге c: \ SYMBOLS.
Обычно это все, что необходимо для настройки и использования собственного сервера символов или сервера символов Майкрософт.
Добавление символов на сервер символов
Чтобы добавить, удалить или изменить файлы в общей папке сервера символов, используйте средство symstore.exe. это средство является частью пакета средств отладки Microsoft для Windows. полная документация по серверам символов, средству symstore и индексированию символов включена в пакет средств отладки для Windows пакета.
Вам может потребоваться добавить символы непосредственно на собственный сервер символов в рамках процесса сборки или сделать символы доступными для всей команды для библиотек или средств сторонних разработчиков. Процесс добавления символа в файловый ресурс сервера символов называется индексированием символов. Существует два распространенных способа индексирования символов. Файл символов можно скопировать на сервер символов. Или указатель на расположение символа можно скопировать на сервер символов. Если у вас есть архивная папка, содержащая старые сборки, может потребоваться индексировать указатели на PDB-файлы, которые уже находятся в общей папке, вместо дублирования символов. Так как символы иногда могут быть десятками мегабайт, рекомендуется заранее спланировать объем пространства, которое может потребоваться для архивации всех сборок проекта в ходе разработки. При индексировании только указателей на символы могут возникнуть проблемы при удалении старых сборок или изменении имени общей папки.
Например, для рекурсивного индексирования всех символов в c: \ дкссим \ Дополнительные \ символы, полученные из пакета SDK DirectX за Октябрь 2006, на файловый ресурс сервера символов, именуемый \ \ \ символами mainserver, можно использовать следующую команду:
Параметр /t «Comment» используется для добавления описания транзакции, которая добавила символы. Это может быть полезно при выполнении административных задач с символами.
Отладочные символы
В дополнение ко всему прочему, изрядные проблемы при освоении логики продолжает создавать оптимизация кода, которую выполняют компилятор и компоновщик, окончательно запутывая и раздувая код. Единственное, что могли делать в свое время реверсивные инженеры, это создавать в дизассемблированном листинге собственные комментарии, пытаясь этот самый листинг документировать, тем самым хоть как-то «оживив» исходный код. Вероятно, на каком-то из этапов решено было упростить столь нелегкий процесс отладки программного обеспечения и некоторые вендоры операционных систем начали предоставлять специальные файлы, называемые отладочными символами, для системных файлов своих операционных систем и различных продуктов. Не стала исключением и корпорация Microsoft, поэтому данное нововведение заметно упростило процесс отладки закрытого кода Windows.
Символы абсолютно не применимы в ходе штатного выполнения программы, но крайне полезны в процессе её отладки. Люди, которые не по наслышке знакомы с программированием, могут подтвердить, что компилятор, конвертируя исходный код программы в машинный код, выбрасывает имена функций. Другими словами, в получившемся исполняемом модуле Вы не увидите никаких имен. Единственный вариант получить связь между адресами и именами, это сгенерировать файл отладочных символов. Однако отладочные символы, в большинстве случаев, по умолчанию не генерируются, а могут быть созданы лишь при указании дополнительных опций компиляции.
Если пояснить данное понятие простым языком, то отладочные символы требуются (что очевидно по названию), для удобства отладки кода, а именно с целью понять что есть что в структуре изучаемого приложения. В общем случае, в файле отладочных символов хранятся:
При наличии этой информации отладчик по адресу памяти легко находит соответствующую функцию по ближайшему предыдущему адресу. Да и исследователю эта информация позволяет видеть «символические» данные об исследуемом двоичном файле, что в свою очередь в значительной мере упрощает исследование алгоритма приложения в процессе статического дизассемблирования либо интерактивной отладки. Исследователю кода гораздо удобнее просматривать значения переменных, а не безликих ячеек памяти. Отладочные символы часто используются в процессе поиска ошибок в исходном коде, отладке программы и разного рода отказах. По методу размещения отладочная информация может:
Это имеет под собой достаточно простую подоплеку, ведь отладочные символы жестко привязаны к конкретному исходному коду, и если в исходном коде что-либо меняется (строка, процедура, переменная), то старое соответствие перестает быть актуальным и требуется сгенерировать новый файл символов, который в точности соответствует уже новому, измененному исходному коду. С точки зрения разработчика стоит учесть и тот факт, что потенциально любое изменение проекта вызывает полную несовместимость между файлов символов и компонентом, поэтому файлы символов и бинарные файлы нужно строить одновременно. С точки зрения исследователя необходимо помнить, что файлы отладочных символов меняются при каждой новой сборке (build), поэтому процесс обновления системы требует также и обновления файлов отладочных символов, относящихся к системным модулям. Вот почему достаточно удобно использовать автоматизированный процесс запроса символов, дабы не отвлекаться на ручную синхронизацию.
Нужны ли символы
Отладчик WinDbg корпорации Microsoft можно сконфигурировать на автоматический запрос отладочной информации, если в ней есть необходимость. Вот как раз основной вопрос, на который я хотел сам себе ответить, нужны ли эти самые отладочные символы или нет? Я провел простейший эксперимент, который состоял в том, что я нашел завалявшийся у меня на тестовой станции дамп падения в синий экран (BSOD) и подключил его сначала в WinDbg с доступными символами, а затем в том же WinDbg без символов, и вот результат:
Честно говоря, результат меня удивил. На момент ошибки мы имеем довольно скудную информацию о сбое, такую как адрес возникновения ошибки и стек вызовов момента падения. Отладчик пытается выполнить автоматический разбор стека, и что же получается, мало того, что отладчик при отсутствии отладочных символов не может сопоставить имена и параметры функций, так он еще и не может правильно выполнить трассировку стека вызовов момента падения. Выходит, что без символов становится практически невозможно (в некоторых случаях) проследить последовательность вызовов функций, и в дополнение осложняется понимание того, какой именно модуль вызвал ошибку. Именно так! Всё только что сказанное актуально для ситуации с 32-битным кодом, поскольку:
Я думаю, тут можно особо ничего не комментировать, поскольку практически все могли заметить, что листинг справа намного более «читабелен», без дополнительных проверок кода можно визуально без труда определить, какие именно функции используются в том или ином месте исходного кода. В итоге, становится очевидным, что:
Распространение
Понятное дело, что если возникло желание символы официально предоставлять, то их необходимо каким-то образом распространять, для того, что бы конечные потребители программного продукта имели возможность (при остром на то желании конечно же) этот самый продукт отлаживать, то есть в случае возникновения ошибок иметь возможность быстро находить вероятную причину возникновения. Каким же образом отладочные символы предоставляют своей целевой аудитории? До некоторых пор разработчики, перед которыми стояла задача предоставления отладочных символов своим клиентам, передавали подобную информацию для своих продуктов на оптических носителях, дисках CD/DVD. Исключением не стала и операционная система Windows, которая может поставляться с отладочными символами, традиционно размещаемыми на дополнительном диске дистрибутива, либо в составе Driver Development Kit ( DDK ). Однако, с определенного времени популярным стал метод распространения символов через сеть Интернет. В сети для этой цели Microsoft размещает собственные сервера символов, которые и предоставляют отладочные символы, однако, чтобы работать с сервером символов, необходимо использовать специализированный протокол обмена.
Публичные и приватные (частные) символы
Публичные символы, так же, не включают информацию для помощи по отображению параметров большинства функций, информацию по локальным переменным, типам локальных переменных. Тем не менее, они содержат достаточно информации для ключевых отладочных сценариев, что зачастую является достаточным. Таким образом, можно сделать утешительный вывод:
Символьные файлы, распространяемые корпорацией Microsoft (посредством серверов символов), включают в себя исключительно публичные функции, глобальные переменные и их типы данных, то есть являются публичными. В противоположность этому, некоторые разработчики программного обеспечения (Mozilla) распространяют полную отладочную информацию (публичные символы и приватные символы). Приватные (полные, закрытые) символы (private symbols) содержат значительно больше информации, включающей в себя путь и номера строк исходного кода, имена и типы параметров функций и переменных, и если сравнивать приватные и публичные символы с точки зрения процесса отладки, то последние делают его слегка сложнее, тем не менее достаточны для большинства сценариев отладки.
Сервер символов Microsoft
Многие компоненты, разрабатываемые корпорацией Microsoft, такие как файлы, входящие в состав операционных систем, офисных приложений и прочих продуктов, компилируются вместе с символами, которые затем распространяются через сервер символов Microsoft (Microsoft Symbol Server). Сервер символов представляет собой онлайновый репозиторий публичных символов для продуктов Microsoft, который доступен для запроса посредством протокола HTTP по визуально-неотображаемому пути (URL):
Формат PDB
Со времени того, как отладочные символы стали массово востребованы сообществом специалистов, многие разработчики программного обеспечения озаботились созданием разнообразных методов хранения информации об исходных файлах в модулях символов. В связи с чем, в природе появились всевозможные форматы записи символов. Нас же, в контексте данной статьи, интересуют форматы хранения символов для продуктов Microsoft.
В общем случае, символы могут быть предоставлены в следующих форматах:
Однако мы будем рассматривать в данной статье лишь формат PDB, который является самым современным, соответственно и предпочтительным форматом для различных средств разработки от Microsoft.
Все данные, которые PDB файл может содержать:
PDB файл служит для:




