GDB 跟踪点的操作不起作用

gdb tracepoint's action does not work

本文关键字:操作 不起作用 跟踪 GDB      更新时间:2023-10-16

可以跟踪跟踪点,但跟踪操作不能正常工作。在gdb的最后,下面显示了跟踪点被跟踪。但"收取$regs"并没有如预期的那样起作用。

我的平台是RH6.4

1.gdbserver侧。

gdbserver :10000 ./a.out
Process ./a.out created; pid = 10466
Listening on port 10000
Remote debugging from host 127.0.0.1

2.gdb侧。

gdb a.out
(gdb) target remote :10000
Remote debugging using :10000
Reading symbols from /lib64/ld-linux-x86-64.so.2...(no debugging symbols found)...done. 
Loaded symbols for /lib64/ld-linux-x86-64.so.2
0x00000033b7000b00 in _start () from /lib64/ld-linux-x86-64.so.2
Created trace state variable $trace_timestamp for target's variable 1.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.107.el6.x86_64

(gdb) trace main
Tracepoint 1 at 0x400541: file a.c, line 12.
(gdb) actions 1
collect $regs
end
(gdb) tstart
(gdb) break 15
Breakpoint 2 at 0x40055f: file a.c, line 15.
Breakpoint 2, main (argc=1, argv=0x7fffca819f08) at a.c:18
18              sleep (1);
(gdb) cont
Continuing.
(gdb) tstop
(gdb) tfind
Found trace frame 0, tracepoint 1
12          c    = 2;

我想您希望跟踪点在源文件的实际main声明行中,我错了吗?

重要的是,它被放在函数的入口点,实际上,这是第一个函数的代码行,根据您提供的信息,它应该是c = 2;

另一方面,这只是一个愚蠢的细节,请注意,您在第15行没有代码,并且在第18行设置了断点。

编辑:

根据您的评论,您希望tfind转储所有收集的寄存器,但您需要额外的步骤:通过在没有参数的情况下使用tfind,您选择了下一个跟踪点(本例中为第一个),并且,要转储此跟踪点的操作收集信息,您应该调用tdump