Кадр не находится в модуле visual studio

Обновлено: 05.07.2024

Знакомство с отладчиком Visual Studio

В этом разделе представлены средства отладчика, предоставляемые Visual Studio. В контексте Visual Studio отладка приложения обычно означает запуск приложения с подключенным отладчиком (то есть в режиме отладчика). При этом в отладчике доступно множество способов наблюдения за выполнением кода. Вы можете пошагово перемещаться по коду и просматривать значения, хранящиеся в переменных, задавать контрольные значения для переменных, чтобы отслеживать изменение значений, изучать путь выполнения кода и т. д. Если вы не знакомы с процессом отладки, перед выполнением задач в этом разделе рекомендуется прочесть документ об отладке для начинающих.

Установка точки останова и запуск отладчика

Точки останова полезны, если вам известны строка или раздел кода, которые вы хотите подробно изучить в среде выполнения. Дополнительные сведения о различных типах точек останова, которые можно задать, например об условных точках останова и точках останова в функциях, см. в разделе Использование точек останова.

Для отладки нужно запустить приложение с отладчиком, подключенным к процессу приложения. Для этого чаще всего используется клавиша F5 (Отладка > Начать отладку). Однако сейчас у вас, возможно, не задано ни одной точки останова для проверки кода приложения, поэтому мы сначала зададим их, а затем начнем отладку. Точки останова — это один из самых простых и важных компонентов надежной отладки. Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти либо выполнение ветви кода.

Если вы открыли файл в редакторе кода, точку останова можно задать, щелкнув в поле слева от строки кода.

Начать отладку

Нажмите клавишу F5 (Отладка > Начать отладку) или Начать отладку кнопку на панели инструментов отладки, при этом отладчик выполняется до первой встреченной точки останова. Если приложение еще не запущено, при нажатии клавиши F5 запускается отладчик и выполняется остановка в первой точке останова.

Переход по коду в отладчике с помощью пошаговых команд

Мы указываем сочетания клавиш для большинства команд, так как они ускоряют навигацию по коду вашего приложения. (Аналогичные команды, такие как команды меню, отображаются в круглых скобках.) Дополнительные сведения об использовании команд пошагового выполнения см. в разделе Навигация по коду в отладчике.

Для запуска приложения с подключенным отладчиком нажмите клавишу F11 (Отладка > Шаг с заходом). F11 — это команда Шаг с заходом, которая выполняет приложение с переходом к следующему оператору. При запуске приложения с помощью клавиши F11 отладчик останавливается на первом выполняемом операторе.

F11 Шаг с заходом

Желтая стрелка представляет оператор, на котором приостановлен отладчик. В этой же точке приостанавливается выполнение приложения (этот оператор пока не выполнен).

Клавишу F11 удобно использовать для более детальной проверки потока выполнения. (Мы также покажем другие варианты более быстрого перемещения по коду.) По умолчанию отладчик пропускает непользовательский код (дополнительные сведения см. в статье об отладке в режиме "Только мой код").

[!NOTE] В управляемом коде вы увидите диалоговое окно с запросом о том, хотите ли вы получать уведомления при автоматическом обходе свойств и операторов (поведение по умолчанию). Если вы хотите изменить этот параметр позже, отключите параметр Шаг с обходом свойств и операторов в меню Сервис > Параметры в разделе Отладка.

Шаг с обходом по коду для пропуска функций

Когда вы находитесь на строке кода, представляющей собой вызов функции или метода, можно нажать клавишу F10 (Отладка > Шаг с обходом) вместо F11.

Клавиша F10 продолжает выполнение отладчика без захода в функции или методы в коде приложения (код продолжает выполняться). Нажав клавишу F10, вы можете обойти код, который вас не интересует. Так можно быстро перейти к важному для вас коду. Дополнительные сведения об использовании команд пошагового выполнения см. в разделе Навигация по коду в отладчике.

Шаг с заходом в свойство

Как упоминалось ранее, по умолчанию отладчик пропускает управляемые свойства и поля, однако команда Шаг с заходом в конкретное расположение позволяет переопределить это поведение.

Щелкните правой кнопкой мыши свойство или поле и выберите Шаг с заходом в конкретное расположение, а затем выберите один из доступных параметров.

Снимок экрана: отладчик Visual Studio с выделенной строкой кода. В контекстном меню выбран вариант "Шаг с заходом в конкретное расположение" и выбран метод Path.set.

В этом примере команда Шаг с заходом в конкретное расположение приводит нас к коду для Path.set .

Снимок экрана: отладчик Visual Studio, отображающий код для Path.set. Фигурные скобки, окружающие функцию Set, выделены желтым цветом.

Быстрое выполнение до точки в коде с помощью мыши

Использование кнопки Выполнение до щелкнутого аналогично установке временной точки останова. Кроме того, эта команда удобна для быстрой работы в видимой области кода приложения. Выполнение до щелкнутого можно использовать в любом открытом файле. Дополнительные сведения об этой функции и аналогичных функциях навигации см. в разделе Выполнение до определенного места в коде.

Снимок экрана: кнопка выполнения до щелкнутого в отладчике Visual Studio. Кнопка указывает на то, что выполнение должно происходить до строки, в которой размещена кнопка.

Находясь в отладчике, наведите курсор на строку кода, пока слева не появится кнопка выполнения до щелкнутого (Выполнить до этого места) отображается слева.

Снимок экрана: отладчик Visual Studio, отображающий кнопку выполнения до щелкнутого, появляющуюся слева от вызова функции "Обновление".

[!NOTE] Кнопка выполнения до щелкнутого (Выполнить до этого места) доступна начиная с версии [!includevs_dev15].

Вывод отладчика из текущей функции

В некоторых случаях может потребоваться продолжить сеанс отладки, однако полностью проведя отладчик сквозь текущую функцию.

Нажмите клавиши SHIFT+F11 (или выберите Отладка > Шаг с выходом).

Эта команда возобновляет выполнение приложения (и перемещает отладчик) до возврата текущей функции.

Выполнить до текущей позиции

Если вы находитесь в режиме редактирования кода (то есть работа отладчика не приостановлена), щелкните правой кнопкой мыши строку кода в приложении и выберите команду Выполнить до текущей позиции (или нажмите клавиши CTRL+F10). Эта команда запускает отладку и задает временную точку останова на текущей строке кода. Дополнительные сведения об этой функции и аналогичных функциях навигации см. в разделе Выполнение до определенного места в коде.

Выполнить до текущей позиции

Если имеются заданные точки останова, отладчик приостанавливается в первой достигнутой точке останова.

Нажимайте клавишу F5, пока не достигнете строки кода, для которой выбрали Выполнить до текущей позиции.

Эта команда удобна, когда вы редактируете код и хотите быстро задать временную точку останова и одновременно запустить отладчик.

[!NOTE] Вы можете использовать функцию Выполнить до текущей позиции в окне Стек вызовов во время отладки.

Быстрый перезапуск приложения

Кнопка Перезапустить позволяет сэкономить время, затрачиваемое на остановку приложения и перезапуск отладчика. Отладчик приостанавливается в первой точке останова, достигнутой при выполнении кода.

Остановить отладку

Если вы хотите остановить отладчик и вернуться в редактор кода, вы можете нажать красную кнопку вместо Перезапустить.

В большинстве языков, поддерживаемых Visual Studio, можно изменять код во время сеанса отладки, а затем продолжать отладку. Для использования этой функции щелкните код, чтобы установить в нем курсор, когда отладчик приостановлен, внесите изменения и нажмите клавишу F5, F10 или F11, чтобы продолжить отладку. Дополнительные сведения об этой функции и ее ограничениях см. в статье Изменить и продолжить.

Сведения об изменении кода XAML во время сеанса отладки см. в статье Создание и отладка выполняющегося кода XAML с помощью горячей перезагрузки XAML.

Проверка переменных с помощью подсказок по данным

Теперь, когда вы немного освоились, у вас есть хорошая возможность проверить состояние приложения (переменные) с помощью отладчика. Функции, позволяющие проверять переменные, являются одними из самых полезных в отладчике. Реализовывать эту задачу можно разными способами. Часто при попытке выполнить отладку проблемы пользователь старается выяснить, хранятся ли в переменных значения, которые требуются в определенном состоянии приложения. Подробные сведения об использовании подсказок по данным см. в разделе Просмотр значений данных в подсказках по данным.

Приостановив работу в отладчике, наведите указатель мыши на объект, чтобы просмотреть его значение свойства по умолчанию (в этом примере имя файла market 031.jpg является значением свойства по умолчанию).

Разверните объект для просмотра его свойств (таких как свойство FullPath в этом примере).

Часто при отладке бывает необходимо быстро проверить значения свойств для объектов. Лучше всего для этого подходят подсказки по данным.

[!TIP] В большинстве поддерживаемых языков можно изменять код во время сеанса отладки. Дополнительные сведения см. в разделе Изменить и продолжить.

Проверка переменных с помощью окон "Видимые" и "Локальные"

В окне Видимые отображаются переменные вместе с текущим значением и типом. Окно Видимые содержит все переменные, используемые в текущей строке или предыдущей строке (в C++ в окне отображаются переменные в трех предыдущих строках кода; сведения о зависящем от языка поведении см. в соответствующей документации). Дополнительные сведения об использовании этих окон см. в статье Проверка переменных в окнах "Видимые" и "Локальные".

Во время отладки взгляните на окно Видимые в нижней части редактора кода.

Окно "Видимые"

[!NOTE] В JavaScript окно Локальные поддерживается, а окно Видимые — нет.

Взгляните в окно Локальные. В окне Локальные показаны переменные, которые находятся в текущей области.

Окно "Локальные"

В этом примере объекты this и f находятся в области действия. Дополнительные сведения см. в статье Проверка переменных в окнах "Видимые" и "Локальные".

Установка контрольного значения

В окне Контрольное значение можно указать переменную (или выражение), которую необходимо отслеживать. Дополнительные сведения см. в статье Установка контрольных значений с помощью окон "Контрольное значение" и "Быстрая проверка".

Во время отладки щелкните правой объект кнопкой мыши и выберите пункт Добавить контрольное значение.

Окно "Контрольное значение"

В этом примере у вас есть контрольное значение, заданное для объекта f , и по мере перемещения по отладчику вы можете наблюдать за изменением его значения. В отличие от других окон переменных, в окне Контрольное значение всегда отображаются просматриваемые вами переменные (они выделяются серым цветом, когда находятся вне области действия).

Просмотр стека вызовов

В окне Стек вызовов показан порядок вызова методов и функций. В верхней строке приведена текущая функция (в данном примере метод Update ). Во второй строке показано, что функция Update была вызвана из свойства Path.set и т. д. Стек вызовов хорошо подходит для изучения и анализа потока выполнения приложения. Дополнительные сведения см. в статье о просмотре стека вызовов.

[!NOTE] Окно Стек вызовов аналогично перспективе "Отладка" в некоторых интегрированных средах разработки, например Eclipse.

Во время отладки щелкните окно Стек вызовов, которое по умолчанию открыто в нижней правой области.

Изучение стека вызовов

Дважды щелкните строку кода, чтобы просмотреть исходный код. При этом также изменится текущая область, проверяемая отладчиком. Это не перемещает отладчик.

Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставлять точки останова в указанные функции, перезапускать приложение с помощью функции Выполнение до текущей позиции и изучать исходный код.

Когда приложение выдает исключение, отладчик переходит к строке кода, вызвавшей исключение. Подробные сведения см. в разделе Проверка исключения с помощью помощника по исправлению ошибок.

Помощник по исправлению ошибок

В этом примере вызов DirectoryInfo выдал ошибку на пустой строке, хранящейся в переменной value .

Помощник по исправлению ошибок — это отличная функция, которая помогает отлаживать ошибки. Используя помощник по исправлению ошибок, вы также можете, например, просмотреть сведения об ошибке и добавить контрольное значение. При необходимости вы также можете изменить условия для возникновения конкретного исключения. См. дополнительные сведения об обработке исключений в коде в разделе Приемы и инструменты отладки.

Разверните узел Параметры исключений, чтобы просмотреть дополнительные параметры для обработки исключения этого типа, однако в рамках этого тура ничего менять не требуется.

Вы можете настроить проект для сборки, как описано в статье о конфигурации отладки или выпуска, настроить свойства проекта для отладки или настроить общие параметры для отладки. Кроме того, можно настроить отладчик для вывода пользовательских сведений с помощью таких компонентов, как атрибута DebuggerDisplay либо платформы NatVis для C/C++.

Свойства отладки зависят от типа проекта. Например, можно задать аргумент, который будет передан в приложение при запуске. Чтобы получить доступ к свойствам проекта приложения, щелкните имя проекта правой кнопкой мыши в обозревателе решений и выберите Свойства. Свойства отладки обычно отображаются на вкладке Сборка или Отладка в зависимости от типа проекта.

Свойства проекта

Средство Snapshot Debugger создает моментальный снимок рабочих приложений при выполнении интересующего вас кода. Чтобы указать отладчику на необходимость создать моментальный снимок, следует установить точки прикрепления и точки ведения в коде. Отладчик позволяет увидеть источник ошибки, не затрагивая трафик рабочего приложения. Средство Snapshot Debugger позволяет значительно сократить затраты времени на устранение проблем, возникающих в рабочих средах.

Запуск Snapshot Debugger

Просмотр моментальных снимков с помощью возврата на шаг назад в IntelliTrace (Visual Studio Enterprise)

Функция возврата на шаг назад в IntelliTrace автоматически создает моментальный снимок вашего приложения для каждого события точки останова и шага отладчика. Используя записанные моментальные снимки, вы можете возвращаться к этим точкам останова и шагам, просматривая предыдущее состояние приложения. Возможность возврата на шаг назад в IntelliTrace позволяет сэкономить время в тех случаях, когда вам нужно просмотреть предыдущее состояние приложения, но не требуется перезапускать отладку или воссоздавать необходимое состояние приложения.

Для просмотра моментальных снимков и перехода между ними используйте кнопки На шаг назад и На шаг вперед на панели инструментов отладки. С помощью этих кнопок можно перейти к событиям, которые отображаются на вкладке События в окне Средства диагностики.

Отладка проблем производительности

Если приложение работает слишком медленно или использует слишком много памяти, возможно, вам следует протестировать его с помощью средств профилирования на раннем этапе. Дополнительные сведения о средствах профилирования, таких как средство загрузки ЦП и анализатор памяти, см. в разделе Знакомство со средствами профилирования.

В этом руководстве вы кратко познакомились с функциями отладчика. Отдельные функции, например точки останова, вы можете изучить более подробно.

Файлы базы данных программ (PDB) также называются файлами символов и используются для сопоставления идентификаторов и инструкций в исходном коде вашего проекта с соответствующими идентификаторами и инструкциями в скомпилированных приложениях. С помощью этих файлов отладчик связывается с исходным кодом, что позволяет выполнять его отладку.

При создании проекта из интегрированной среды разработки Visual Studio со стандартной конфигурацией отладочной сборки компилятор создает необходимые файлы символов. В этой статье описывается, как управлять файлами символов в интегрированной среде разработки, например, как указать расположение символов в параметрах отладчика, как проверить состояние загрузки символов во время отладки и как задать параметры символов в коде.

Подробные сведения о файлах символов см. в следующих статьях:

Принципы использования файлов символов

PDB-файл содержит отладочные данные и сведения о состоянии проекта, позволяющие выполнять инкрементную компоновку отладочной конфигурации приложения. Отладчик Visual Studio использует PDB-файлы для определения двух ключевых элементов информации во время отладки:

  • Имя исходного файла и номер строки, которая отображается в интегрированной среде разработки Visual Studio.
  • Расположение точки останова в приложении.

В файлах символов также указываются расположение исходных файлов и при необходимости сервер, с которого они будут извлекаться.

Отладчик загружает только те PDB-файлы, которые точно соответствуют PDB-файлам, созданным при построении приложения (то есть исходные PDB-файлы или их копии). Точное дублирование является обязательным, поскольку компоновка приложения может быть изменена даже в том случае, если сам код не изменялся.

Если требуется выполнить отладку кода за пределами исходного кода проекта, например кода Windows или стороннего кода, вызываемого проектом, необходимо указать расположение PDВ-файлов (и, если необходимо, исходных файлов) для внешнего кода, причем эти файлы должны точно соответствовать сборкам вашего приложения.

Расположение файлов символов и поведение при загрузке

При отладке проекта в интегрированной среде разработки Visual Studio отладчик автоматически загружает файлы символов, расположенные в папке проекта.

При отладке управляемого кода на удаленном устройстве все необходимые файлы символов должны находиться либо на локальном компьютере, либо в расположении, указанном в параметрах отладчика.

Отладчик также ищет файлы символов в следующих местах:

Расположение, указанное в библиотеке DLL или в исполняемом файле (EXE).

По умолчанию, если на компьютере производится сборка библиотеки DLL или исполняемого файла (EXE), компоновщик помещает полный путь и имя связанного PDB-файла в библиотеку DLL или в EXE-файл. Отладчик проверяет, присутствует ли файл символов в этом расположении.

Папка, в которой располагается сам DLL- или EXE-файл.

Любые расположения, указанные в параметрах отладчика для файлов символов. Сведения о добавлении и активации расположений символов см. в разделе Настройка расположения символов и параметров загрузки.

Любая папка локального кэша символов.

Указанные серверы и расположения символов — локальные, сетевые или в Интернете — такие как серверы символов корпорации Майкрософт, если эта возможность включена. Visual Studio может загружать отладочные файлы символов с серверов символов, которые реализуют протокол symsrv . Visual Studio Team Foundation Server и средства отладки для Windows — это два средства, которые могут использовать серверы символов.

Возможно использование следующих серверов символов:

Серверы символов во внутренней сети или на локальном компьютере Команда разработчиков или компания может создавать серверы символов для собственных продуктов и поддерживать кэш для символов из внешних источников. Можно иметь сервер символов на собственном компьютере.

Сторонние серверы символов Сторонние поставщики приложений 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++ и управляемые компиляторы создают соответствующие файлы символов для кода. Параметры компилятора также можно задать в коде.

Параметры C/C++

PDB-файл для C/C++ создается при сборке с параметрами /ZI или /Zi. В Visual C++ параметр /Fd присваивает имя PDB-файлу, который создается компилятором. При создании проекта в Visual Studio с использованием интегрированной среды разработки используется параметр /Fd с целью создания PDB-файла с именем <project>.pdb.

При сборке приложения, написанного на C/C++, с использованием файла makefile и указанием параметра /ZI или /Zi без /Fd компилятор создает два описанных ниже PDB-файла:

VC<x>.pdb, где <x> представляет версию компилятора Microsoft C++, например VC11.pdb.

Файл VC<x>.pdb хранит все отладочные данные для отдельных объектных файлов и располагается в том же каталоге, что и файл makefile проекта. Каждый раз, создавая объектный файл, компилятор C/C++ добавляет отладочную информацию в файл VC<x>.pdb. Поэтому, даже если исходный файл включает общие файлы заголовков, такие как <windows.h> , определения типов (typedef) из этих заголовков сохраняются только один раз, а не включаются в каждый объектный файл. Вставляемая информация включает информацию о типах, но не включает символьную информацию, такую как определения функций.

Файл <project>.pdb содержит все отладочные данные из EXE-файла проекта и располагается в подкаталоге \debug. Файл <project>.pdb содержит полные отладочные данные, включая прототипы функций, а не только сведения о типах, содержащиеся в файле <x>.pdb.

Файлы VC<x>.pdb и <project>.pdb поддерживают добавочные обновления. Компоновщик также включает путь к PDB-файлам в EXE-файл или DLL-файл, которые он создает.

Таблицы экспорта библиотеки DLL

В выходных данных команды dumpbin /exports можно увидеть точное имя функции, включая символы, отличные от буквенно-цифровых. Просмотр точных имен функций полезен для задания точки останова в функции, поскольку в отладчике имена функций могут быть усечены в других местах. Дополнительные сведения см. в разделе dumpbin /exports.

Веб-приложения

Управление символами при отладке

Для загрузки символов или изменения параметров символов во время отладки можно использовать окна Модули, Стек вызовов, Локальные, Видимые или Контрольные значения. Дополнительные сведения см. в разделе Дополнительные сведения о присоединении отладчика к приложению.

Работа с символами в окне "Модули"

В процессе отладки в окне Модули можно узнать, какие модули будут рассматриваться отладчиком в качестве пользовательского кода (или "моего кода"), а также проверить состояние загрузки символов для них. Кроме того, в окне Модули вы можете отслеживать состояние загрузки символов, загружать символы и изменять параметры символов.

Отслеживание или изменение расположений и параметров символов во время отладки:

  1. Чтобы открыть окно Модули во время отладки, выберите Отладка > Окна > Модули (или нажмите клавиши CTRL + ALT + U).
  2. В окне Модули щелкните правой кнопкой мыши заголовки Состояние символов или Файл символов либо любой модуль.
  3. В контекстном меню выберите один из следующих вариантов:

Использование страниц "Символы не загружены" или "Нет исходного кода"

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

  • Шаг с заходом в код.
  • Приостановка выполнения кода из-за точки останова или исключения.
  • Переключение на другой поток.
  • Изменение кадра стека двойным щелчком по кадру в окне Стек вызовов.

Когда происходит любое из этих событий, отладчик отображает страницу Символы не загружены или Нет исходного кода, чтобы помочь найти и загрузить необходимые символы или исходный код.

Использование страницы "Символы не загружены" для поиска и загрузки отсутствующих символов:

Если отладчик находит PDB-файл после выполнения одного из этих действий и может извлечь исходный файл на основании информации в PDB-файле, отображается исходный код. В противном случае отображается страница Нет исходного кода, на которой описывается проблема и приводятся ссылки на действия, которые могут решить ее.

Добавление путей поиска исходных файлов в решение:

Вы можете указать расположения, в которых отладчик будет искать исходные файлы, а также исключить из поиска определенные файлы.

Выберите решение в обозревателе решений и затем щелкните значок Свойства, нажмите клавиши ALT+ВВОД либо щелкните это решение правой кнопкой мыши и выберите пункт Свойства.

Выберите Исходные файлы отладки.

В разделе Каталоги, содержащие исходный код введите или выберите расположения исходного кода для поиска. Щелкните значок Новая строка для добавления дополнительных расположений, значки со стрелками вверх и вниз для изменения их порядка либо значок X для их удаления.

Отладчик выполняет поиск только в указанном каталоге. Любые подкаталоги, в которых требуется осуществлять поиск, должны быть внесены в список.

В разделе Не выполнять поиск следующих исходных файлов введите имена исходных файлов, исключаемых из поиска.

Класс взаимодействия с отладчиком (Debugger).

Самый часто используемый мной класс это Debugger, дающий возможность взаимодействовать с отладчиком студии и постараюсь описать ситуации использования отдельных методов этого класса.

Метод Debugger.Launch()

  • Если вы находитесь в режиме отладки, то при вызове этого метода ничего происходить не будет
  • Если запустить ваше приложение вне студии, то при вызове этого метода появится диалог с предложением использовать один из предложенных в списке отладчиков. При этом продолжить работу без использования отладчика невозможно.

Запустив по F5 в студии вы ничего не заметите, но запусти в проводнике увидите диалог:



В котором можете выбрать либо уже запущенную студию (у меня это 1-я строка), либо использовать новый экземпляр студии по вашему выбору.
Внимание! Если "New instance Microsoft . ", тогда весь код проекта будет не доступен. Поэтому желательно выбирать студию с отрытым вашим проектом. Теперь по поводу жизненных ситуаций, когда этот метод пригодится:
  • При отладке двух процессов, когда ваше приложение запускает второе приложение, которое быстро "что то делает" и закрывается. При этом вы не успеваете сделать Debug -> Attach to process.
  • Допустим вы являетесь разработчиком какого то расширения или add-on для какой то системы. При запуске система подгружаете ваш модуль в память и передает ему управление. Встает вопрос, как же теперь отлаживать ситуацию в момент запуска модуля? В этом случае добавляем в код метода Debugger.Launch() и в момент запуска получаем возможность отладить процесс запуска.
    P. S. Если вы пользуетесь Thread.Sleep(15000) + Attach to process, то мои вам соболезнования :)

Метод Debugger.Break()

  • Если отладчик подключен, то происходит остановка при вызове методе, сравнимая остановке на breakpoint .
  • Если же отладчик не подключен и вызывается метод Break(), тогда будет показано окно с выбором отладчика, но при этом закрыв его приложение продолжит работу.

На практике использовал этот метод довольна редко, но было дело, что студия "глючила" и breakpoint слетали после перезапуска. Выходом был этот метод.

Output window и класс Debug.


Мне кажется, что люди не дооценивают окно Output внутри Visual Studio убирая его с рабочего пространства, а ведь это просто идеальная консоль для вывода событий происходящих в приложении и просто спасительный круг, если вы отлаживаете сложное многопоточное приложение. Либо пытаясь распутать какие то ситуации, где требуется анализ параметров и локальных переменных, что бы понять причину неисправности. Сейчас я постараюсь продемонстрировать как использовать Output, но при этом не загромождать им место. Наблюдение показывает, что у всех программистов, которых я видел одна из ситуаций ниже:
  • Окно Output не присутствует на видимом рабочем пространстве. А находится где то снизу на вкладках, при этом программист может иногда поглядывать туда.
  • Окно Output всегда видно, но имеет настолько малый размер, что в нем ничего не понятно. При сборке что то мелькает, а на вопрос "Зачем тебе оно если ничего не понятно?" получал ответ "Что бы знать, что студия не подвисла и было на что поглядеть".
  • Последний вариант, программист активно пользуется им и читает, что пишется в окне. Но при этом в окне два scroll умещается 4-6 строчек, а при работе приложение внутри мелькает текст и бедняга программист пытается найти нужное место.
Если вы из пункта 3 тогда хотел бы предложить мой способ размещения окна, которым я пользуюсь и перенастраиваю везде уже так в течении 5 лет. На всё про всё уходит 5-10 минут, но бывают и такие которые годами будут пользоваться неудобным интерфейсом или способом, при этом зная, что правится проблема в считанные минуты, но человеку "Лениво разбираться" :)

Пошаговая инструкция:

  1. Открепляем окно Ouput и перетаскиваем его в правую часть окна, закрепляя ее на фиксаторе как на картинке:




Теперь мы будем видеть вывод через Debug.Write и настроенный Debug.Trace.

Настройка Log4net и TraceAppender к нему:

По поводу того, как Debug.Write жизнь и нервы спасает, ситуации из жизненного опыта:

Атрибут DebuggerDisplayAttribute.

Представьте жизненную ситуацию, у вас имеется ссылка на массив из объектов и вам надо как то посмотреть значение его полей. Для этого вам потребуется нажимать на стрелочку напротив каждого элемента, что бы увидеть внутренние поля которые вам нужны. Если у вас 3-5 объектов то это можно проделать вручную, но представьте, что там 100 объектов, а вам надо найти тот, у которого определенное значение поля. В итоге либо писать отдельный код который бы отфильтровал вам объекты и оставит нужный. Или можно использовать замечательный атрибут DebuggerDisplayAttribute, который, в режиме отладки, покажет вам всю необходимую для вас информацию об объекте.

Постараюсь продемонстрировать работу на примере. Имеется код:

После запуска в массиве people у вас будут лежать объекты Man со случайными значениями поля возраст. Допустим ваша задача узнать, есть ли объекты с именем "Sergei" в массиве. Запускаем приложение встаем на точке останова, выделяем people жмем "Quick Watch" и видим, что для того, что бы узнать имя нам потребуется у каждого объекта отрывать поля:


По умолчанию отладчик выводит значение .ToString() объекта, он у нас не перегружен, поэтому ToString() выводит значение базового Object.ToString() выводящего имя класса. Поэтому я добавлю атрибут DebuggerDisplay к классу Man. Пример:

Запустился и в "Quick Watch" видим совершенно другую картину:


Как это работает?

Очень просто, для понимания строку "Name = , Age = " стоит представлять как string .Format( "Name = , Age = " , Name, Age ), где на место фигурных скобок < >будет подставлено значение поля с именем Name и Age. Так же можно использовать выражение и даже вызывать методы, как если бы мы работали с объектом напрямую.

Что бы стало все еще более понятно постараюсь продемонстрировать строку посложнее:

Запустившись и увидим вот такую картинку:



Таким образом можно пластично настроит вывод любой интересующей нас информации. Особенности, которые стоит всегда держать в голове:
  • Если свойство или поле вашего класса имеет значение NULL, а вы обратитесь к его свойству открыв окно отладчика, тогда будет NullReferenceException, который отобразится строкой. Поэтому, что бы DebuggerDisplay отображал все объекты корректно, стоит обрабатывать обращение к NULL полю.
  • Перед добавлением значения стоит помнить, что если обращение к свойству или методу приводит к запросу к БД или обращение к серверу, то и очевидно, что перед показом отладчик будет делать то же самое. Будьте к этому готовы.
  • Все изменения с полями\свойствами\объектами вызванными внутри форматированной строки останутся, как если бы вы сами это поменяли. Будьте внимательны!

Перемещение вектора исполнения в Visual Studio.

  1. Имеется метод, допустим импорта чего либо, выполняющийся длительное время. В конце метода есть место, которое требуется отладить. Мы ставим breakpoint, запускаем импорт и в хоте отладки по F10 понимаем, что мы прошли место, которое надо было изучить более пристально. Как решить эту проблему? Пока что, если только перезапустить импорт и вновь дойти до этого места.
  2. Допустим в импорте из пункта 1. есть условие IF+ELSE внутрь IF зайти легко, а что бы выполнилось условие ELSE требуется еще какие то сложные подготовительные действия. Можно за комментировать условие IF оставить только вызов ELSE, но хардкод это не очень удобный вариант.
  3. Вы находитесь в методе, и хотите произвести повторную отладку, но для этого вам понадобится по новой запустить приложение, а значит затратить лишнее время на ожидание и можете банально забыть, что же вы хотели проверить.
Эти и другие ситуации можно решить очень простым способом. Произведя перемещение вектора исполнения (желтую стрелочку) на позицию доступную из текущего места, тем самым продолжить отладку с другого места..

Это обычное консольное приложение, на нем видно как я вектор исполнения перемещаю в нужное мне место и код продолжает выполняться, как если бы было сделано GOTO. При этом передвигаясь вперед или назад, это не откат назад или пропуск операций и остановка в нужном месте Все действия это реальные переходы, и вполне можно так пропустить инициализацию какой то переменно, перейти к обращению не инициализированной переменной, то получите NullReferenceException в 100% рабочем коде. Поэтому перед тем как перемещать стоит внимательно посмотреть является ли переход "Корректным". Если хотите пройти метод снова, то обязательно переводите исполнение на повторную инициализацию локальных переменных.

Правка кода в режиме отладки [Edit and continue].


Хочу рассказать о еще одной feature в Visual Studio, которая может упростить процесс написания кода, когда тебе надо написать работу с классом, но тебе не известно, что хранится в его полях. В этом случае написание сводится к череде:
  • "Запуск" приложения и проход до места работы с объектом.
  • Изучение значения одного из полей
  • Остановка приложения, с целью внести правки или дописать код для работы с объектом.
  • Повтор первого шага



  1. Ставлю точку останова в месте, где интересующий меня объект доступен по ссылке.
  2. Запускаю решение и дохожу до точки останова
  3. Затем уже в месте, где собираюсь писать код для работу с этим объектом начиная подсматриваю по мере необходимости его поля.
Внимание! Код который был написан не компилируется на лету, и при проходе через него возможны визуальные искажения, не стоит на это обращать внимание, так как Visual Studio оперирует данными по смещениям и размерам методов из pdb, которые были собраны до запуска.

Палочка выручалочка "Immediate Window".

За всё время пока я занимаюсь программированием под .NET Framework я ни разу не видел, что бы кто то при мне пользовался "Immediate Window" в Visual Studio, поэтому если ты слышишь про него первый раз, то обязательно добавь его на рабочее пространство и используй! А вот как, я расскажу прям сейчас.

  • Появляется необходимость вызвать какой то метод доступный из текущего места.
  • У локальной переменной хотим заменить значение БЕЗ перезапуска приложения
  • Посмотреть результат выполнения
  • Иными словами хочется вставить и исполнить какую то временную инструкцию.

Думаете это не возможно? Вы ошибаетесь - выход это "Immediate Window". Встав на точку останова вы можете писать не просто выражения, вызывать методы, но и менять значения переменных локальных и глобальных. При этом данный код будет выполняться отдельно от вашего исходного текста программы.

Пример использования:

  • В самом окне работает IntelliSence поэтому проблем с именами быть не должно.
  • Само окно в случае, если введенное выражение возвращает какой то сложный объект, используется продвинутый Formatter, который покажет в читабельном виде все его поля.
  • Не обязательно указывать ";" после каждого выражения.
  • Очень удобно использовать когда надо вывести все поля в читабельном виде.
  • Стрелками "Вверх\вниз" можно подставить ранее введенные выражения.
  • Можно задавать значения локальных переменных
Данное окно очень спасало, когда требовалось в режиме реального времени проверить передачу какого то хардкодного параметра методу, либо заменить значение локальной переменной на что то нужное.

Остановка по требованию или Condition breakpoints.


Breakpoint пользуются все, но стоит помнить о том, что можно указать условие срабатывания точки останова. Бывает часто, что метод вызывается N раз, и требуется на K итерации проверить какой то значение. Если по каким то причинам вы не знает про Condition breakpoints то погнали!

Допустим есть код:


Наша цель, когда i будет равно 500 остановиться и узнать полученное значение от суммы со случайным числом. Если вы садомазахист, то можете поставить точку останова и 500 раз нажимать F5. Но лучшим решением будет поставить точку останова в начале метода, выбрать "Conditions. ":


В появившемся окне в поле "условие" вводим "i == 500" и если условие указано без ошибок, то по нажатию на Enter красная точка поменяет свой вид на точку с плюсом.


Запускаем программу и видим, что мы остановились на месте, когда значение i стало 500.


Внимание! Наблюдается падение производительности приложения, когда присутствуют данные точки останова, поэтому после окончания работы следует обязательно удалять их всех, потому что даже в выключенном режиме они создают тормоза.

Удалённый отладчик Remote Debugger.

Допустим вам в какой то ситуации потребовалось отладить вашу программу на другом компьютере. Вы скачиваете на нее исходный код, устанавливаете студию и начинаете отладку. В таком случае есть возможность работать в студии, которая стоит на вашем компьютере, а к удалённому компьютеру, для отладки, подключаться через Remote Debugger Tools.

Важно знать! Что нужно ставить Remote Debugger Tools для версии вашей студии, обратную совместимость версии не гарантируется. Поэтому если у вас к примеру Visual Studio 2012, тогда нужно искать Remote Debugger для 2012.

Всю настройку описывать не буду, по адресу Remote Debugging можно получить всю интересующую информацию.

Valeroncho 21 ноя 2013, 10:14

waruiyume 21 ноя 2013, 10:21

Закрыть Студию, закрыть Юнити, открыть папку с проектом, удалить всё, кроме: "Assets", "Libliry" и "Project Settings". Скрипты создавать в студии, а не в Юнити, в Юнити только первый.

Valeroncho 21 ноя 2013, 11:08

waruiyume 21 ноя 2013, 11:22

Нет, всё само подключится. Вы ведь, открываете проект, а не скрипт? Если не стоит Монодевелоп, вроде бы, при двойном клике по скрипту, откроется файл, а не проект. Убедитесь, что в Edit->Preferencess, редактором скриптов выбрана Студия.

Valeroncho 21 ноя 2013, 11:35

Открываются файлы через VS, но единственная проблема в том, что я плохо знаю синтаксис Unity. Допустим, когда я пишу в windiws form, VS мне всегда подсказывает, какие методы и классы есть, например, которые начинают с st (он предложит string). Вот и мне бы хотелось, чтобы такое было и когда я пишу что-то для Unity.

extravert 21 ноя 2013, 12:01

Это называется Intellisense. Поставьте плагин Resharper, добавляющий очень много полезных фич, в том числе и Intellisense. В настройках плагина будет улучшенная подсветка синтаксиса.

qwerty74 21 ноя 2013, 12:37

В настройках изменить редактор по умолчанию на студию и открывать скрипты через юнити.

Valeroncho 21 ноя 2013, 18:39

Проблему решил. Сделал это так:
1. Понадобится VS Professional (Ultimate);
2. Скачивает дополнение Livity Studio;
3. Радуемся

seaman 21 ноя 2013, 18:52

Klimach 21 ноя 2013, 19:31

Valeroncho 21 ноя 2013, 21:36

Professional можно получить бесплатно, если ты студент. Есть еще другой способ, как его получить (в гугле много инфы по этому поводу). Но сейчас не про это. Мне кажется, что удобнее подключить Livity студио один раз, чем постоянно добавлять скрипты вручную. Два раза нажал по скрипту и он открывается в VS, которой уже знает синтаксис Unity.

Всем спасибо за помощь!

seaman 21 ноя 2013, 21:50


Ничего не надо добавлять
Вам уже все написали.
Создаешь скрипт в Юнити. Дважды щелкаешь по нему в юнити. Открывается VS, которая уже все знает. Работешь в VS, в том числе создаешь скрипты. Если вдруг что-то создал в Юнити. Позволяешь VS перезагрузить проект.
Изредка (один раз на 10-20) таких перезагрузок у VS что-то слетает. Потому и предлагается создавать все в VS. Тогда делаешь так как уже тоже написали - Закрываешь VS, удаляешь все файлы проекта VS:
открыть папку с проектом, удалить всё, кроме: "Assets", "Libliry" и "Project Settings"

Valeroncho 22 ноя 2013, 08:30

Вы меня немного не поняли. С открытием скриптов в VS у меня проблем не было. Но VS самая не узнает синтаксис Unity, пока я не подключу нужные библиотеки или, например, не установлю дополнение Livity или reSharper.

seaman 22 ноя 2013, 11:42


А что она узнает БЕЗ подключения к проекту соответствующей библиотеки?- ничего.
ЗЫ: решарпер не поможет, если библиотека не подключена к проекту.

Valeroncho 22 ноя 2013, 22:19

Мне предлагали подключать UnityEditor, чтобы мне VS выдавала что-нибудь, когда я пишу код. Но зачем я все время буду подключать ее, если я могу поставить Livity, которая будет мне выдавать попапсы, когда я напишу пару начальных буков какого-нибудь класса или метода? Я хотел узнать, что мне надо подключить/установить, чтобы, когда я пишу "col" мне VS выдала попап с вариантами: Collider, Collision и т.д. Т.е. все методы/класса, которые начинаются на "col".

Читайте также: