Подтвердить что ты не робот

Предотвращение перехода GDB на функцию (или файл)

У меня есть код на С++, подобный этому, который я выполняю с помощью GDB:

void foo(int num) { ... }

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

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

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

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

4b9b3361

Ответ 2

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

(gdb) until foo

Я не знаю, как можно окончательно настроить gdb, чтобы пропустить определенные символы (кроме того, что они отбрасывают информацию об их отладке).

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

(gdb) advance foo

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

Ответ 3

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

Таким образом, я также хотел игнорировать файлы STL, Boost и др. (коллективно "3rd Party" ) при отладке на некоторое время. Вчера я наконец решил искать решение, и кажется, что ближайшей возможностью является команда "skip" в GDB.

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

skip dir /usr

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

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

Ответ 4

Похоже, что это невозможно в GDB. Я подал bug.

Ответ 5

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

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

Как сказал Джастин, он был добавлен в gdb 7.4. Подробнее см. В документации.