Взяв пример из http://shanekirk.com/2017/08/gdb-tips-and-tricks-2-setting-breakpoints-with-regular-expressions/ - когда я использую rbreak
, я получаю что-то вроде:
(gdb) rb TestFixture.h:.
Breakpoint 1 at 0x4008b6: file TestFixture.h, line 5.
void TestFixture::setUp();
Breakpoint 2 at 0x4008d4: file TestFixture.h, line 6.
void TestFixture::tearDown();
Breakpoint 3 at 0x4008f2: file TestFixture.h, line 7.
void TestFixture::testA();
Breakpoint 4 at 0x400910: file TestFixture.h, line 8.
void TestFixture::testB();
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004008b6 in TestFixture::setUp() at TestFixture.h:5
2 breakpoint keep y 0x00000000004008d4 in TestFixture::tearDown() at TestFixture.h:6
3 breakpoint keep y 0x00000000004008f2 in TestFixture::testA() at TestFixture.h:7
4 breakpoint keep y 0x0000000000400910 in TestFixture::testB() at TestFixture.h:8
Теперь мне нужно поведение, похожее на dprintf
: как только одна из этих точек останова нажата, я просто хочу напечатать имя функции, а затем continue
(в основном, трассировка вызова функции)
Однако, как я понимаю gdb
- чтобы сделать это, я сначала должен выдать rbreak [regex]
, затем получить кучу точек останова, затем для каждого из этих Мне пришлось бы печатать вручную:
commands [number-of-breakpoint]
print "[name of function]"
continue
end
... который быстро превращается в рутину, особенно если у вас гораздо больше точек останова, чем 4 в приведенном выше примере (скажем, сотни).
Теперь было бы неплохо, если бы я мог использовать что-то вроде "regex dprintf" или rdprintf
, например:
rdprintf TestFixture.h:., "%s\n", $__breakname__
... но, насколько я знаю, такой команды не существует ...
Или, если после выдачи rbreak TestFixture.h:.
, я мог бы нацелиться на commands
для этих контрольных точек как:
commands 1-4
print $__breakname__
continue
end
... но опять же, я думаю, этого тоже не существует ...
Итак, есть ли способ использовать gdb
для предоставления такого рода распечатки трассировки вызовов функций - без необходимости вручную вводить имена точек останова и их команды, аналогично тому, как rbreak
позволяет вам устанавливать несколько точек останова с помощью одной команда?
РЕДАКТИРОВАТЬ: только что найдено Список всех вызовов функций, выполненных в приложении - record function-call-history /ilc
может быть интересным, но, похоже, нет способа ограничить объем функций для отслеживания, скажем с регулярным выражением ...