Ответ 1
Начиная с GDB 7.4, skip
можно использовать.
Запустите info skip
или ознакомьтесь с руководством для получения дополнительной информации: https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html
У меня есть код на С++, подобный этому, который я выполняю с помощью GDB:
void foo(int num) { ... }
void main() {
Baz baz;
foo (baz.get());
}
Когда я нахожусь в main()
, я хочу войти в foo()
, но я хочу сделать шаг над baz.get()
.
GDB docs говорят, что "команда step только входит в функцию, если есть информация о номере строки для функции", поэтому я был бы рад, если бы смог удалить информацию о номере линии для baz.get()
из моего исполняемого файла. Но в идеале я мог бы сказать GDB "никогда не вступать ни в какую функцию в классе Baz".
Кто-нибудь знает, как это сделать?
Начиная с GDB 7.4, skip
можно использовать.
Запустите info skip
или ознакомьтесь с руководством для получения дополнительной информации: https://sourceware.org/gdb/onlinedocs/gdb/Skipping-Over-Functions-and-Files.html
Вместо того, чтобы выбирать "шаг", вы можете использовать команду "до", чтобы обычно вести себя так, как вы хотите:
(gdb) until foo
Я не знаю, как можно окончательно настроить gdb, чтобы пропустить определенные символы (кроме того, что они отбрасывают информацию об их отладке).
Изменить: на самом деле документация GDB гласит, что вы не можете использовать до тех пор, пока не перейдете к местоположениям, которые не находятся в одном фрейме. Я не думаю, что это правда, но в том случае, если это так, вы можете использовать продвижение с той же целью:
(gdb) advance foo
Страница 85 руководства GDB определяет, что можно использовать в качестве аргументов "location" для команд, которые их принимают. Просто поместите "foo", чтобы он искал функцию с именем foo, поэтому, пока она может ее найти, вы должны быть в порядке. В качестве альтернативы вы застряли, набирая такие вещи, как имя файла: linenum for foo, и в этом случае вам может быть лучше настроить точку останова на foo и использовать для продолжения переход к ней.
(Я думаю, что это лучше всего подходит для комментариев, а не для ответа, но у меня нет достаточной репутации, чтобы добавить комментарий еще.)
Таким образом, я также хотел игнорировать файлы STL, Boost и др. (коллективно "3rd Party" ) при отладке на некоторое время. Вчера я наконец решил искать решение, и кажется, что ближайшей возможностью является команда "skip" в GDB.
Я обнаружил, что способность "пропуска" в GDB полезна, но для меня это все еще неприятно, потому что моя программа использует много STL и другого кода шаблона "третьей стороны". В этом случае я должен отметить кучу файлов как пропуск. После второго раза я понял, что было бы более полезно пропустить весь каталог - и наиболее полезно пропустить каталог и все подкаталоги. Таким образом, я могу пропустить, например, /usr, поскольку ни один из моих кодов не живет там, и я обычно не заинтересован в отладке через сторонний код. Поэтому я расширил команду "skip" в gdb для поддержки нового типа "dir". Теперь я могу сделать это в gdb:
skip dir /usr
а затем я никогда не останавливаюсь ни в одном из моих сторонних заголовков.
Вот веб-страница с этой информацией + патч, если она кому-то помогает: информация и патч для пропуска каталогов в GDB
Похоже, что это невозможно в GDB. Я подал bug.
Между тем, gdb имеет команду skip function
. Просто выполняйте его, когда вы находитесь внутри неинтересной функции, и он больше не беспокоит вас.
skip file
также очень полезно избавиться от внутренних элементов STL.
Как сказал Джастин, он был добавлен в gdb 7.4. Подробнее см. В документации.