Как использовать простой бэкэнд трассировки 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
- события трассировки были перемещены в: accel / tcg / trace-events как в https://github.com/cirosantilli/qemu/commit/8dbff6d3728ff78c4da74d667bb4833edade06aa
- Вы должны использовать сгенерированный файл trace-events-all, как в: https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0c2bd829d47f6815500420789ad765c7a125b54c