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

Использование gdb останавливает программу, когда она использует любую функцию из файла X

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

GDB Stop when use a function from file foo.cpp

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

Спасибо

4b9b3361

Ответ 1

Шаг 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 script, который установит точку прерывания для каждой из вышеперечисленных функций:

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 man-страница говорит, что это еще не реализовано.

Ответ 2

rbreak regex

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

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

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

Ответ 3

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

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

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

Ответ 4

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

break foo.cpp:function-name

Ответ 5

rbreak foo.cpp:.

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

Ответ 6

gdb точки останова имеют пару синтаксисов... Смотрите здесь.

Он не будет разбивать какую-либо функцию в файле, хотя....

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