11

(编辑:根据当前“技巧”下面的第一个答案,似乎正在使用 Atom 处理器。但我希望一些 gdb 大师可以回答这是一个基本限制,或者是否在路线图上增加对其他处理器的支持?)

反向执行似乎在我的环境中起作用:我可以反向继续,查看合理的记录日志,并在其中移动:

(gdb) start
...Temporary breakpoint 5 at 0x8048460: file bang.cpp, line 13.
Starting program: /home/thomasg/temp/./bang 

Temporary breakpoint 5, main () at bang.cpp:13
13    f(1000);
(gdb) record 
(gdb) continue 
Continuing.

Breakpoint 3, f (d=900) at bang.cpp:5
5     if(d) {
(gdb) info record 
Active record target: record-full
Record mode:
Lowest recorded instruction number is 1.
Highest recorded instruction number is 1005.
Log contains 1005 instructions.
Max logged instructions is 200000.
(gdb) reverse-continue 
Continuing.

Breakpoint 3, f (d=901) at bang.cpp:5
5     if(d) {
(gdb) record goto end
Go forward to insn number 1005
#0  f (d=900) at bang.cpp:5
5     if(d) {

但是指令和功能历史不可用:

(gdb) record instruction-history 
You can't do that when your target is `record-full'
(gdb) record function-call-history 
You can't do that when your target is `record-full'

唯一可用的目标类型是完整的,另一个记录的类型“btrace”失败,并显示“目标不支持分支跟踪”。

所以很可能它只是不支持这个目标,但因为它是一个主流的现代目标(gdb 7.6.1-ubuntu,在 amd64 Linux Mint“Petra”上运行“Intel(R) Core(TM) i5-3570” ) 我希望我忽略了一个关键步骤或配置?

4

2 回答 2

7

似乎除了支持它的CPU之外没有其他解决方案。

更准确地说,您的内核必须支持 Intel 处理器跟踪 (Intel PT)。这可以在 Linux 中通过以下方式进行检查:

grep intel_pt /proc/cpuinfo

另请参阅:https ://unix.stackexchange.com/questions/43539/what-do-the-flags-in-proc-cpuinfo-mean

这些命令仅在record btrace模式下有效。

在 GDB 源代码提交beab5d9中,它nat/linux-btrace.c:kernel_supports_pt检查我们是否可以进入btrace。执行以下检查:

  • 检查是否/sys/bus/event_source/devices/intel_pt/type存在并阅读type
  • syscall (SYS_perf_event_open, &attr, child, -1, -1, 0);对 read做 a type,看看它是否返回>=0。TODO:为什么不使用 C 包装器?

第一次检查对我来说失败了:文件不存在。

内核端

cd 进入内核 4.1 源代码并:

git grep '"intel_pt"'

我们找到arch/x86/kernel/cpu/perf_event_intel_pt.c哪个设置了该文件。特别是,它确实:

if (!test_cpu_cap(&boot_cpu_data, X86_FEATURE_INTEL_PT))
    goto fail;

intel_pt是一个先决条件。

我是如何找到的kernel_supports_pt

首先grep:

git grep 'Target does not support branch tracing.'

这导致我们btrace.c:btrace_enable。快速调试后:

gdb -q -ex start -ex 'b btrace_enable' -ex c --args /home/ciro/git/binutils-gdb/install/bin/gdb --batch -ex start -ex 'record btrace' ./hello_world.out

Virtual Box 也不支持:Extract execution log from gdb record in a VirtualBox VM

英特尔 SDE

Intel SDE 7.21已经有这个 CPU 功能,检查:

./sde64 -- cpuid | grep 'Intel processor trace'

但我不确定是否可以在其上运行 Linux 内核:https ://superuser.com/questions/950992/how-to-run-the-linux-kernel-on-intel-software-development-emulator- sde

其他 GDB 方法

更通用的问题,效率较低的软件解决方案:

于 2015-08-04T16:08:55.213 回答
1

至少是部分答案(对于“我做错了吗”方面)-来自gdb-7.6.50.20140108/gdb/NEWS

* 添加了一个新的记录目标“record-btrace”。新目标
  使用硬件支持来记录进程的控制流。它
  不支持重播执行,但它实现了
  下面是用于调查记录的执行日志的新命令。
  可以使用以下方式启用这种新的录制方法:

记录btrace

  “record-btrace”目标仅在 Intel Atom 处理器上可用
  并且需要 Linux 内核 2.6.32 或更高版本。

* 添加了两个新命令用于记录/重播以提供信息
  关于记录的执行,而无需重播执行。
  这些命令仅受“记录 btrace”支持。

record instruction-history 打印执行历史
                                指令粒度

record function-call-history 打印执行历史
                                功能粒度

我并不经常羡慕 Atom 处理器的拥有者 ;-)

我将编辑问题以重新关注解决方法或未来支持计划的问题。

于 2014-03-19T15:37:20.027 回答