我已成功在远程调试会话中使用 GDB 跟踪点获取跟踪,如 this 和 this other 问题中所述。我能够正确地看到框架,以及参数、局部变量等。然后,我将跟踪导出到跟踪文件(
tsave
命令)以进行进一步的离线分析,如下所示:
gdb -q trace_test
Reading symbols from trace_test...
(gdb) target remote :1234
(gdb) trace 3
Tracepoint 1 at 0x555555555157: file /home/juangburgos/Documents/REPOS/trace_test/main.cpp, line 3.
(gdb) trace 8
Tracepoint 2 at 0x555555555184: file /home/juangburgos/Documents/REPOS/trace_test/main.cpp, line 8.
(gdb) b 9
Breakpoint 3 at 0x55555555519a: file /home/juangburgos/Documents/REPOS/trace_test/main.cpp, line 9.
(gdb) actions 1
Enter actions for tracepoint 1, one per line.
End with a line saying just "end".
>collect $regs,$args,$locals,$_ret,$trace_timestamp
>end
(gdb) tstart
(gdb) c
Continuing.
Breakpoint 3, main () at /home/juangburgos/Documents/REPOS/trace_test/main.cpp:9
9 return 0;
(gdb) tstop
(gdb) tfind start
Found trace frame 0, tracepoint 1
#0 foo (a=33, b=4) at /home/juangburgos/Documents/REPOS/trace_test/main.cpp:3
3 return a + b + b;
(gdb) tsave /home/juangburgos/Documents/REPOS/build-trace_test-Desktop-Debug/trace02.tfile
Trace data saved to file '/home/juangburgos/Documents/REPOS/build-trace_test-Desktop-Debug/trace02.tfile'.
(gdb) q
现在的问题是,当我在另一个离线GDB会话中加载跟踪文件时,框架、参数、局部变量不会显示,只显示
??
:
gdb -q trace_test
Reading symbols from trace_test...
(gdb) target tfile /home/juangburgos/Documents/REPOS/build-trace_test-Desktop-Debug/trace02.tfile
Tracepoint 1 at 0x1157: file /home/juangburgos/Documents/REPOS/trace_test/main.cpp, line 3.
Created tracepoint 1 for target's tracepoint 1 at 0x555555555157.
Tracepoint 2 at 0x1184: file /home/juangburgos/Documents/REPOS/trace_test/main.cpp, line 8.
Created tracepoint 2 for target's tracepoint 2 at 0x555555555184.
(gdb) tfind start
Found trace frame 0, tracepoint 1
#0 0x0000555555555157 in ?? ()
有人知道是什么原因造成的吗?我知道它应该可以工作,因为这是跟踪文件的定义用例。
注意GDB输出的这部分消息:
Tracepoint 1 at 0x1157: file ... Created tracepoint 1 for target's tracepoint 1 at 0x555555555157.
GDB 似乎无法将跟踪文件 (
0x555555555157
) 中的内存偏移量转换为加载图像的内存偏移量 (0x1157
)。
尝试使用与观察到的差异相匹配的偏移量加载符号。 IE。
0x555555555157 - 0x1157 = 0x555555554000
,然后执行:
add-symbol-file ./trace_test -o 0x555555554000
并再次尝试
tfind start
。