Начало: «
С++ в Windows 10, VS Code: кодировка консоли при отладке».
Описание проблемы
При изучении языка программирования C++ по сайту-учебнику «
LearnCpp.com» я пишу маленькие учебные программы, которые предназначены для работы в консоли. В рамках учебы по этому учебнику предполагается, что создаваемый исходный код является кроссплатформенным (может быть без проблем скомпилирован в исполняемый файл на разных операционных системах).
Исходный код я храню в кодировке UTF-8. Для вывода текста в консоль я использую «узкие» символы типа char через std::cout. Я вывожу тексты с буквами английского и русского алфавитов, китайских иероглифов, эмодзи и так далее.
Я работаю на компьютере под управлением операционной системы «Windows 10», а также работаю с операционной системой «Ubuntu» (один из дистрибутивов «Linux») из «Windows 10» через подсистему «WSL 2». Я отказался от использования функций Windows API для переключения кодовой страницы в консоли, так как этот же исходный код использую и для компиляции в операционной системе «Ubuntu» (в ней функции Windows API недоступны).
Переключение кодовой страницы в операционной системе «Windows 10» при работе с программами в консоли я произвожу вручную (команда chcp 65001) в программе-оболочке «cmd.exe» и через
профиль в программе-оболочке «PowerShell». В операционной системе «Ubuntu» переключение кодовой страницы не требуется, там по умолчанию в консоли (я использую программу-оболочку «bash») используется кодировка UTF-8.
Вроде всё в порядке, однако, есть проблема при отладке. Для написания исходного кода и отладки программ я использую редактор кода «VS Code» и/или интегрированную среду разработки «Visual Studio Community 2022». При запуске отладки (отладку я произвожу в операционной системе «Windows 10») эти инструменты запускают свои собственные экземпляры программ-оболочек, и сразу непонятно, как в этих экземплярах программ-оболочек переключить кодовую страницу на нужную (инструменты разработки не дают возможности ввести в открываемые экземпляры программ-оболочек какие-либо предварительные команды).
В редакторе кода «VS Code» я смог решить эту проблему (см. мой
предыдущий пост по этой теме). А вот в среде «Visual Studio» долго не мог справиться с этой проблемой. Написал вопрос на веб-сервисе «Stack Overflow» и там мне через некоторое время смогли подсказать рабочий способ решения:
https://stackoverflow.com/questions/76655155/how-do-i-configure-debugging-of-console-programs-in-c-in-the-visual-studio-20 Способ решения проблемы
Казалось бы, если редактор кода «VS Code» (Visual Studio Code) изначально вобрал в себя некоторые важные элементы среды «Visual Studio» (поэтому у них похожие названия), то его разработка должна несколько отставать от его «родителя» (на самом деле, эти инструменты построены по совершенно разным принципам и существуют для разных целевых аудиторий). Но на деле выходит, что в некоторых вещах редактор «VS Code» опережает своего массивного «коллегу».
Например, в редакторе «VS Code» можно настроить вывод в консоль при отладке минимум тремя разными способами (я описывал их подробно по ссылке, приведенной в начале данного поста): во внешнюю консоль (в отдельном окне) с программой-оболочкой «cmd.exe», во внутренний терминал во вкладку с программой-оболочкой «PowerShell» и во внутренний терминал во вкладку консоли отладки. В среде «Visual Studio Community 2022», насколько я понимаю, по умолчанию есть только один способ: во внешнюю консоль (в отдельном окне) с программой-оболочкой «cmd.exe».
1. Установка расширения
По подсказке из вышеприведенного вопроса на веб-сервисе «Stack Overflow» я установил для среды «Visual Studio Community 2022» расширение «
Microsoft Child Process Debugging Power Tool 2022».
Для установки расширения можно использовать пункт главного меню «Расширения - Управление расширениями». В открывшемся окне «Управление расширениями» слева находятся названия списков расширений: «Установленные», «В сети», «Обновления» и так далее. В центре окна выводятся расширения из выбранного слева списка. В правой части окна выводится информация по выбранному расширению. Я выбрал список «В сети», после чего отобразился список расширений, доступных для загрузки из хранилища в интернете. В правом верхнем углу окна есть поле поиска, в которое я ввел название нужного расширения. В результате поиска нужное расширение нашлось и я нажал на кнопку «Скачать» около названия расширения в списке.
Загрузка расширения и его установка не начинаются сразу, а ставятся в план, который будет запущен при закрытии окна среды «Visual Studio Community 2022». Я закрыл окно среды и загрузка запустилась. После загрузки расширение установилось и я снова запустил среду.
2. Настройка расширения
После повторного запуска среды я открыл окно «Управление расширениями» и проверил, что установленное расширение оказалось в списке «Установленные». Рядом с названием расширения появились кнопки «Отключить» и «Удалить». Сразу после установки расширение уже включено, но с помощью этих кнопок вы его можете либо временно отключить, либо вообще удалить. Очевидно, что для работы с расширением оно должно быть включенным.
Для настройки данного расширения следует выбрать пункт главного меню «Отладка - Другие целевые объекты отладки - Child Process Debugging Settings...». Окно с настройками расширения откроется не отдельным окном, а в виде вкладки в области, в которой открываются файлы проекта для редактирования. Вот как эта вкладка выглядит у меня:
В этой вкладке я только установил флажок «Enable child process debugging» над таблицей и нажал на кнопку «Save» справа над таблицей. После этого я закрыл эту вкладку.
3. Как производить отладку с этим расширением
(3.1) Сначала следует в среде «Visual Studio Community 2022» открыть нужный файл с исходным кодом и установить хотя бы одну точку останова (это можно сделать, установив курсор на нужную строку и нажав клавишу «F9»).
Следует иметь в виду, что при описываемом способе отладки вывод программы в консоль будем производить не стандартным для среды «Visual Studio Community 2022» образом, а в выбранное нами предварительно открытое окно консоли с программой-оболочкой «cmd.exe». Можно использовать обычное окно программы-«эмулятора терминала» «Windows Console», но я предпочитаю использовать программу-«эмулятор терминала» «Windows Terminal».
(3.2) Итак, я запустил программу-«эмулятор терминала» «Windows Terminal» и в ней открыл вкладку с программой-оболочкой «cmd.exe». Для меня это не является каким-то дополнительным действием, я обычно и так всегда это проделываю перед началом работы над проектом. В программе-оболочке «cmd.exe» я выполнил команду chcp 65001, тем самым включив кодовую страницу 65001 (кодировка UTF-8).
(3.3) Теперь в среде «Visual Studio Community 2022» следует выбрать пункт главного меню «Отладка - Присоединиться к процессу...» (Ctrl+Alt+P). В открывшемся окне «Присоединение к процессу» в таблице следует найти и выбрать нужный процесс. После выбора я нажал на кнопку «Присоединиться» в правом нижнем углу окна. Вот как этот выбор выглядит у меня:
(3.4) В окне программы-оболочки «cmd.exe» следует запустить отладочную версию исполняемого файла, которая должна находиться в соответствующей подпапке папки проекта. В моем случае это следующий исполняемый файл:
C:\Users\Илья\source\repos\Project1\x64\Debug\Project1.exe
После этого в окне среды «Visual Studio Community 2022» начнется пошаговая отладка и выполнение программы остановится на заданной ранее точке останова. Далее отладку можно производить так же, как и обычно, только вывод программы теперь при отладке направляется в выбранное и предварительно настроенное нами для работы с кодировкой UTF-8 нужное окно.
Вот как это выглядит у меня:
На первый взгляд немного сложновато, конечно. Но быстро привыкаешь. Надеюсь, разработчики среды «Visual Studio Community 2022» в будущем как-то улучшат удобство отладки. Впрочем, я для отладки учебных программ собираюсь в основном использовать редактор «VS Code».
(3.5) После завершения отладки для отключения от процесса следует нажать на кнопку «Остановить отладку» на панели инструментов среды, либо сделать то же самое с помощью сочетания клавиш «Shift+F5».
Если понадобится еще раз запустить отладку, то к процессу «cmd.exe» (если вы еще не закрыли окно с этой программой-оболочкой) можно быстро переподключиться с помощью пункта главного меню «Отладка - Повторно подключиться к процессу» (Shift+Alt+P).