Предотвращение перехода GDB в функцию (или файл) - PullRequest
24 голосов
/ 15 июля 2009

У меня есть некоторый C ++-код, подобный этому, через который я прохожу с GDB:

void foo(int num) { ... }

void main() {
  Baz baz;
  foo (baz.get());
}

Когда я нахожусь в main(), я хочу перейти на foo(), но я хочу на пройти baz.get().

В документах GDB говорится, что "команда шага входит в функцию только при наличии информации о номере строки для функции", поэтому я был бы рад, если бы мог удалить информацию о номере строки для baz.get() из моего исполняемого файла. Но в идеале я мог бы сказать GDB «никогда не входить ни в какую функцию в классе Baz».

Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

20 голосов
/ 20 ноября 2011

Начиная с GDB 7.4, можно использовать skip.

Запустите info skip или ознакомьтесь с руководством для получения подробной информации: https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html

12 голосов
/ 15 июля 2009

Вместо того, чтобы выбирать «шаг», вы можете использовать команду «до», чтобы обычно вести себя так, как вы хотите:

(gdb) until foo

Я не знаю способа постоянной настройки GDB для пропуска определенных символов (кроме исключения их отладочной информации).

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

(gdb) advance foo

Страница 85 руководства GDB определяет, что можно использовать в качестве аргументов "location" для команд, которые их принимают. Простое введение «foo» заставит его искать функцию с именем foo, поэтому, пока она может ее найти, все будет в порядке. Или же вы застряли, набрав такие вещи, как имя файла: linenum для foo, в этом случае вам может быть лучше установить точку останова на foo и использовать продолжить, чтобы перейти к ней.

2 голосов
/ 25 июля 2015

(я думаю, что это лучше подходит как комментарий, а не как ответ, но у меня пока недостаточно репутации, чтобы добавить комментарий.)

Так что я также хотел игнорировать файлы STL, Boost и др. (Совместно именуемые «Сторонние») при некоторой отладке. Вчера я наконец решил найти решение, и, похоже, ближайшая возможность - это команда «пропустить» в GDB.

Мне показалось, что возможность «пропустить» в GDB полезна, но для меня это все еще неприятно, потому что моя программа использует много STL и другого кода шаблона «третьей стороны». В этом случае я должен пометить кучу файлов как пропущенные. После второго раза я понял, что было бы более полезно иметь возможность пропустить весь каталог - и наиболее полезно пропустить каталог и все подкаталоги. Таким образом, я могу пропустить, например, / usr, так как там нет моего кода, и я, как правило, не заинтересован в отладке через сторонний код. Поэтому я расширил команду 'skip' в gdb для поддержки нового типа 'dir'. Теперь я могу сделать это в GDB:

skip dir /usr

и тогда я никогда не останавливаюсь ни в одном из моих сторонних заголовков.

Вот веб-страница с этой информацией + патч, если он кому-нибудь поможет: Информация и патч для пропуска каталогов в GDB

1 голос
/ 28 июля 2013

Между тем, GDB имеет команду skip function. Просто выполните его, когда вы находитесь внутри неинтересной функции, и она вас больше не побеспокоит.

skip file также очень полезно, чтобы избавиться от внутренних органов STL.

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

1 голос
/ 26 декабря 2009

Похоже, что это невозможно в GDB. Я подал ошибку .

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