美文网首页
qemu trace debug

qemu trace debug

作者: 分享放大价值 | 来源:发表于2020-06-06 21:12 被阅读0次

    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 文件中

    4. 还有两个 backend- dtrace和uts就先不研究了

    相关文章

      网友评论

          本文标题:qemu trace debug

          本文链接:https://www.haomeiwen.com/subject/yfmftktx.html