qemu trace debug
qemu提供了几种debug方法,在config阶段需要指定使用哪种方法,编译完后,不能动态修改。
1. log
./configure --disable-strip --enable-trace-backends=log --prefix=/usr
通过-D指定log文件,通过-d指定log level。
如果configure时,打开了--enable-trace-backends=log,还可以通过-d指定trace事件,
如果指定了 qemu-system-x86_64 -trace file=/tmp/trace 则使用tmp/trace作为log文件,但是-D指定的文件会覆盖trace指定的文件。
root@ubuntu:~# qemu-system-x86_64 -h | grep "-D"
-D logfile output log to logfile (default stderr)
qemu-system-x86_64 -d ? --查看log mask
root@ubuntu:/home/jk/qemu-2.7.0# qemu-system-x86_64 -d ?
Log items (comma separated):
out_asm show generated host assembly code for each compiled TB
in_asm show target assembly code for each compiled TB
op show micro ops for each compiled TB
op_opt show micro ops after optimization
op_ind show micro ops before indirect lowering
int show interrupts/exceptions in short format
exec show trace before each executed TB (lots of logs)
cpu show CPU registers before entering a TB (lots of logs)
mmu log MMU-related activities
pcall x86 only: show protected mode far calls/returns/exceptions
cpu_reset show CPU state before CPU resets
unimp log unimplemented functionality
guest_errors log when the guest OS does something invalid (eg accessing a
non-existent register)
page dump pages at beginning of user mode emulation
nochain do not chain compiled TBs so that "exec" and "cpu" show
complete traces
trace:PATTERN enable trace events
Use "-d trace:help" to get a list of trace events.
qemu-system-x86_64 -d all --设置所有模块log mask
代码分析
case QEMU_OPTION_d:
log_mask = optarg;
case QEMU_OPTION_D:
log_file = optarg;
if (log_file) {
qemu_set_log_filename(log_file, &error_fatal);
}
如果不加trace,log中没多少内容。
有三种方法:
a. qemu-system-x86_64 /home/jk/test2.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -D /root/trace -d trace:*
b. 因为打开了--enable-trace-backends=log,所以也可以使用trace选项
qemu-system-x86_64 /home/jk/test2.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -trace enable=*,file=/root/trace
生成的 /root/trace 文件可以直接 vim 读取。
c. 如果使用 -trace events=/root/events(此文件内容为或者想trace事件) 或者 -trace enable= 时,没有 -D 指定log文件,则会打印到标准输出(屏幕上)
qemu-system-x86_64 /home/jk/test2.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -trace events=/root/events
或者
qemu-system-x86_64 /home/jk/test2.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -trace enable=*
2. simple
./configure --disable-strip --enable-trace-backends=simple --prefix=/usr
root@ubuntu:~# qemu-system-x86_64 -h | grep trace
-trace [[enable=]<pattern>][,events=<file>][,file=<file>]
qemu-system-x86_64 -trace enable=? --列出当前可trace的所有事件
qemu-system-x86_64 -trace enable=help --列出当前可trace的所有事件
qemu-system-x86_64 -trace enable=* --可trace所有事件
qemu-system-x86_64 -trace enable=xxx* --可trace指定事件
qemu-system-x86_64 -trace events=/tmp/events --如果/tmp/events文件内容为? 或者help,则列出当前可trace的所有事件
--如果文件内容为*,则可trace所有事件,如果为指定函数,则trace指定函数
qemu-system-x86_64 -trace file=/tmp/trace --指定trace数据写入的文件. And if you do not define the "file=xxx", you can use the bin file generated automatically under the qemu project named "trace-QEMUpid"
trace_file = trace_opt_parse(optarg);
解析 enable, events 和 file 三个参数,enable,events指定使能哪些trace事件,file指定trace数据写在哪个文件
trace_init_backends()
#ifdef CONFIG_TRACE_SIMPLE
st_init
thread = trace_thread_create(writeout_thread); //创建名为 trace-thread 的线程
#endif
trace_init_file(trace_file);
st_set_trace_file(file);
trace_file_name = g_strdup_printf("%s", file);
st_set_trace_file_enabled(true);
//打开命令行指定的 trace_file
trace_fp = fopen(trace_file_name, "wb");
static const TraceLogHeader header = {
.header_event_id = HEADER_EVENT_ID,
.header_magic = HEADER_MAGIC,
/* Older log readers will check for version at next location */
.header_version = HEADER_VERSION,
};
//将 header 写到trace文件中。真正的trace数据在线程 writeout_thread 进行写入
fwrite(&header, sizeof header, 1, trace_fp)
如何查看trace数据,
3. ftrace
http://blog.chinaunix.net/uid-23438246-id-3874277.html
配置
./configure --disable-strip --enable-trace-backends=ftrace --prefix=/usr
编译
make install -j32
代码分析
trace_init_backends()
#ifdef CONFIG_TRACE_FTRACE
ftrace_init()
如果挂载了 debugfs 文件系统,则写入1,打开ftrace
echo 1 > /sys/kernle/debug/tracing/tracing_on
//打开trace_marker,将trace数据写入此文件中
trace_marker_fd = open(/sys/kernle/debug/tracing/trace_marker, w)
#endif
通过 -trace enable=* 指定trace事件。只有指定了trace事件,才会打印出内容来
#运行qemu
qemu-system-x86_64 /home/jk/test2.qcow2 -smp 4 -m 4096 --enable-kvm -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no -trace enable=*
qemu-system-x86_64 /home/jk/test2.qcow2 -smp 2,cores=2 -m 2G -vnc :20 -device virtio-net-pci,netdev=net0 -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -name vm0 -monitor stdio
如果查看ftrace数据?
会打印到 /sys/kernel/debug/tracing/trace 文件中