Учебник. Отладка кода C# и C++ в рамках одного сеанса отладки

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

В этом учебнике описывается процесс отладки машинного кода из управляемого приложения. Тем не менее при необходимости вы можете выполнять отладку управляемого кода из собственного приложения. Отладчик также поддерживает смешанные режимы других типов, например отладку кода Python и машинного кода, а также использование отладчика сценариев в приложениях таких типов, как ASP.NET.

При работе с этим руководством вы сделаете следующее:

  • Создание простой собственной библиотеки DLL
  • Создание простого приложения .NET Core или .NET Framework для вызова библиотеки DLL
  • Настройка смешанного режима отладки
  • Запуск отладчика
  • Попадание в точку останова в управляемом приложении
  • Шаг с заходом в машинный код

Необходимые компоненты

Необходимо установить среду Visual Studio со следующими рабочими нагрузками.

  • Разработка классических приложений на C++.
  • Разработка классического приложения .NET.

Необходимо установить среду Visual Studio со следующими рабочими нагрузками.

  • Разработка классических приложений на C++.
  • Разработка классических приложений .NET или Кроссплатформенная разработка .NET Core в зависимости от того, приложение какого типа вы создаете.

Если вы еще не установили среду Visual Studio, вы можете сделать это бесплатно со страницы скачиваемых материалов Visual Studio.

Если среда Visual Studio уже установлена без необходимых рабочих нагрузок, выберите Открыть Visual Studio Installer в левой области диалогового окна Новый проект Visual Studio. В Visual Studio Installer выберите нужную рабочую нагрузку и щелкните Изменить.

Создание простой собственной библиотеки DLL

Создание файлов для проекта библиотеки DLL:

  1. Откройте Visual Studio и создайте проект.

    Нажмите клавишу ESC, чтобы закрыть окно запуска. Нажмите CTRL+Q, чтобы открыть поле поиска, введите Пустой проект, выберите Шаблоны и затем Пустой проект в C++. В появившемся диалоговом окне выберите Создать. Введите имя, например Mixed_Mode_Debugging, и нажмите кнопку Создать.

    Если шаблон проекта Пустой проект отсутствует, перейдите в меню Средства>Получить средства и компоненты..., после чего запустится Visual Studio Installer. Запускается Visual Studio Installer. Выберите рабочую нагрузку Разработка классических приложений на C++, а затем нажмите Изменить.

    Visual Studio создаст проект.

  2. В обозревателе решений последовательно выберите Исходные файлы, Проект>Добавить новый элемент. Также можно щелкнуть пункт Исходные файлы правой кнопкой мыши и выбрать Добавить>Новый элемент.

    Если вы не видите все шаблоны элементов, выберите "Показать все шаблоны".

  3. В диалоговом окне Новый элемент выберите Файл C++ (.cpp). Введите Mixed_Mode.cpp в поле Имя, после чего нажмите Добавить.

    Visual Studio добавит в обозреватель решений новый файл C++.

  4. Скопируйте следующий код в файл Mixed_Mode.cpp.

    #include "Mixed_Mode.h"
    
  5. В обозревателе решений последовательно выберите Файлы заголовков, Проект>Добавить новый элемент. Также можно щелкнуть пункт Файлы заголовков правой кнопкой мыши и выбрать Добавить>Новый элемент.

    Если вы не видите все шаблоны элементов, выберите "Показать все шаблоны".

  6. В диалоговом окне Новый элемент выберите Файл заголовка (.h). Введите Mixed_Mode.h в поле Имя, после чего нажмите Добавить.

    Visual Studio добавит в обозреватель решений новый файл заголовка.

  7. Скопируйте следующий код в файл Mixed_Mode.h.

    #ifndef MIXED_MODE_MULTIPLY_HPP
    #define MIXED_MODE_MULTIPLY_HPP
    
    extern "C"
    {
      __declspec(dllexport) int __stdcall mixed_mode_multiply(int a, int b) {
        return a * b;
      }
    }
    #endif
    
  8. Выберите Файл>Сохранить все или нажмите клавиши CTRL+SHIFT+S для сохранения файлов.

Настройка и построение проекта библиотеки DLL:

  1. в панели инструментов Visual Studio выберите конфигурацию Отладка и платформу x86 или x64. Если вызовы будут осуществляться из приложения .NET Core, которое всегда выполняется в 64-разрядном режиме, выберите платформу x64.

  2. В обозревателе решений выберите узел проекта Mixed_Mode_Debugging, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.

  3. Убедитесь, что в верхней части области Свойства для параметра Конфигурация установлено значение Активная (отладка), а для параметра Платформа задано значение, выбранное в панели инструментов (x64 или Win32 для платформы x86).

    Важно!

    При смене платформы с x86 на x64 или наоборот необходимо повторно настроить свойства для новой платформы.

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

  5. В разделе Свойства конфигурации выберите Общие, а затем для элемента Тип конфигурации в раскрывающемся списке выберите значение Динамическая библиотека (.dll). Нажмите кнопку Apply (Применить), а затем нажмите кнопку ОК.

    Switch to a native DLL

  6. Выберите проект в обозревателе решений, затем выберите Сборка>Построить решение, после чего нажмите клавишу F7 или щелкните проект правой кнопкой мыши и выберите Сборка.

    Проект должен быть построен без ошибок.

Создание простого управляемого приложения для вызова библиотеки DLL

  1. Откройте Visual Studio и создайте новый проект.

    Нажмите клавишу ESC, чтобы закрыть окно запуска. Нажмите клавиши CTRL+Q, чтобы открыть поле поиска, введите консоль, выберите Шаблоны и выберите Консольное приложение для .NET Core или Консольное приложение (.NET Framework) для C#. В открывшемся диалоговом окне щелкните Создать.

    Затем введите имя, например Mixed_Mode_Calling_App, и щелкните Далее или Создать, в зависимости от того, какой вариант доступен.

    Для .NET Core выберите рекомендуемую целевую платформу или .NET 8, а затем нажмите кнопку "Создать".

    Если нужный шаблон проекта отсутствует, выберите Сервис>Получить средства и компоненты, после чего запустится Visual Studio Installer. Выберите нужную рабочую нагрузку .NET, как описано в предварительных требованиях, и нажмите Изменить.

    Примечание.

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

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

  2. Замените все содержимое файла Program.cs следующим кодом.

    using System;
    using System.Runtime.InteropServices;
    
    namespace Mixed_Mode_Calling_App
    {
        public class Program
        {
            // Replace the file path shown here with the
            // file path on your computer. For .NET Core, the typical (default) path
            // for a 64-bit DLL might look like this:
            // C:\Users\username\source\repos\Mixed_Mode_Debugging\x64\Debug\Mixed_Mode_Debugging.dll
            // Here, we show a typical path for a DLL targeting the **x86** option.
            [DllImport(@"C:\Users\username\source\repos\Mixed_Mode_Debugging\Debug\Mixed_Mode_Debugging.dll", EntryPoint =
            "mixed_mode_multiply", CallingConvention = CallingConvention.StdCall)]
            public static extern int Multiply(int x, int y);
            public static void Main(string[] args)
            {
                int result = Multiply(7, 7);
                Console.WriteLine("The answer is {0}", result);
                Console.ReadKey();
            }
        }
    }
    
  3. В новом коде замените путь к файлу в поле [DllImport] на путь к созданному файлу Mixed_Mode_Debugging.dll. См. подсказки в комментариях к коду. Не забудьте заменить заполнитель username.

  4. Выберите Файл>Сохранить Program.cs или нажмите клавиши CTRL+S для сохранения файла.

Настройка смешанного режима отладки

  1. В обозревателе решений выберите узел проекта Mixed_Mode_Calling_App, после чего щелкните значок Свойства или щелкните узел проекта правой кнопкой мыши и выберите пункт Свойства.

  2. Включите отладку машинного кода в свойствах.

    На левой панели выберите пункт Отладка, затем Открыть пользовательский интерфейс профилей запуска отладки, после чего установите флажок Включить отладку машинного кода и закройте страницу свойств, чтобы сохранить изменения. Enable mixed mode debugging

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

    Enable mixed mode debugging

  3. Если вы нацеливаете библиотеку DLL x64 из приложения .NET Framework, измените параметр целевой платформы Любой ЦП на x64. Для этого может понадобиться выбрать Диспетчер конфигураций в раскрывающемся списке платформы решения панели инструментов "Отладка". После этого, если не получится изменить платформу на x64, создайте новую конфигурацию, нацеленную на x64.

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

  1. В проекте C# откройте файл Program.cs. Задайте точку останова в следующей строке кода. Для этого щелкните в дальнем левом поле, выберите строку и нажмите клавишу F9 либо щелкните строку правой кнопкой мыши и выберите Точка останова>Вставить точку останова.

    int result = Multiply(7, 7);
    

    В месте установки точки останова в левом поле появится красный круг.

  2. Нажмите клавишу F5 и щелкните зеленую стрелку в панели инструментов Visual Studio либо выберите Отладка>Начать отладку, чтобы запустить отладку.

    Отладчик приостановит выполнение в заданной точке останова. Место, в котором приостановлена работа отладчика, будет указано желтой стрелкой.

Шаг с заходом в машинный код и с выходом из него

  1. Если отладка управляемого приложения приостановлена, нажмите клавишу F11 или выберите Отладка>Шаг с заходом.

    Откроется собственный файл заголовка Mixed_Mode.h. Место, в котором приостановлена работа отладчика, будет отмечено желтой стрелкой.

    Step into native code

    Step into native code

  2. Теперь вы можете задавать точки останова и при попадании в них проверять переменные в машинном и управляемом коде.

    • Чтобы просмотреть значение переменной в исходном коде, наведите на нее указатель мыши.

    • Переменные и их значения можно просматривать в окнах Видимые и Локальные.

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

  3. Чтобы перейти в отладчике на одну строку вперед, нажмите клавишу F11 еще раз.

  4. Чтобы продолжить выполнение и снова приостановить работу в управляемом приложении, нажмите клавиши SHIFT+F11 или выберите Отладка>Шаг с выходом.

  5. Чтобы продолжить отладку, нажмите клавишу F5 или щелкните зеленую стрелку.

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

Следующий шаг

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