如何使用QEMU的简单跟踪后端?

时间:2016-08-25 15:39:03

标签: arm trace qemu bare-metal

这是this问题的后续问题以及其他详细信息,因为没人帮忙回答。我克隆了最新的QEMU repo,并按照this教程为arm-softmmu创建了一个Hello World程序。我使用帮助函数跟踪了TCG,而不是基本块中的寄存器,但我遇到了跟​​踪功能,我想尝试一下。在documentation之后,取消注释trace-events文件后,这是我的/ tmp / events文件。

exec_tb
exec_tb_exit

删除disable关键字以启用跟踪的trace-events文件部分是:

# 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 个答案:

答案 0 :(得分:-2)

我无法发现你做错了什么,但我可以提供一个最小的自包含工作示例,它只能在一个命令中运行:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a#count-instructions

克隆后执行:

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

也许这会让你分辨出错误。

Buildroot的确切QEMU配置行是:

./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的情况下启动,这会导致更简单的后端,只会向stdout发送内容,从而导致性能下降。另外尝试GDB QEMU,应该很容易弄清楚缺少什么。

更新2.11