gdb rbreak и команды (или поведение dprintf)? - PullRequest
0 голосов
/ 05 января 2019

Взяв пример из 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 может быть интересным, но, похоже, нет способа ограничить объем функций для отслеживания, скажем с регулярным выражением ...

1 Ответ

0 голосов
/ 05 января 2019

Хорошо, по ссылке выше, найдено https://stackoverflow.com/a/39124320/277826 - получается, вы можете выдать command для нескольких точек останова, как найдено rbreak; и чтобы напечатать название функции, просто используйте backtrace 1:

(gdb) command 1-36
Type commands for breakpoint(s) 1-36, one per line.
End with a line saying just "end".
>silent
>bt 1
>continue
>end
(gdb) r

... или с python, печатая фрейм в bt 0 и имя фрейма его родителя:

command 1-36
silent
python print("{} <- {}".format( gdb.execute("bt 0", False, True).strip(), gdb.newest_frame().older().name() ))
continue
end

... или, что еще лучше, печать на python bt 0 имя функции и аргументы, а также имя родителя:

command 1-36
silent
python nf = gdb.newest_frame(); nfb = nf.block()
python nfargs = [ "{}={}".format(sym, nf.read_var(sym, nfb)) for sym in nfb if sym.is_argument ]
python print("#0 {}({}) <- {}".format(nf.name(), ",".join(nfargs), nf.older().name() ))
continue
end

... который будет печатать что-то вроде:

#0 Searcher::FlagFromCmd(this=0x7fffffffaed8,cmd=808) <- FindLiveStrip::GrabToggles
#0 Searcher::FlagFromCmd(this=0x7fffffffaed8,cmd=807) <- FindLiveStrip::ToggleChanged

... и это, кажется, работает нормально; хотя, если есть другие варианты, я хотел бы знать о них.

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