Использование GDB остановить программу, когда она использует любую функцию из файла X - PullRequest
19 голосов
/ 24 января 2009

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

GDB Stop when use a function from file foo.cpp

Причина этого заключается в том, что я отлаживаю код, который мне не принадлежит, и я не знаю точно, какие функции были вызваны, а какие нет. Есть ли в GDB функция, которая делает то, что я ищу, или какой-либо другой рекомендуемый способ сделать что-то подобное?.

Спасибо

Ответы [ 6 ]

22 голосов
/ 25 января 2009

Шаг 1: создайте список всех функций, определенных в foo.cpp
Самый простой способ, который я могу придумать (при условии, что у вас есть binutils и GNU grep):

nm a.out | grep ' T ' | addr2line  -fe a.out |
  grep -B1 'foo\.cpp' | grep -v 'foo\.cpp' > funclist

Шаг 2: создайте скрипт GDB, который установит точку останова для каждой из вышеуказанных функций:

sed 's/^/break /' funclist > stop-in-foo.gdb

[Очевидно, шаги 1 и 2 могут быть объединены; -]

Шаг 3: фактически установите точки останова:

gdb a.out
(gdb) source stop-in-foo.gdb

Глядя на этот ответ, еще более простой (если вы используете Fedora Linux) способ узнать, какие функции foo.cpp вызываются:

ftrace -sym='foo.cpp#*' ./a.out

Очень жаль ftrace Страница руководства говорит, что это еще не реализовано.

12 голосов
/ 29 июля 2010

rbreak regex

Установить точки останова для всех функций, соответствующих регулярному выражению регулярного выражения. Эта команда устанавливает безусловную точку останова для всех совпадений, печатая список всех установленных точек останова. Как только эти точки останова установлены, они обрабатываются так же, как точки останова, установленные командой break. Вы можете удалить их, отключить или сделать их условными так же, как и любые другие точки останова.

Синтаксис регулярного выражения - это стандартный синтаксис, используемый с такими инструментами, как `grep '. Обратите внимание, что это отличается от синтаксиса, используемого оболочками, поэтому, например, foo * соответствует всем функциям, которые включают fo, за которым следует ноль или более os. Существует неявный. * Ведущий и завершающий заданное вами регулярное выражение, поэтому для сопоставления только функций, начинающихся с foo, используйте ^ foo.

При отладке программ на C ++ rbreak полезен для установки точек останова на перегруженных функциях, которые не являются членами каких-либо специальных классов.

5 голосов

rbreak foo.cpp:.

Здесь . соответствует чему-либо, и поэтому нарушает все функции файла foo.cpp.

2 голосов
/ 25 января 2009

Ответ занятого русского выглядит очень хорошо, но так как вы говорите:

Я не знаю точно, какие функции были вызваны и какие функции нет.

Будет ли отчет о том, какие функции выполнены, с помощью инструмента покрытия кода, такого как gcov или чего-то, связанного с Valgrind , хорошим решением вашей проблемы?

1 голос
/ 25 января 2009

Вы можете использовать команду:

break foo.cpp:function-name
0 голосов
/ 24 января 2009

Точки останова GDB имеют пару синтаксисов ... См. Здесь.

Это не сломает ни одну функцию в файле, хотя ....

Редактировать: Вы можете сделать что-то глупое, например, заставить все функции вызывать фиктивную функцию void foo (void) и точку останова внутри. По крайней мере, вы бы разбили файл, и должны быть тривиальны, чтобы найти, какая функция в стороне файла X вызывается.

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