Как использовать простой бэкэнд трассировки QEMU?

Это продолжение этого вопроса с дополнительными подробностями, так как никто не помог ответить на него. Я клонировал последний репозиторий QEMU и следовал этому руководству, чтобы создать программу Hello World для arm-softmmu. Я отследил TCG, а точнее регистры в базовом блоке, используя вспомогательные функции, но натолкнулся на функциональность трассировки и хотел попробовать. Следуя документации, это мой файл / tmp / events после раскомментирования файла trace-events.

exec_tb
exec_tb_exit

Часть файла трассировки событий, в которой ключевое слово disable было удалено для включения трассировки:

# TCG related tracing (mostly disabled by default)
# cpu-exec.c
exec_tb(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR
exec_tb_nocache(void *tb, uintptr_t pc) "tb:%p pc=0x%"PRIxPTR
exec_tb_exit(void *last_tb, unsigned int flags) "tb:%p flags=%x"

Вот как я настраиваю и запускаю исполняемый файл qemu:

./configure --target-list=arm-softmmu --enable-trace-backends=simple

make

./qemu-system-arm -trace events=/tmp/events -M versatilepb -m 256M -nographic -kernel ~/FileName.bin

Из каталога arm-softmmu я запускаю простой скрипт Python для трассировки следующим образом:

./scripts/simpletrace.py trace-events arm-softmmu/trace-*pid* | head

Я что-то здесь не так делаю? Так как я не получаю абсолютно никакой информации. Даже двоичный файл после трассировки - это просто короткая строка (конечно, тарабарщины). Я ожидал достаточно большой след на самом деле.

1 ответ

Я не могу определить, что вы делаете неправильно, но я могу предоставить минимальный автономный рабочий пример, который работает только в одной команде: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a

Как только вы клонируете, сделайте:

./run -n -- -trace exec_tb,file=trace
./qemu/scripts/simpletrace.py qemu/trace-events trace >trace.txt
wc -l trace

и вы увидите следы.

Для ARM:

./run -a arm -- -trace exec_tb,file=trace

Может быть, это позволит вам понять, что не так.

Точная строка конфигурации QEMU, которую сделал Buildroot, была:

./configure --target-list="arm-softmmu" --prefix="/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/hos
t/usr" --interp-prefix=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot --cc="/usr/bin/gcc" --host-cc="/usr
/bin/gcc" --python=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/bin/python2 --extra-cflags="-O2 -I/home/ciro/bak/git/linux-kernel-module-cheat/bu
ildroot/output.arm~/host/usr/include" --extra-ldflags="-L/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/lib -L/home/ciro/bak/git/linux-kernel-module-ch
eat/buildroot/output.arm~/host/usr/lib -Wl,-rpath,/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/lib" --enable-debug --enable-sdl --extra-cflags='-
DDEBUG_PL061=1' --with-sdlabi=2.0

на QEMU v2.7.0, и полная команда QEMU была:

./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1  -M pc -append 'root=/dev/vda nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0 init=/poweroff.out' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel ./buildroot/output.x86_64~/images/bzImage  -nographic -trace exec_tb,file=trace -drive file='./buildroot/output.x86_64~/images/rootfs.ext2.qcow2,if=virtio,format=qcow2'

Я также рекомендую вам начать без --enable-trace-backends, что приводит к еще более простому бэкэнду, который просто плюет на стандартный вывод, с большой потерей производительности. Также попробуйте GDB QEMU вверх, должно быть легко выяснить, чего не хватает.

Обновление 2.11

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