Как отключить степпинг в шаблоне C ++ при прохождении кода с помощью GDB? - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь пройтись по коду, используя GDB, и GDB всегда пытается показать исходный код шаблонов C ++, что делает отладку неудобной и тратит впустую много моего времени.

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

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

Можно ли отключить шаг в шаблон во время отладки с помощью GDB? Когда я перехожу на экс. make_unique функция, я ожидаю, что GDB не будет пытаться показать make_unique реализацию. Любое предложение?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2019

Можно использовать команду next для перехода по вызову функции или finish для выхода из функции.

Другой способ - использовать команду skip или skip file. Это заставляет GDB всегда пропускать ненужные функции или исходные файлы, даже если используется команда step.

Однако это не всегда то, что нужно. Например, при отладке функции сравнения, используемой в std::sort, нужно сразу перейти к функции сравнения, пропустив все реализации std::sort. Или кто-то хочет войти в конструктор, пропустив реализацию std::make_unique.

К сожалению, это невозможно с GDB (без установки точки останова). При пропуске функции или файла GDB также пропускает все, что называется из этой функции или файла.

Другой известный отладчик обладает желаемой функциональностью, известной как Just My Code , но он доступен только для Windows.

По какой-то причине функция «пропустить файл» в GDB иногда рекламируется как «Просто мой код». Это не так.

0 голосов
/ 04 октября 2019

skip - это то, что вы хотите. Вы можете пропустить функции или файлы.

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

В любой момент вы также можете использовать skip function_name или skip filename и нажимать TAB после того, как несколько символов заставят GDB завершить для вас имя.

Также возможно указывать имена функций или имен файлов, используя регулярные выражения или шаблон файла глобуса, соответственно.

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

# Skip the Catch library functions  when stepping into
skip -rfu Catch
skip -rfu _catch_sr

# Skip everything from the std namespace
skip -rfu ^std::
skip -rfu ^gsl::
# Skip everything in SFML workspace
skip -rfu ^sf::
skip -rfu ^arma::
skip -rfu ^Glue

С регулярными выражениями это означает, что gdb пропустит что-либо в пространстве имен std также из нескольких других библиотек, которые я регулярно использую,например, catch , armadillo и т. д.

Для шаблона glob вы можете сделать что-нибудь, например

skip -gfile /usr/include/c++/9.1.0/bits/*

К сожалению, шаблон globпохоже, не обрабатывает что-то типа «любой файл в любой подпапке какой-либо папки». Было бы очень полезно, если бы gdb разрешал что-то, например,

skip -gfile /home/myuser/.conan/**/*

, например, пропустить любой файл в подпапке из папки .conan. В эту папку менеджер пакетов conan устанавливает библиотеки. Тогда с помощью одной команды skip gdb не сможет войти в любой код внешней библиотеки.

...