Как запустить запись истории команд и функции-истории вызовов в 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
По крайней мере, частичный ответ (для аспекта "я делаю это неправильно") - из gdb-7.6.50.20140108 / gdb / NEWS
* Добавлена новая цель записи "record-btrace". Новая цель использует аппаратную поддержку для записи потока управления процессом. Он не поддерживает воспроизведение выполнения, но реализует следующие новые команды для исследования записанного журнала выполнения. Этот новый метод записи можно включить с помощью: record btrace Цель "record-btrace" доступна только на процессорах Intel Atom и требует ядра Linux 2.6.32 или новее. * Две новые команды были добавлены для записи / воспроизведения, чтобы предоставить информацию о записанном исполнении без необходимости повторного выполнения. Команды поддерживаются только "record btrace". запись истории команд печатает историю выполнения при детализации команд запись истории вызовов функций печатает историю выполнения при гранулярности функций
Я не часто завидую владельцу процессора Atom;-)
Я отредактирую вопрос, чтобы переориентироваться на вопрос об обходных путях или планах будущей поддержки.