В разделе source файла формата pdb содержится информация
Эти символы могут быть хорошо встроены в двоичный файл, но это может привести к значительному увеличению размера файла (иногда на несколько мегабайт). Чтобы избежать этого дополнительного размера, современные компиляторы и ранние системы отладки мэйнфреймов выводят информацию о символах в отдельный файл, для компиляторов Microsoft этот файл называется файлом PDB.
What Does the PDB File Contain
Ниже приведены некоторые важные данные, хранящиеся в файлах PDB:
- none : Файлы PDB не будут созданы. Файлы PDB не будут созданы.
- pdb-only : Символы отладки будут только в файлах PDB, а не в двоичном формате; символы отладки будут только в файлах PDB, а не в двоичном.
- Full : Наряду с символами в двоичном файле PDB также будут содержаться некоторые символы отладки. Завершено: Наряду с символами в двоичном файле PDB будут также содержаться некоторые символы отладки.
- Имя исходного файла и номер строки, которая отображается в интегрированной среде разработки Visual Studio.
- Расположение точки останова в приложении.
- Укажите и выберите пути поиска для файлов символов.
- Укажите серверы символов для Майкрософт, Windows или сторонних компонентов.
- Указать модули, для которых отладчик будет или не будет автоматически загружать символы.
- Эти параметры можно изменять во время выполнения отладки. См. раздел Загрузка символов при отладке.
- Чтобы открыть окно Модули во время отладки, выберите Отладка >Окна >Модули (или нажмите клавиши CTRL + ALT + U).
- В окне Модули щелкните правой кнопкой мыши заголовки Состояние символов или Файл символов либо любой модуль.
- В контекстном меню выберите один из следующих вариантов:
- Шаг с заходом в код.
- Приостановка выполнения кода из-за точки останова или исключения.
- Переключение на другой поток.
- Изменение кадра стека двойным щелчком по кадру в окне Стек вызовов.
- The source file name and line number to display in the Visual Studio IDE.
- Where in the app to stop for a breakpoint.
- Specify and select search paths for symbol files.
- Specify symbol servers for Microsoft, Windows, or third-party components.
- Specify modules that you do or don't want the debugger to automatically load symbols for.
- Change these settings while you are actively debugging. See Load symbols while debugging.
- To open the Modules window, while debugging, select Debug >Windows >Modules (or press Ctrl + Alt + U).
- In the Modules window, right-click the Symbol Status or Symbol File headers, or any module.
- In the context menu, select one of the following options:
- Step into code.
- Break into code from a breakpoint or exception.
- Switch to a different thread.
- Change the stack frame by double-clicking a frame in the Call Stack window.
- Имя исходного файла и номер строки, которая отображается в интегрированной среде разработки Visual Studio.
- Расположение точки останова в приложении.
- Укажите и выберите пути поиска для файлов символов.
- Укажите серверы символов для Майкрософт, Windows или сторонних компонентов.
- Указать модули, для которых отладчик будет или не будет автоматически загружать символы.
- Эти параметры можно изменять во время выполнения отладки. См. раздел Загрузка символов при отладке.
- Чтобы открыть окно Модули во время отладки, выберите Отладка >Окна >Модули (или нажмите клавиши CTRL + ALT + U).
- В окне Модули щелкните правой кнопкой мыши заголовки Состояние символов или Файл символов либо любой модуль.
- В контекстном меню выберите один из следующих вариантов:
- Шаг с заходом в код.
- Приостановка выполнения кода из-за точки останова или исключения.
- Переключение на другой поток.
- Изменение кадра стека двойным щелчком по кадру в окне Стек вызовов.
-
Local variable name - Имя локальной переменной - чтобы доказать, что PDB содержит имя локальной переменной, мы будем использовать отражатель для дизассемблирования сборки, PDB существует в той же папке, что и сборка. Отражатель имеет опцию «Отображать символ PDB», как показано на скриншоте, при выборе соответствующей PDB также загружается для сборки. Когда вы проверяете эту опцию, вы видите, что декомпилированный код имеет то же имя переменной, что и реальный код, но при отсутствии PDB или когда опция не выбрана, локальные переменные в вашем декомпилированном коде будут заменены «STR» и «Num» для строковых переменных. Десятичный и т. Д.
Чтобы показать, что PDB содержит имя исходного файла и количество строк исходного кода (пункты 2 и 3), сначала запустите следующее консольное приложение, где PDB существует в той же папке, а второй шаг - удаление файла PDB.
With PDB, this is the exception thrown by the application:
Without PDB, exception shows the following message:
Clearly, the one with PDB shows line number and file name of the class where exception is thrown.
How PDB is Loaded by Debugger?
Отладчик VisualStudio ожидает, что файл PDB находится в той же папке, что и DLL или EXE. Файл PDB, сгенерированный для сборки, уникален для каждого поколения, что означает, что даже в отсутствие изменений кода ранее сгенерированный PDB не может использоваться со сборками, созданными в любой другой сборке. Отладчик выясняет, является ли PDB двоичным, сравнивая конкретный GUID в PDB с двоичным GUID. Этот GUID встраивает двоичный файл и PDB во время процесса компиляции, и они тесно связывают PDB и его двоичный файл.
Different Build Settings in Visual Studio
Visual Studio has 3 different Build Options which control the debug symbols generation:
Full is the default option set in Visual Studio.
According to MSDN:
"If you use /debug:full , be aware that there is some impact on the speed and size of JIT optimized code and a small impact on code quality with /debug:full. We recommend /debug:pdbonly or no PDB for generating release code"" Если вы используете / Debug: FULL, обратите внимание, что скорость и размер оптимизированного кода JIT окажут некоторое влияние, а влияние на качество кода будет небольшим. Мы рекомендуем / debug: PDBUN или нет PDB для генерации кода выпуска.
Should We Deploy PDBs Along with Binaries?
Если размер результата не является проблемой, хорошо развернуть PDB вместе с другими двоичными файлами, поскольку это помогает предоставить больше информации об исключении, как мы видели в примере выше. Эти PDBS очень полезны при определенных прерывистых сбоях. Для некоторых пользователей, если нет PDB, это усложнит жизнь.
Нет необходимости развертывать PDB и двоичное развертывание для получения дополнительной информации об исключении. То же самое может быть достигнуто с помощью серверов символов и исходных индексов, которые я буду обсуждать в следующих темах.
Security Risk with PDB?
Любой, у кого есть доступ к DLL / EXE, может легко перепроектировать, используя такие инструменты, как рефлектор, чтобы генерировать или не использовать исходный код PDB. Поэтому в этом случае не предоставление PDB не сильно поможет.
Если PDB развернут и пользователи не могут получить доступ к двоичным файлам, не стоит показывать им трассировку стека и сообщать им о внутренней структуре приложения.
Symbol Server
Сервер символов используется для хранения файлов PDB, известных отладчику, и может использоваться для поиска более описательной информации стека вызовов.
Мы можем использовать SyStur.EXE для настройки нашего собственного сервера символов, который позволяет отладчику находить фактическую PDB, связанную с рассматриваемым двоичным файлом. SytSuff.EXE включен в инструмент отладки пакета Window.
Microsoft также поддерживает сервер символов, который мы можем использовать, загружая PDB с сервера символов Microsoft.
How and Why to load Microsoft Symbol Store
Когда вы остановите выполнение в точке отладки и откроете окно модуля (как показано ниже), вы обнаружите, что все DLL (внешние или внутренние) загружены в точку останова, но по умолчанию для статуса символа будет отображаться «Кроме PDB». Не удается найти или открыть файл PDB ". Это двоичные файлы Microsoft BCL, потому что наш отладчик не может найти соответствующую PDB, поэтому эти двоичные двоичные файлы не загружаются.
Чтобы загрузить эти символы, перейдите в «Отладка»> «Символы» и проверьте сервер Microsoft Symbol Server и используйте кэшированные символы в этом каталоге в качестве любой общей папки, чтобы ее могли использовать все разработчики.
Поскольку эти двоичные файлы находятся за пределами вашего приложения, вам также необходимо снять флажок «Включить только мой код» в меню «Отладка»> «Общие».
Так как это может быть полезно?
Вы можете разместить точки останова в коде и просматривать стек вызовов с загрузкой символов и без нее.
На следующем рисунке показан стек вызовов без загрузки символов, показаны только мой метод и метод BCL (только внешний код).
На скриншоте ниже вы можете видеть, что я загрузил символ, и теперь статус символа показывает «Загрузка символа».
Как и сервер символов, существует нечто, называемое исходным сервером, который извлекает точную версию исходного файла, используемого для создания любого конкретного приложения. Двоичные файлы могут быть проиндексированы во время сборки, и эта информация хранится в файлах PDB, что помогает исходному серверу найти точный исходный файл.
Points of Interest
Файлы PDB - это проприетарные файлы Microsoft, по крайней мере, документированные.
Файлы базы данных программ (PDB) также называются файлами символов и используются для сопоставления идентификаторов и инструкций в исходном коде вашего проекта с соответствующими идентификаторами и инструкциями в скомпилированных приложениях. С помощью этих файлов отладчик связывается с исходным кодом, что позволяет выполнять его отладку.
При создании проекта из интегрированной среды разработки Visual Studio со стандартной конфигурацией отладочной сборки компилятор создает необходимые файлы символов. В этой статье описывается, как управлять файлами символов в интегрированной среде разработки, а именно:
Подробные сведения о файлах символов см. в следующих статьях:
Принципы использования файлов символов
PDB-файл содержит отладочные данные и сведения о состоянии проекта, позволяющие выполнять инкрементную компоновку отладочной конфигурации приложения. Отладчик Visual Studio использует PDB-файлы для определения двух ключевых элементов информации во время отладки:
В файлах символов также указываются расположение исходных файлов и при необходимости сервер, с которого они будут извлекаться.
Отладчик загружает только те PDB-файлы, которые точно соответствуют PDB-файлам, созданным при построении приложения (то есть исходные PDB-файлы или их копии). Точное дублирование является обязательным, поскольку компоновка приложения может быть изменена даже в том случае, если сам код не изменялся. Дополнительные сведения см. в статье Почему Visual Studio требует, чтобы файлы символов отладчика точно соответствовали двоичным файлам, с которыми они были собраны?
Если требуется выполнить отладку кода за пределами исходного кода проекта, например кода Windows или стороннего кода, вызываемого проектом, необходимо указать расположение PDВ-файлов (и, если необходимо, исходных файлов) для внешнего кода, причем эти файлы должны точно соответствовать сборкам вашего приложения.
Места, в которых отладчик ищет символы
При отладке проекта в интегрированной среде разработки Visual Studio отладчик автоматически загружает файлы символов, которые он может найти по умолчанию.
При отладке управляемого кода на удаленном устройстве все необходимые файлы символов должны находиться либо на локальном компьютере, либо в расположении, указанном в параметрах отладчика.
Отладчик ищет файлы символов в следующих местах:
Расположение, указанное в библиотеке DLL или в исполняемом файле (EXE).
По умолчанию, если на компьютере производится сборка библиотеки DLL или исполняемого файла (EXE), компоновщик помещает полный путь и имя связанного PDB-файла в библиотеку DLL или в EXE-файл. Отладчик проверяет, присутствует ли файл символов в этом расположении.
Папка, в которой располагается сам DLL- или EXE-файл.
Любые расположения, указанные в параметрах отладчика для файлов символов. Сведения о добавлении и активации расположений символов см. в разделе Настройка расположения символов и параметров загрузки.
Любая папка локального кэша символов.
Указанные серверы и расположения символов — локальные, сетевые или в Интернете — такие как серверы символов корпорации Майкрософт, если эта возможность включена. Visual Studio может загружать отладочные файлы символов с серверов символов, которые реализуют протокол symsrv . Visual Studio Team Foundation Server и средства отладки для Windows — это два средства, которые могут использовать серверы символов.
Возможно использование следующих серверов символов:
Серверы символов во внутренней сети или на локальном компьютере Команда разработчиков или компания может создавать серверы символов для собственных продуктов и поддерживать кэш для символов из внешних источников. Можно иметь сервер символов на собственном компьютере.
Сторонние серверы символов Сторонние поставщики приложений Windows и библиотек могут предоставить доступ к серверу символов в Интернете.
При использовании сервера символов, отличного от общедоступных серверов корпорации Майкрософт, следует убедиться в том, что сервер и его путь заслуживают доверия. Поскольку файлы символов могут содержать произвольный исполняемый код, возможно возникновение угроз безопасности.
Настройка расположения файлов символов и параметров загрузки
По умолчанию отладчик выполняет поиск в различных расположениях символов. См. раздел Места, в которых отладчик ищет символы.
На странице Сервис > Параметры > Отладка > Символы можно выполнить следующие действия.
Указание расположения символов и параметров загрузки:
В Visual Studio откройте меню Сервис > Параметры > Отладка > Символы (или Отладка > Параметры > Символы).
В разделе Места размещения файлов символов (.pdb) :
Чтобы добавить новое расположение сервера символов:
Поиск выполняется только в указанной папке. Любые вложенные папки, в которых требуется осуществлять поиск, должны быть внесены в список.
Добавление нового расположения сервера символов VSTS:
Чтобы изменить порядок загрузки для расположений символов, используйте клавиши CTRL+СТРЕЛКА ВВЕРХ и CTRL+СТРЕЛКА ВНИЗ либо значки со стрелками вверх и вниз.
Чтобы изменить URL-адрес или путь, дважды щелкните элемент или выберите его и нажмите клавишу F2.
Чтобы удалить элемент, выделите его и щелкните значок - .
Необязательно: чтобы повысить производительность загрузки символов, перейдите в раздел Кэшировать символы в этом каталоге и введите путь к локальной папке, в которую серверы символов могут копировать символы.
Не размещайте локальный кэш символов в защищенной папке, такой как C:\Windows или вложенные папки. Вместо этого следует использовать папку, для которой разрешены чтение и запись.
Если для проекта C++ задана переменная среды _NT_SYMBOL_PATH , она переопределяет значение, заданное в разделе Кэшировать символы в этом каталоге.
Укажите модули, которые отладчик должен загружать из расположений файлов символов (. pdb) при запуске.
Выберите Все модули, кроме исключенных (значение по умолчанию), чтобы загружать все символы для всех модулей, кроме тех, что были явно исключены. Чтобы исключить конкретные модули, выберите Укажите исключенные модули, щелкните значок + , введите имена исключаемых модулей и нажмите кнопку ОК.
Чтобы загружать из расположений файлов символов только заданные модули, выберите Загружать только указанные модули. Выберите Укажите включенные модули, щелкните значок + , введите имена включаемых модулей и нажмите кнопку ОК. Файлы символов для других модулей не загружаются.
Другие параметры символов для отладки
Для настройки дополнительных параметров символов перейдите в раздел Сервис > Параметры > Отладка > Общие (или Отладка > Параметры > Общие):
Загружать экспорты из DLL (только машинный код)
Загружает таблицы экспорта библиотеки DLL для C/C++. Дополнительные сведения см. в разделе Таблицы экспорта библиотеки DLL. Поскольку на чтение данных экспорта для библиотеки DLL затрачиваются определенные ресурсы, по умолчанию загрузка таблиц экспорта отключена. Кроме того, вы можете использовать dumpbin /exports в командной строке сборки C/C++.
Включить отладку на уровне адреса и Показывать дизассемблированный код, если исходный код недоступен
Дизассемблированный код отображается во всех случаях, когда исходные файлы или файлы символов не найдены.
Включить поддержку сервера системы управления версиями
Если исходный код на локальном компьютере отсутствует или PDB-файл не соответствует исходному коду, при отладке приложения используется сервер системы управления версиями. Сервер системы управления версиями принимает запросы на файлы и возвращает сами файлы из этой системы. Сервер системы управления версиями использует для работы библиотеку srcsrv.dll, которая нужна для чтения PDB-файла приложения. Этот PDB-файл содержит указатели на репозиторий исходного кода, а также команды, используемые для получения исходного кода из репозитория.
Чтобы ограничить набор команд, которые библиотека srcsrv.dll может исполнять из PDB-файла приложения, можно включить список допустимых команд в файл srcsrv.ini. Поместите файл srcsrv.ini в ту же папку, что и файлы srcsrv.dll и devenv.exe.
В PDB-файл приложения можно внедрять произвольные команды, поэтому убедитесь, что в файл srcsrv.ini включены только те из них, которые требуется выполнять. Любая попытка выполнить команду не из файла srcsvr.ini вызовет диалоговое окно подтверждения. Дополнительные сведения см. в статье Предупреждение системы безопасности. Отладчик должен выполнить команду без доверия.
Параметры команд не проверяются, поэтому будьте внимательны с доверенными командами. Например, если вы включили команду cmd.exe в файл srcsrv.ini, пользователь-злоумышленник может указать параметры, которые сделают выполнение команды cmd.exe опасным.
Выберите этот элемент и нужные дочерние элементы. Параметры Разрешить выполнение частично доверенных сборок (только управляемых) на сервере системы управления версиями и Всегда выполнять ненадежные команды исходного сервера без запроса могут повысить риски безопасности, описанные выше.
Параметры символов для компилятора
Если при выполнении сборки проекта из интегрированной среды разработки Visual Studio используется стандартная конфигурация сборки Отладка, компилятор C++ и управляемые компиляторы создают соответствующие файлы символов для кода. Параметры компилятора также можно задать в коде.
Сведения о настройке параметров компилятора для конфигураций сборки в Visual Studio см. в статье Настройка конфигураций отладки и выпуска в Visual Studio.
Параметры C/C++
PDB-файл для C/C++ создается при сборке с параметрами /ZI или /Zi. В Visual C++ параметр /Fd присваивает имя PDB-файлу, который создается компилятором. При создании проекта в Visual Studio с использованием интегрированной среды разработки используется параметр /Fd с целью создания PDB-файла с именем .pdb.
При сборке приложения, написанного на C/C++, с использованием файла makefile и указанием параметра /ZI или /Zi без /Fd компилятор создает два описанных ниже PDB-файла:
VC.pdb, где представляет версию компилятора Microsoft C++, например VC11.pdb.
Файл VC.pdb хранит все отладочные данные для отдельных объектных файлов и располагается в том же каталоге, что и файл makefile проекта. Каждый раз, создавая объектный файл, компилятор C/C++ добавляет отладочную информацию в файл VC.pdb. Поэтому, даже если исходный файл включает общие файлы заголовков, такие как , определения типов (typedef) из этих заголовков сохраняются только один раз, а не включаются в каждый объектный файл. Вставляемая информация включает информацию о типах, но не включает символьную информацию, такую как определения функций.
Файл .pdb содержит все отладочные данные из EXE-файла проекта и располагается в подкаталоге \debug. Файл .pdb содержит полные отладочные данные, включая прототипы функций, а не только сведения о типах, содержащиеся в файле .pdb.
Файлы VC.pdb и .pdb поддерживают добавочные обновления. Компоновщик также включает путь к PDB-файлам в EXE-файл или DLL-файл, которые он создает.
Таблицы экспорта библиотеки DLL
В выходных данных команды dumpbin /exports можно увидеть точное имя функции, включая символы, отличные от буквенно-цифровых. Просмотр точных имен функций полезен для задания точки останова в функции, поскольку в отладчике имена функций могут быть усечены в других местах. Дополнительные сведения см. в разделе dumpbin /exports.
Веб-приложения
Загрузка символов при отладке
Для загрузки символов или изменения параметров символов во время отладки можно использовать окна Модули, Стек вызовов, Локальные, Видимые или Контрольные значения. Дополнительные сведения см. в разделе Дополнительные сведения о присоединении отладчика к приложению.
Работа с символами в окне "Модули"
В процессе отладки в окне Модули можно узнать, какие модули будут рассматриваться отладчиком в качестве пользовательского кода (или "моего кода"), а также проверить состояние загрузки символов для них. Кроме того, в окне Модули вы можете отслеживать состояние загрузки символов, загружать символы и изменять параметры символов.
Отслеживание или изменение расположений и параметров символов во время отладки:
Использование страниц "Символы не загружены" или "Нет исходного кода"
Отладчик может прервать выполнение в коде, для которого отсутствуют файлы символов или исходные файлы, в результате любого из следующих событий:
Когда происходит любое из этих событий, отладчик отображает страницу Символы не загружены или Нет исходного кода, чтобы помочь найти и загрузить необходимые символы или исходный код.
Использование страницы "Символы не загружены" для поиска и загрузки отсутствующих символов:
Если отладчик находит PDB-файл после выполнения одного из этих действий и может извлечь исходный файл на основании информации в PDB-файле, отображается исходный код. В противном случае отображается страница Нет исходного кода, на которой описывается проблема и приводятся ссылки на действия, которые могут решить ее.
Добавление путей поиска исходных файлов в решение:
Вы можете указать расположения, в которых отладчик будет искать исходные файлы, а также исключить из поиска определенные файлы.
Выберите решение в обозревателе решений и затем щелкните значок Свойства, нажмите клавиши ALT+ВВОД либо щелкните это решение правой кнопкой мыши и выберите пункт Свойства.
Выберите Исходные файлы отладки.
В разделе Каталоги, содержащие исходный код введите или выберите расположения исходного кода для поиска. Щелкните значок Новая строка для добавления дополнительных расположений, значки со стрелками вверх и вниз для изменения их порядка либо значок X для их удаления.
Отладчик выполняет поиск только в указанном каталоге. Любые подкаталоги, в которых требуется осуществлять поиск, должны быть внесены в список.
В разделе Не выполнять поиск следующих исходных файлов введите имена исходных файлов, исключаемых из поиска.
Program database (.pdb) files, also called symbol files, map identifiers and statements in your project's source code to corresponding identifiers and instructions in compiled apps. These mapping files link the debugger to your source code, which enables debugging.
When you build a project from the Visual Studio IDE with the standard Debug build configuration, the compiler creates the appropriate symbol files. This article describes how to manage symbol files in the IDE, for example:
For a detailed explanation of symbol files, see the following:
How symbol files work
The .pdb file holds debugging and project state information that allows incremental linking of a Debug configuration of your app. The Visual Studio debugger uses .pdb files to determine two key pieces of information while debugging:
Symbol files also show the location of the source files, and optionally, the server to retrieve them from.
The debugger only loads .pdb files that exactly match the .pdb files created when an app was built (that is, the original .pdb files or copies). This exact duplication is necessary because the layout of apps can change even if the code itself has not changed. For more information, see Why does Visual Studio require debugger symbol files to exactly match the binary files that they were built with?
To debug code outside your project source code, such as Windows code or third-party code your project calls, you must specify the location of the external code's .pdb files (and optionally, the source files), which must exactly match the builds in your app.
Where the debugger looks for symbols
When you debug a project in the Visual Studio IDE, the debugger automatically loads symbol files that it can find by default.
When debugging managed code on a remote device, all symbol files must be located either on the local machine, or in a location specified in the debugger options.
The debugger searches for symbol files in the following locations:
The project folder.
The location that is specified inside the DLL or the executable (.exe) file.
By default, if you have built a DLL or an .exe file on your computer, the linker places the full path and filename of the associated .pdb file in the DLL or .exe file. The debugger checks to see if the symbol file exists in that location.
The same folder as the DLL or .exe file.
Any locations specified in the debugger options for symbol files. To add and enable symbol locations, see Configure symbol locations and loading options.
Any local symbol cache folder.
Specified network, internet, or local symbol servers and locations, such as the Microsoft Symbol Servers if selected. Visual Studio can download debugging symbol files from symbol servers that implement the symsrv protocol. Visual Studio Team Foundation Server and the Debugging Tools for Windows are two tools that can use symbol servers.
Symbol servers you might use include:
Symbol servers on an internal network or on your local machine: Your team or company can create symbol servers for your own products, and as a cache for symbols from external sources. You might have a symbol server on your own machine.
Third-party symbol servers: Third-party providers of Windows applications and libraries can provide access to symbol server on the internet.
If you use a symbol server other than the public Microsoft Symbol Servers, make sure that the symbol server and its path are trustworthy. Because symbol files can contain arbitrary executable code, you can be exposed to security threats.
Configure location of symbol files and loading options
The debugger checks various locations for symbols by default. See Where the debugger looks for symbols.
On the Tools > Options > Debugging > Symbols page, you can:
To specify symbol locations and loading options:
In Visual Studio, open Tools > Options > Debugging > Symbols (or Debug > Options > Symbols).
Under Symbol file (.pdb) locations,
To add a new symbol server location,
Only the specified folder is searched. You must add entries for any subfolders that you want to search.
To add a new VSTS Symbol Server location,
To change the loading order for the symbol locations, use Ctrl+Up and Ctrl+Down, or the Up and Down arrow icons.
To edit a URL or path, double-click the entry, or select it and press F2.
To remove an entry, select it, and then select the - icon.
(Optional) To improve symbol loading performance, under Cache symbols in this directory, type a local folder path that symbol servers can copy symbols to.
Do not place the local symbol cache in a protected folder, like C:\Windows or a subfolder. Use a read-write folder instead.
For C++ projects, if you have the _NT_SYMBOL_PATH environment variable set, it will override the value set under Cache symbols in this directory.
Specify the modules that you want the debugger to load from the Symbol file (.pdb) locations when it starts.
Select Load all modules, unless excluded (the default) to load all the symbols for all modules in the symbol file location, except modules you specifically exclude. To exclude certain modules, select Specify excluded modules, select the + icon, type the names of the modules to exclude, and select OK.
To load only modules you specify from the symbol file locations, select Load only specified modules. Select Specify included modules, select the + icon, type the names of the modules to include, and then select OK. The symbol files for other modules are not loaded.
Select OK.
Other symbol options for debugging
You can select additional symbol options in Tools > Options > Debugging > General (or Debug > Options > General):
Load dll exports (Native only)
Loads DLL export tables for C/C++. For details, see DLL export tables. Reading DLL export information involves some overhead, so loading export tables is turned off by default. You can also use dumpbin /exports in a C/C++ build command line.
Enable address level debugging and Show disassembly if source not available
Always shows the disassembly when source or symbol files are not found.
Enable source server support
Uses Source Server to help debug an app when there is no source code on the local machine, or the .pdb file does not match the source code. Source Server takes requests for files and returns the actual files from source control. Source Server runs by using a DLL named srcsrv.dll to read the app's .pdb file. The .pdb file contains pointers to the source code repository, as well as commands used to retrieve source code from the repository.
You can limit the commands that srcsrv.dll can execute from the app's .pdb file by listing the allowed commands in a file named srcsrv.ini. Place the srcsrv.ini file in the same folder as srcsrv.dll and devenv.exe.
Arbitrary commands can be embedded in an app's .pdb file, so make sure to put only the commands you want to execute into a srcsrv.ini file. Any attempt to execute a command not in the srcsvr.ini file will cause a confirmation dialog box to appear. For more information, see Security Warning: Debugger Must Execute Untrusted Command.
No validation is done on command parameters, so be careful with trusted commands. For example, if you listed cmd.exe in your srcsrv.ini, a malicious user might specify parameters on cmd.exe that would make it dangerous.
Select this item and the child items you want. Allow source server for partial trust assemblies (Managed only) and Always run untrusted source server commands without prompting can increase the security risks.
Compiler symbol options
When you build a project from the Visual Studio IDE with the standard Debug build configuration, the C++ and managed compilers create the appropriate symbol files for your code. You can also set compiler options in code.
To set the compiler options for your build configurations in Visual Studio, see Set debug and release configurations.
C/C++ options
A .pdb file for C/C++ is created when you build with /ZI or /Zi. In Visual C++, the /Fd option names the .pdb file the compiler creates. When you create a project in Visual Studio using the IDE, the /Fd option is set to create a .pdb file named .pdb.
If you build your C/C++ application using a makefile, and you specify /ZI or /Zi without using /Fd, the compiler creates two .pdb files:
VC.pdb, where represents the version of the Microsoft C++ compiler, for example VC11.pdb
The VC.pdb file stores all debugging information for the individual object files, and resides in the same directory as the project makefile. Each time it creates an object file, the C/C++ compiler merges debug information into VC.pdb. So even if every source file includes common header files such as , the typedefs from those headers are stored only once, rather than in every object file. The inserted information includes type information, but does not include symbol information, such as function definitions.
The .pdb file stores all debug information for the project's .exe file, and resides in the \debug subdirectory. The .pdb file contains full debug information, including function prototypes, not just the type information found in VC.pdb.
Both the VC.pdb and .pdb files allow incremental updates. The linker also embeds the path to the .pdb files in the .exe or .dll file that it creates.
DLL export tables
Use dumpbin /exports to see the symbols available in the export table of a DLL. Symbolic information from DLL export tables can be useful for working with Windows messages, Windows procedures (WindowProcs), COM objects, marshaling, or any DLL you don't have symbols for. Symbols are available for any 32-bit system DLL. The calls are listed in the calling order, with the current function (the most deeply nested) at the top.
By reading the dumpbin /exports output, you can see the exact function names, including non-alphanumeric characters. Seeing exact function names is useful for setting a breakpoint on a function, because function names can be truncated elsewhere in the debugger. For more information, see dumpbin /exports.
Web applications
Load symbols while debugging
You can use the Modules, Call Stack, Locals, Autos, or any Watch window to load symbols or change symbol options while debugging. For more information, see Get more familiar with how the debugger attaches to your app.
Work with symbols in the Modules window
During debugging, the Modules window shows the code modules the debugger is treating as user code, or My Code, and their symbol loading status. You can also monitor symbol loading status, load symbols, and change symbol options in the Modules window.
To monitor or change symbol locations or options while debugging:
Use the No Symbols Loaded/No Source Loaded pages
There are several ways for the debugger to break into code that does not have symbol or source files available:
When this happens, the debugger displays the No Symbols Loaded or No Source Loaded pages to help you find and load the necessary symbols or source.
To use the No Symbols Loaded document page to help find and load missing symbols:
If the debugger finds the .pdb file after you execute one of the options, and can retrieve the source file using the information in the .pdb file, it displays the source. Otherwise, it displays a No Source Loaded page that describes the issue, with links to actions that might resolve the issue.
To add source file search paths to a solution:
You can specify the locations the debugger searches for source files, and exclude specific files from the search.
Select the solution in Solution Explorer, and then select the Properties icon, press Alt+Enter, or right-click and select Properties.
Select Debug Source Files.
Under Directories containing source code, type or select source code locations to search. Use the New Line icon to add more locations, the Up and Down arrow icons to reorder them, or the X icon to delete them.
The debugger searches only the specified directory. You must add entries for any subdirectories that you want to search.
Under Do not look for these source files, type the names of source files to exclude from search.
Файлы базы данных программ (PDB) также называются файлами символов и используются для сопоставления идентификаторов и инструкций в исходном коде вашего проекта с соответствующими идентификаторами и инструкциями в скомпилированных приложениях. С помощью этих файлов отладчик связывается с исходным кодом, что позволяет выполнять его отладку.
При создании проекта из интегрированной среды разработки Visual Studio со стандартной конфигурацией отладочной сборки компилятор создает необходимые файлы символов. В этой статье описывается, как управлять файлами символов в интегрированной среде разработки, а именно:
Подробные сведения о файлах символов см. в следующих статьях:
Принципы использования файлов символов
PDB-файл содержит отладочные данные и сведения о состоянии проекта, позволяющие выполнять инкрементную компоновку отладочной конфигурации приложения. Отладчик Visual Studio использует PDB-файлы для определения двух ключевых элементов информации во время отладки:
В файлах символов также указываются расположение исходных файлов и при необходимости сервер, с которого они будут извлекаться.
Отладчик загружает только те PDB-файлы, которые точно соответствуют PDB-файлам, созданным при построении приложения (то есть исходные PDB-файлы или их копии). Точное дублирование является обязательным, поскольку компоновка приложения может быть изменена даже в том случае, если сам код не изменялся. Дополнительные сведения см. в статье Почему Visual Studio требует, чтобы файлы символов отладчика точно соответствовали двоичным файлам, с которыми они были собраны?
Если требуется выполнить отладку кода за пределами исходного кода проекта, например кода Windows или стороннего кода, вызываемого проектом, необходимо указать расположение PDВ-файлов (и, если необходимо, исходных файлов) для внешнего кода, причем эти файлы должны точно соответствовать сборкам вашего приложения.
Места, в которых отладчик ищет символы
При отладке проекта в интегрированной среде разработки Visual Studio отладчик автоматически загружает файлы символов, которые он может найти по умолчанию.
При отладке управляемого кода на удаленном устройстве все необходимые файлы символов должны находиться либо на локальном компьютере, либо в расположении, указанном в параметрах отладчика.
Отладчик ищет файлы символов в следующих местах:
Расположение, указанное в библиотеке DLL или в исполняемом файле (EXE).
По умолчанию, если на компьютере производится сборка библиотеки DLL или исполняемого файла (EXE), компоновщик помещает полный путь и имя связанного PDB-файла в библиотеку DLL или в EXE-файл. Отладчик проверяет, присутствует ли файл символов в этом расположении.
Папка, в которой располагается сам DLL- или EXE-файл.
Любые расположения, указанные в параметрах отладчика для файлов символов. Сведения о добавлении и активации расположений символов см. в разделе Настройка расположения символов и параметров загрузки.
Любая папка локального кэша символов.
Указанные серверы и расположения символов — локальные, сетевые или в Интернете — такие как серверы символов корпорации Майкрософт, если эта возможность включена. Visual Studio может загружать отладочные файлы символов с серверов символов, которые реализуют протокол symsrv . Visual Studio Team Foundation Server и средства отладки для Windows — это два средства, которые могут использовать серверы символов.
Возможно использование следующих серверов символов:
Серверы символов во внутренней сети или на локальном компьютере Команда разработчиков или компания может создавать серверы символов для собственных продуктов и поддерживать кэш для символов из внешних источников. Можно иметь сервер символов на собственном компьютере.
Сторонние серверы символов Сторонние поставщики приложений Windows и библиотек могут предоставить доступ к серверу символов в Интернете.
При использовании сервера символов, отличного от общедоступных серверов корпорации Майкрософт, следует убедиться в том, что сервер и его путь заслуживают доверия. Поскольку файлы символов могут содержать произвольный исполняемый код, возможно возникновение угроз безопасности.
Настройка расположения файлов символов и параметров загрузки
По умолчанию отладчик выполняет поиск в различных расположениях символов. См. раздел Места, в которых отладчик ищет символы.
На странице Сервис > Параметры > Отладка > Символы можно выполнить следующие действия.
Указание расположения символов и параметров загрузки:
В Visual Studio откройте меню Сервис > Параметры > Отладка > Символы (или Отладка > Параметры > Символы).
В разделе Места размещения файлов символов (.pdb) :
Чтобы добавить новое расположение сервера символов:
Поиск выполняется только в указанной папке. Любые вложенные папки, в которых требуется осуществлять поиск, должны быть внесены в список.
Добавление нового расположения сервера символов VSTS:
Чтобы изменить порядок загрузки для расположений символов, используйте клавиши CTRL+СТРЕЛКА ВВЕРХ и CTRL+СТРЕЛКА ВНИЗ либо значки со стрелками вверх и вниз.
Чтобы изменить URL-адрес или путь, дважды щелкните элемент или выберите его и нажмите клавишу F2.
Чтобы удалить элемент, выделите его и щелкните значок - .
Необязательно: чтобы повысить производительность загрузки символов, перейдите в раздел Кэшировать символы в этом каталоге и введите путь к локальной папке, в которую серверы символов могут копировать символы.
Не размещайте локальный кэш символов в защищенной папке, такой как C:\Windows или вложенные папки. Вместо этого следует использовать папку, для которой разрешены чтение и запись.
Если для проекта C++ задана переменная среды _NT_SYMBOL_PATH , она переопределяет значение, заданное в разделе Кэшировать символы в этом каталоге.
Укажите модули, которые отладчик должен загружать из расположений файлов символов (. pdb) при запуске.
Выберите Все модули, кроме исключенных (значение по умолчанию), чтобы загружать все символы для всех модулей, кроме тех, что были явно исключены. Чтобы исключить конкретные модули, выберите Укажите исключенные модули, щелкните значок + , введите имена исключаемых модулей и нажмите кнопку ОК.
Чтобы загружать из расположений файлов символов только заданные модули, выберите Загружать только указанные модули. Выберите Укажите включенные модули, щелкните значок + , введите имена включаемых модулей и нажмите кнопку ОК. Файлы символов для других модулей не загружаются.
Другие параметры символов для отладки
Для настройки дополнительных параметров символов перейдите в раздел Сервис > Параметры > Отладка > Общие (или Отладка > Параметры > Общие):
Загружать экспорты из DLL (только машинный код)
Загружает таблицы экспорта библиотеки DLL для C/C++. Дополнительные сведения см. в разделе Таблицы экспорта библиотеки DLL. Поскольку на чтение данных экспорта для библиотеки DLL затрачиваются определенные ресурсы, по умолчанию загрузка таблиц экспорта отключена. Кроме того, вы можете использовать dumpbin /exports в командной строке сборки C/C++.
Включить отладку на уровне адреса и Показывать дизассемблированный код, если исходный код недоступен
Дизассемблированный код отображается во всех случаях, когда исходные файлы или файлы символов не найдены.
Включить поддержку сервера системы управления версиями
Если исходный код на локальном компьютере отсутствует или PDB-файл не соответствует исходному коду, при отладке приложения используется сервер системы управления версиями. Сервер системы управления версиями принимает запросы на файлы и возвращает сами файлы из этой системы. Сервер системы управления версиями использует для работы библиотеку srcsrv.dll, которая нужна для чтения PDB-файла приложения. Этот PDB-файл содержит указатели на репозиторий исходного кода, а также команды, используемые для получения исходного кода из репозитория.
Чтобы ограничить набор команд, которые библиотека srcsrv.dll может исполнять из PDB-файла приложения, можно включить список допустимых команд в файл srcsrv.ini. Поместите файл srcsrv.ini в ту же папку, что и файлы srcsrv.dll и devenv.exe.
В PDB-файл приложения можно внедрять произвольные команды, поэтому убедитесь, что в файл srcsrv.ini включены только те из них, которые требуется выполнять. Любая попытка выполнить команду не из файла srcsvr.ini вызовет диалоговое окно подтверждения. Дополнительные сведения см. в статье Предупреждение системы безопасности. Отладчик должен выполнить команду без доверия.
Параметры команд не проверяются, поэтому будьте внимательны с доверенными командами. Например, если вы включили команду cmd.exe в файл srcsrv.ini, пользователь-злоумышленник может указать параметры, которые сделают выполнение команды cmd.exe опасным.
Выберите этот элемент и нужные дочерние элементы. Параметры Разрешить выполнение частично доверенных сборок (только управляемых) на сервере системы управления версиями и Всегда выполнять ненадежные команды исходного сервера без запроса могут повысить риски безопасности, описанные выше.
Параметры символов для компилятора
Если при выполнении сборки проекта из интегрированной среды разработки Visual Studio используется стандартная конфигурация сборки Отладка, компилятор C++ и управляемые компиляторы создают соответствующие файлы символов для кода. Параметры компилятора также можно задать в коде.
Сведения о настройке параметров компилятора для конфигураций сборки в Visual Studio см. в статье Настройка конфигураций отладки и выпуска в Visual Studio.
Параметры C/C++
PDB-файл для C/C++ создается при сборке с параметрами /ZI или /Zi. В Visual C++ параметр /Fd присваивает имя PDB-файлу, который создается компилятором. При создании проекта в Visual Studio с использованием интегрированной среды разработки используется параметр /Fd с целью создания PDB-файла с именем .pdb.
При сборке приложения, написанного на C/C++, с использованием файла makefile и указанием параметра /ZI или /Zi без /Fd компилятор создает два описанных ниже PDB-файла:
VC.pdb, где представляет версию компилятора Microsoft C++, например VC11.pdb.
Файл VC.pdb хранит все отладочные данные для отдельных объектных файлов и располагается в том же каталоге, что и файл makefile проекта. Каждый раз, создавая объектный файл, компилятор C/C++ добавляет отладочную информацию в файл VC.pdb. Поэтому, даже если исходный файл включает общие файлы заголовков, такие как , определения типов (typedef) из этих заголовков сохраняются только один раз, а не включаются в каждый объектный файл. Вставляемая информация включает информацию о типах, но не включает символьную информацию, такую как определения функций.
Файл .pdb содержит все отладочные данные из EXE-файла проекта и располагается в подкаталоге \debug. Файл .pdb содержит полные отладочные данные, включая прототипы функций, а не только сведения о типах, содержащиеся в файле .pdb.
Файлы VC.pdb и .pdb поддерживают добавочные обновления. Компоновщик также включает путь к PDB-файлам в EXE-файл или DLL-файл, которые он создает.
Таблицы экспорта библиотеки DLL
В выходных данных команды dumpbin /exports можно увидеть точное имя функции, включая символы, отличные от буквенно-цифровых. Просмотр точных имен функций полезен для задания точки останова в функции, поскольку в отладчике имена функций могут быть усечены в других местах. Дополнительные сведения см. в разделе dumpbin /exports.
Веб-приложения
Загрузка символов при отладке
Для загрузки символов или изменения параметров символов во время отладки можно использовать окна Модули, Стек вызовов, Локальные, Видимые или Контрольные значения. Дополнительные сведения см. в разделе Дополнительные сведения о присоединении отладчика к приложению.
Работа с символами в окне "Модули"
В процессе отладки в окне Модули можно узнать, какие модули будут рассматриваться отладчиком в качестве пользовательского кода (или "моего кода"), а также проверить состояние загрузки символов для них. Кроме того, в окне Модули вы можете отслеживать состояние загрузки символов, загружать символы и изменять параметры символов.
Отслеживание или изменение расположений и параметров символов во время отладки:
Использование страниц "Символы не загружены" или "Нет исходного кода"
Отладчик может прервать выполнение в коде, для которого отсутствуют файлы символов или исходные файлы, в результате любого из следующих событий:
Когда происходит любое из этих событий, отладчик отображает страницу Символы не загружены или Нет исходного кода, чтобы помочь найти и загрузить необходимые символы или исходный код.
Использование страницы "Символы не загружены" для поиска и загрузки отсутствующих символов:
Если отладчик находит PDB-файл после выполнения одного из этих действий и может извлечь исходный файл на основании информации в PDB-файле, отображается исходный код. В противном случае отображается страница Нет исходного кода, на которой описывается проблема и приводятся ссылки на действия, которые могут решить ее.
Добавление путей поиска исходных файлов в решение:
Вы можете указать расположения, в которых отладчик будет искать исходные файлы, а также исключить из поиска определенные файлы.
Выберите решение в обозревателе решений и затем щелкните значок Свойства, нажмите клавиши ALT+ВВОД либо щелкните это решение правой кнопкой мыши и выберите пункт Свойства.
Выберите Исходные файлы отладки.
В разделе Каталоги, содержащие исходный код введите или выберите расположения исходного кода для поиска. Щелкните значок Новая строка для добавления дополнительных расположений, значки со стрелками вверх и вниз для изменения их порядка либо значок X для их удаления.
Отладчик выполняет поиск только в указанном каталоге. Любые подкаталоги, в которых требуется осуществлять поиск, должны быть внесены в список.
В разделе Не выполнять поиск следующих исходных файлов введите имена исходных файлов, исключаемых из поиска.
PDB (база данных программы), которая означает базовые данные программы, - это файл, сгенерированный, когда VS компилирует и связывает. Файл DPB в основном хранит основную информацию, требуемую отладчиком VS, включая имя исходного файла, имя переменной, имя функции, FPO (указатель кадра), соответствующий номер строки и так далее. Поскольку информация об отладке сохраняется, файл PDB обычно генерируется в режиме отладки.
Процесс вызова файла PDB
Модуль (Module), EXE и DLL могут называться модулями, поскольку они имеют свой собственный независимый стек, поэтому, когда мы отлаживаем программу, вы можете просмотреть все вызываемые имена модулей в окне Call Stack. И вы можете щелкнуть правой кнопкой мыши, чтобы просмотреть информацию о загрузке ybmol соответствующего модуля, то есть процесс пути файла PDB, вызываемого этим модулем.
Когда каждый модуль загружен, файл PDB с тем же именем загружается одновременно. Таким образом, в режиме отладки не только потому, что код не оптимизирован, но и потому, что загружается файл PDB, скорость выполнения программы в режиме отладки очень низкая.
Каждый модуль будет генерировать только файл PDB с тем же именем, и в то же время модуль будет сгенерирован, GUID файла PDB будет проверен и записан в модуле. Это связано с тем, что при отладке отладчик обеспечивает соответствие каждого модуля файлу PDB. В ходе эксперимента при замене сгенерированного в настоящее время файла PDB на ранее сгенерированный файл PDB в окне отладки будет отображаться «Не загружено символов». MSDN также сделал соответствующее объяснение: отладчик будет загружать только PDB для двоичного файла, который точно соответствует PDB, который был создан, когда двоичный файл был построен.
Файл PDB записывает соответствующую информацию о пути к исходному файлу, поэтому при загрузке файла PDB вы можете сопоставить соответствующую информацию об отладке с исходным кодом. Таким образом, вы можете визуально просматривать связанную информацию, такую как вызовы функций и значения переменных, во время отладки в режиме реального времени. Файл PDB, записанный в модуле, является абсолютным путем. Таким образом, пока модуль загружен на текущий компьютер, отладчик будет естественно находить соответствующий файл PDB в соответствии с информацией о пути в модуле и загружать его. Аналогично, путь к исходному файлу, записанный в файле PDB, также является абсолютным путем, поэтому, пока файл PDB загружается на текущий компьютер и отлаживается в соответствующем модуле, он может соответствовать записанному исходному файлу, а затем визуально просматривать соответствующую информацию.
Если исходный файл не может быть найден, вы все равно можете просмотреть информацию об отладке, но в данный момент можно просмотреть только код сборки, а информацию нельзя просмотреть через исходный файл. В целом, большинство программистов на C ++ не имеют возможности читать ассемблерный код. Поэтому полная отладка через файл PDB имеет мало значения и эффекта. Если вы хотите, чтобы другие люди могли отлаживать свой собственный код, следует предоставить как файлы PDB, так и исходный код. Предоставлять только файлы PDB не имеет смысла. Если у вас есть похожие требования, вы можете сохранить файл PDB, сгенерированный соответствующим образом. Многие библиотеки Microsoft по умолчанию не предоставляют файлы PDB, но недавно Microsoft постепенно открыла некоторые файлы библиотеки PDB.
Путь к файлу VS поиска PDB
Подробное описание в MSDN:
1. The Visual Studio debugger uses the path to the PDB in the EXE or DLL file to find the project.PDB file.
2. If the debugger cannot find the PDB file at that location or if the path is invalid (for example, if the project was moved to another computer), the debugger searches the path containing the EXE.
3. the symbol paths specified in the Options dialog box (Debugging folder, Symbols node).
1 - текущий путь по умолчанию, 2 - путь, записанный в модуле при компиляции и компоновке. Теперь сфокусируйтесь на 3, то есть установите путь к файлу символов.
Откройте следующее окно через Параметры-> Отладка-> Символы или щелкните правой кнопкой мыши Настройки символов в окне Стека вызовов.
Я изменил путь создания PDF-файла на D: \ и вырезал файл PFB для D: \ Other каталог во время отладки.
Затем при отладке для входа в модуль DLL щелкните правой кнопкой мыши на модуле, соответствующем стеку вызовов, и выберите «Просмотр информации о загрузке символа».
Вы можете увидеть последовательность загрузки VS файла PDB через рисунок выше, который такой же, как и в MSDN.
В окне «Настройки символа» вы также можете выбратьсерверНа файл символов кэша, но я пробовал много способов, но ни один не удалось. ,
Зачем говорить об этом файле символов настройки? Потому что иногда некоторые проекты очень велики, и код является общим, поэтому код будет размещен на сервере. Многие большие файлы отладки PDB более сложны, если их скопировать на локальный компьютер. В это время вы можете указать сетевой путь и выполнить отладку напрямую через сетевой путь.
PDB файл статической библиотеки
Статическая библиотека также имеет свой собственный файл PDB, но ее имя VC80.PDB / VC100.PDB. Файл PDB статической библиотеки будет объединен с файлом PDB EXE / DLL во время соединения. Если имеется соответствующий файл PDB, записанный в сгенерированной статической библиотеке lib, но нет соответствующего файла PDB, тогда, когда статическая библиотека связана с EXE / DLL, она выдаст предупреждение о том, что файл PDB, соответствующий статической библиотеке, не может быть найден. Поэтому, если статическая библиотека выпущена как сторонняя библиотека, нет необходимости создавать файл PDB, чтобы вызывающий не сообщал о предупреждении при связывании.
Читайте также: