Как запустить запись истории команд и функции-истории вызовов в GDB?

(РЕДАКТИРОВАТЬ: согласно первому ответу ниже текущий "трюк", кажется, использует процессор 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" завершается неудачно с "Target не поддерживает трассировку ветвей".

Так что вполне возможно, что он просто не поддерживается для этой цели, но, поскольку он является основным современным (gdb 7.6.1-ubuntu, на amd64 Linux Mint "Petra" под управлением Intel(R) Core(TM) i5-3570")) Надеюсь, что я упустил важный шаг или конфиг?

2 ответа

Решение

Кажется, что нет другого решения, кроме процессора, который его поддерживает.

Точнее, ваше ядро ​​должно поддерживать Intel Processor Tracing (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); с прочитанным typeи посмотрим, вернется ли он >=0, TODO: почему бы не использовать оболочку C?

Первая проверка не удалась: файл не существует.

Сторона ядра

Перейдите в исходный код ядра 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

Виртуальный ящик также не поддерживает его: извлеките журнал выполнения из записи GDB на виртуальной машине VirtualBox

Intel SDE

Intel SDE 7.21 уже имеет эту функцию ЦПУ, проверенную с помощью:

./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

Более общие вопросы с менее эффективными программными решениями:

По крайней мере, частичный ответ (для аспекта "я делаю это неправильно") - из gdb-7.6.50.20140108 / gdb / NEWS

* Добавлена ​​новая цель записи "record-btrace". Новая цель использует аппаратную поддержку для записи потока управления процессом. Он не поддерживает воспроизведение выполнения, но реализует следующие новые команды для исследования записанного журнала выполнения. Этот новый метод записи можно включить с помощью:

record btrace Цель "record-btrace" доступна только на процессорах Intel Atom и требует ядра Linux 2.6.32 или новее.

* Две новые команды были добавлены для записи / воспроизведения, чтобы предоставить информацию о записанном исполнении без необходимости повторного выполнения. Команды поддерживаются только "record btrace". запись истории команд печатает историю выполнения при детализации команд запись истории вызовов функций печатает историю выполнения при гранулярности функций

Я не часто завидую владельцу процессора Atom;-)

Я отредактирую вопрос, чтобы переориентироваться на вопрос об обходных путях или планах будущей поддержки.

Другие вопросы по тегам