Как настроить пользовательские точки останова в программе C ++? - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над проектом, в котором я не могу раскрыть детали кода.Итак, все приложение написано на C и C ++.Поскольку определенный файл, который требуется отладить, имеет много зависимостей и экспортов, мне нужно отладить весь проект.Как установить точки останова в самом коде, чтобы отладка остановилась именно в этой точке?Я использую Ubuntu 14.04 (поскольку проект совместим с этой средой) и отладчик GDB.

Я пытался использовать

#include <csignal>

// Generate an interrupt
std::raise(SIGINT);

Но я получаю сообщение об ошибке

error: ‘raise’ is not a member of ‘std’

Даже это тоже не сработало

#include <signal.h>
raise(SIGINT);

Плюс отладка не остановится в этой точке, так что я мог предвидеть функцию в этой точке.Я хочу отлаживать его только с консоли, а не с помощью какой-либо IDE.

Так как файл программы, который я хочу отлаживать, имеет много заголовочных файлов, которые он импортирует, я не могу сделать исполняемый файл для использования gdb.Таким образом, в то время как make clean build моего MakeFile я хочу отлаживать определенный программный файл в определенной функции.Итак, для этого я хочу добавить точки останова в программе.Я не могу использовать любой графический интерфейс для отладки, так как я не должен использовать.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Вы пытались использовать команды GDB?b lineno - set a break point at line 'lineno' b srcfile:lineno - set a break point in source file 'srcfile' at line 'lineno'

0 голосов
/ 17 октября 2018

Сначала убедитесь, что вы скомпилировали с -g.В gcc есть и другие специфичные для GDB флаги.Вы можете добавить их тоже.

Попробуйте использовать ddd, графическую версию gdb.Отличный инструмент, если вы не знаете командную строку GDB.Просто откройте соответствующий исходный файл, выберите строку и нажмите на точку останова на панели инструментов.Он сообщит вам в разделе консоли, какая команда была фактически выполнена (хороший способ узнать).Имеется плавающий список кнопок с параметрами run, next и т. Д. Для пошагового выполнения вашего кода.

ddd будет работать на большинстве цепочек инструментов gcc.

EDIT: Скажите, что выКод состоит из 2 файлов: main.cpp и child.cpp.main.cpp содержит main ().Исполняемый файл называется a.out.

Для запуска

ddd a.out &

Он откроется в main.cpp.Чтобы поместить точку останова в child.cpp, нажмите File / Open Source ... и выберите child.cpp.Затем выделите место, где вы хотите установить точку останова.Поместите курсор на линию, затем нажмите на панели инструментов разрыв.

Чтобы запустить, введите run в окне gdb ниже или нажмите Run в диалоговом окне с плавающей кнопкой.

0 голосов
/ 17 октября 2018

Подробнее о отладке с gdb.Обязательно скомпилируйте весь ваш код с DWARF отладочной информацией (поэтому используйте g++ -Wall -Wextra -g для компиляции с GCC ).

GDB extensible и вы можете определить свои gdb команды при запуске в вашем файле инициализации, возможно .gdbinit и поместить туда некоторые начальные команды.

Кстати, в Linux для отладки (то есть отладчик gdb) используются средства ptrace (2) .И вы можете использовать gdb неинтерактивно в командной строке, используя скрипты.

Как установить точки останова в самом коде

Я не рекомендуюдобавление специального кода C для точек останова.Так что не делайте этого в вашем C-коде.Но см. Также this .

Возможно, вам нужна библиотека обратной трассировки, например, libbacktrace * Ian Taylor ?

Я не могу использовать любой графический интерфейс дляотладка

Вам не нужно.Вы будете использовать gdb в командной строке. С помощью соответствующего gdb сценария вы можете даже использовать его неинтерактивно (например, в Makefile)

Я только хочу отладить его с консоли, а не с помощью любой IDE.

Пожалуйста, поймите, что IDE s только прославили Редактор исходного кода s способензапуск других внешних инструментов (включая компилятор GCC и отладчик gdb).Вам, разумеется, в Linux не требуется какая-либо IDE для запуска компилятора или отладчика (но IDE могут быть удобными , но не обязательными , для этого), потому что вы можете (и должен) запустить ваш компилятор, ваш отладчик, ваш инструмент автоматизации сборки в командной строке.

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

Вы должны сначала это исправить.Вам нужно сделать исполняемый файл .Кстати, «импорт» не задействован во время выполнения, поскольку заголовочные файлы актуальны только во время компиляции.Узнайте больше о препроцессоре cpp .Вам, вероятно, следует вызвать GCC (например, компилятор g++, поскольку у вас есть код C ++) с соответствующими параметрами препроцессора (иногда такие инструменты, как pkg-configполезно для этого).Вы, вероятно, должны использовать некоторые средства автоматизации сборки , такие как GNU make ( с ваш Makefile; см. this для вдохновения) или ниндзя .Вы можете добавить специальные команды gdb в вашу процедуру сборки (например, с некоторыми дополнительными и конкретными правилами и / или рецептами в вашей Makefile).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...