- Debugging with GDB on Windows using Visual Studio Code
- Краткий гайд по использованию GDB
- Подготовка файлов
- Использование GDB
- windows version of the GDB frontend DDD
- 5 Answers 5
- Not the answer you’re looking for? Browse other questions tagged windows user-interface gdb ddd-debugger or ask your own question.
- Linked
- Related
- Hot Network Questions
- Subscribe to RSS
- Команды GDB, о которых вы возможно не знали
- Что такое GDB
- Интерфейс в консоли (TUI)
- Точки останова
- Шаг с входом в Scope, шаг без входа
- Просмотр переменных разными способами
- Команда display
- Команда explore
- Запись логов работы программы
- Просмотр информации
- Заключение
Debugging with GDB on Windows using Visual Studio Code
Jun 6, 2020 · 4 min read
So you are someone who likes developing in C/C++, and prefers to work on Linux with GCC. For some reason, you need to work on Windows now and you find yourself wondering : ‘Can I compile and debug C/C++ on Windows without using Microsoft’s MSVC compiler, or downloading the clunky Visual Studio ?(Aficionados, please don’t take offence here). And can my build commands and ‘feel’ stay similar to that on Linux?’. Yes! Wonder no more.
So MinGW is the GCC port f or Windows that allows you to build native Windows applications [1]. An installer for MinGW is available here. Bundled with this installation comes GDB, a classic debugger for C/C++ [2]. You can find it at path\\to\\MinGW\\bin\\gdb.exe `. So now you have a C/C++ compiler and a debugger. You compile your target. How do you debug it?
Tangent Note : In order to compile C/C++ code using MinGW and CMake, you need to generate MinGW specific makefiles before using the mingw make utility. Specifying a debug build type using the CMake option is necessary for the debugger to be able to find the breakpoints (no symbol file will be created otherwise).[3]
It is possible to debug with GDB on a terminal using its minimalist GUI [4]. However, using an editor that has built in support for GDB can make your debugging life easier by providing friendly UI for setting breakpoints, and stepping over/into/out-of/etc. [5] functions and loops during the debugging process. Visual Studio is one such fairly light weight and very functional editor that provides good support for GDB. Let’s see how to configure it to debug with GDB.
You can follow the following steps to set up a debugger in your visual studio code :
2. Click on the debugger symbol on the left-side panel. This will prompt you to create a ‘launch.json’. When asked to choose a debugger, choose ‘gdb’.
3. Create a ‘tasks.json’ under the ‘.vscode’ directory at the root of your project and paste the following into it. We will use this file to configure commands to be executed before the debugger is launched.
The “command” field specifies a bat file named “debug_compilation_commands”. These are the commands that will be associated with the “build” label and be used later as tasks that need to be executed before launching the debugger. An example bat file is presented below:
4. Into the launch.json in your ‘.vscode’ directory, paste the following.
5. Edit the “miDebuggerPath” in ‘launch.json’ to point it to the ‘gdb’ bundled with your MinGW installation (refer the previous step for ‘launch.json’). In the snippet above, it’s specified as “C:/MinGW/bin/gdb.exe”
6. Edit the “program” in ‘launch.json’ to point it to the path of the executable that you want to debug (somewhere in your build directory). Note that the “preLaunchTask” specifies “build”. This is the task configured in task.json in step 3.
7. In one of the source files used by the executable you want to debug, place a breakpoint.
8. Click again on the debugger symbol on the left side pane. From the ‘run and debug’ menu, choose gcc.exe debug
9. Now click on the play symbol to start debugging.
If everything went as expected, you will see a debug navigation menu along with a cursor pointing to the line in the file where you set your breakpoint.
If you want to learn more about navigation in the debug process, refer to [5]. If you found this article useful, leave me some claps and comments. Cheers.
Краткий гайд по использованию GDB
В этом коротком туториале мы рассмотрим базовые приёмы работы с GDB, а также посмотрим как можно (и нужно) подготавливать файлы к отладке для GDB.
GDB — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран, Python3, Swift, NASM и Rust.
Почему именно GDB? Всё легко, он уже установлен на многих UNIX-подобных системах, лёгок в использовании и поддерживает много языков. Работа с ним оказывается очень лёгкой, а также его можно подключить к VSCode и другим редакторам кода (Включая Vim, NeoVim (ясное дело), Emacs, Atom и далее)
Подготовка файлов
Для примера мы возьмём файлы .cpp и будем проходиться по ним вдоль и поперёк.
Для того чтобы нам пройтись по такому файлу нам нужно скомпилировать его с помощью G++ с использованием флага -g (это действительно важно, без этого флага, программа не будет корректно работать в GDB).
Python-файл вы можете продебажить с помощью этой команды:
Для Java вы просто можете использовать jdb, который уже идёт в комплекте c JDK.
Также, если вам не хочется компилировать всё ручками, вы можете просто использовать сайт OnlineGDB, там просто нужно вставить код и нажать debug, а затем внизу откроется консоль, где вы сможете писать команды.
Использование GDB
Как только мы зашли в GDB нам выводится следующее сообщение:
Последняя строка говорит о том, нормально ли запустился файл.
Теперь нужно посмотреть, где в нашем файле точка вхождения (строка, откуда наша программа начинает свою работу), в случае cpp это метод main() . Находим номер этой строки c помощью команды list и пишем её порядковый номер с буквой b (также можно просто указать имя функции b main тоже работает):
Далее запускаем программу с помощью комманды r :
Также вы можете включить TUI, с помощью комбинации клавиш
Для того, чтобы посмотреть на какой мы сейчас строке, нужно написать f :
Для того, чтобы сделать шаг, нужно нажать n (от слова next):
Как мы видим GDB сразу пропускает пустые строки (или строки с комментариями) и переходит к следующей строке.
Предположим, что у нас есть функция, при нажатии n наш отладчик быстро пройдет функцию, не заходя в неё, чтобы зайти в функцию нужно сделать «шаг внутрь» (step-in) или просто клавиша s :
(В примере нет функции, однако шаг step-in все равно будет работать и с обычными инициализациями, условиями и циклами)
Чтобы узнать какие переменные (локальные) сейчас инициализированны в программе нужно написать комманду info locals :
Чтобы вывести только одну переменную, нужно написать print имя_переменной :
Мы можем также изменить переменную с помощью set :
Мы можем также следить за переменными с помощью watch :
Также, если нужно можно посмотреть что в данный момент находится в регистрах ( info registers ):
Чтобы посмотреть какие в данный момент есть breakpoints (точки останова) нужно написать info breakpoints :
Чтобы удалить точку останова del breakpoint_num :
Чтобы прыгнуть к следующей точке останова нужно нажать c :
Мы можем вызывать функции из программы (локальные) с помощью call :
Чтобы продолжить выполнение функции и остановить программу когда она (функция) завершится нужно написать finish или fin :
Стоит уточнить, что нельзя использовать finish в главном методе.
Чтобы завершить выполнение программы, нужно написать kill :
Также можно написать help в любой момент и получить краткую справку, как пользоваться отладчиком
windows version of the GDB frontend DDD
Is there a native (not cygwin) version of DDD available for download somewhere?
5 Answers 5
There is also a GDB front-end for MS Visual Studio, called WinGDB. It supports both Cygwin and MinGW. You use it just like built-in debugger in VS. It’s also possible to debug remotely on Linux via SSH.
DDD has not been ported to Windows AFAIK. But there ARE native gdb, which can be perfectly built using MingW32. You can also build Insight natively using Mingw32. You can also give a try to BeaverDbg
Try the Affinic Debugger GUI. It is a native Windows application and is similar to DDD. It uses GDB as the backend.
For a cross-platform gdb frontend, Qt Creator comes to mind. It also does «native» cdb on Windows, but I am not sure that’s what you are looking for.
Since there is no native windows (not cygwin) gdb, there can’t be a native windows (not cygwin) ddd.
Not the answer you’re looking for? Browse other questions tagged windows user-interface gdb ddd-debugger or ask your own question.
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.4.16.39093
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Команды GDB, о которых вы возможно не знали
Отладка кода — это как охота. Охота на баги.
— Amit Kalantri
Что такое GDB
GNU Debugger — переносимый отладчик проекта GNU, который работает на многих UNIX-подобных системах и умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран и Rust. GDB — свободное программное обеспечение, распространяемое по лицензии GPL.
Источник: GNU Debugger — Википедия
Проще говоря GDB — отладчик, который работает прямо из консоли.
В данной статье я опишу команды, о которых раньше не знал, однако, они оказались очень полезными при отладке в GDB.
Рассматривать работу отладчика будем на одной из моих курсовых работ, её тема — шифр Цезаря, так что не нужно удивляться названиям переменных или классов. Самого кода вы тут не увидите, ибо это будет лишним для понимания сути действия, однако стоит привести несколько замечаний для полного понимания:
Объект | Что значит |
---|---|
Caesar::shift | Свойство Caesar |
Caesar::ChangeShift | Метод Caesar |
Caesar::Crypt | Метод Caesar |
Интерфейс в консоли (TUI)
Я всегда включаю TUI, как только зайду в GDB, он позволяет посмотреть где именно находится выполняемая строка, что идёт перед ней, что дальше. Включается TUI в GDB командой tui enable
С помощью колесика мыши (или стрелок) вы можете перемещаться по псевдо-интерфейсу вверху. С помощью комбинации клавиш Ctrl + p (previous), Ctrl + n (next), вы можете перемещаться между введёнными командами в терминале (окно внизу).
Тезис: Для включения псевдо-интерфейса используют команду tui enable , для выключения — tui disable .
Точки останова
Точки останова можно ставить с помощью команды breakpoint (сокращение — b).
Можно ставить точки останова исходя из следующих принципов:
- Точкой останова может являться имя функции (метода) или переменной
- Точкой останова может являться номер строки
- Точкой останова может являться адрес памяти, в котором располагается инструкция
- Точкой останова может являться условие
Если с тремя первыми всё понятно, то четвёртый принцип — достаточно интересный.
b Method if variable == value — примерно такой синтаксис используется для задания точки останова исходя из выполнения условия.
Тут сказано поставить точку останова на методе Crypt() , если свойство класса Caesar под названием shift будет равно 1.
Дополнительно: точки останова можно удалять с помощью команды delete , или её сокращения d .
Тезис: Точки останова можно ставить четыремя способами: с помощью имени объекта, с помощью номера строки, с помощью адреса, с помощью условия.
Шаг с входом в Scope, шаг без входа
Различие между командами next и step (сокращения: n и s) состоит в том, что next выполняет код не входя в Scope (не входя внутрь функции или метода), тогда как step просто выполняет шаг и аналогичен команде Step In в обычных дебагерах.
Дополнительно: для выполнения программы до точки останова используют continue , для выхода из функции в которую вы вошли используют finish или fin .
Тезис: Для вхождения в функцию используется step , для обычного выполнения — next .
Просмотр переменных разными способами
Одной из самых главных частей в процессе отладки является просмотр переменных в разных частях программы. Можно делать это с помощью команды print или p , однако есть и более удобные методы для просмотра переменных.
Команда display
Команда display будет показывать значение переменных каждый раз, когда терминал будет доступен для ввода
Таким образом вы можете просматривать что находится внутри одной переменной или даже целого массива:
Думаю не стоит говорить, что массив может быть динамический и по мере выполнения программы lengthOfArray (длина массива) может изменяться. GDB сам разберётся с этим и всё время будет выводить актуальную информацию.
Команда explore
Иногда бывает такое, что информации до того много, что путаешься какой объект за что отвечает, для этого создали explore .
explore помогает найти что за объект мелькает перед вашими глазами и рассказывает о нём всё, что может
Тезис: Кроме команды print можно использовать команды explore и display .
Запись логов работы программы
Иногда нужно «перемотать вспять» момент, где случилась ошибка, для этого придумана команда record , которая может полностью записывать логи программы в файл или просто в память, дабы перемотать некоторые моменты вспять или посмотреть что именно вызвало ошибку
Для того, чтобы остановить запись и удалить все логи — нужно ввести record stop , для того, чтобы сохранить все логи в файл нужно ввести record save .
Тезис: GDB имеет возможность создать лог работы программы, с помощью которого, мы можем перемещаться по программе вспять.
Просмотр информации
Просмотреть сразу все локальные переменные можно с помощью info local :
Просмотреть все переменные, которые инициализированы можно с помощью info variables :
Чтобы посмотреть все точки останова можно ввести info b :
Вы также можете посмотреть тип переменной с помощью команды whatis :
Чтобы посмотреть адрес функции, вы можете использовать info address :
Заключение
Есть ещё куча команд, которые я не привёл в данной статье, однако, на мой взгляд они являются столь полезными, как те, что я перечислил выше. Вы можете почитать больше о разработке на Linux в моём телеграм-канале, если вам это нужно. Я периодически пишу о фулл-стак разработке, а также о Unix-подобных системах.
В данной статье не указаны некоторые команды, которые легки для понимания, например: run, stop, quit, и т.д. Не указал я их специально, так как статья пытается нести информацию, о которой пользователи GDB возможно могли не знать. Если у вас есть предложения чем можно дополнить статью, с радостью почитаю комментарии.