gdb rbreak和命令(或dprintf行为)?

时间:2019-01-05 01:50:58

标签: gdb

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允许您设置一个命令有多个断点?


编辑:刚发现List of all function calls made in an application-record function-call-history /ilc可能很有趣,但是似乎没有一种方法可以限制要跟踪的函数的范围,例如使用正则表达式... < / p>

1 个答案:

答案 0 :(得分:1)

好吧,通过上面的链接,找到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

...这似乎很好用;但是如果还有其他选择,我很想知道它们。