【发布时间】:2013-11-15 17:23:31
【问题描述】:
我是 qemu 的新手,我读到它允许单步模式仿真。这很有帮助,因为我试图在每个周期都转储物理内存的一些地址。不幸的是,qemu 文档非常糟糕。我知道如何从 qemu 监视器启用单步模式,但我不知道在哪里放置我想在每一步执行的代码。有人知道这方面的信息吗?
【问题讨论】:
-
@peter 的回答对您有帮助吗?
标签: processor qemu kvm emulation
我是 qemu 的新手,我读到它允许单步模式仿真。这很有帮助,因为我试图在每个周期都转储物理内存的一些地址。不幸的是,qemu 文档非常糟糕。我知道如何从 qemu 监视器启用单步模式,但我不知道在哪里放置我想在每一步执行的代码。有人知道这方面的信息吗?
【问题讨论】:
标签: processor qemu kvm emulation
你可以使用 gdb 来附加到客户机上
--gdb tcp::
qemu 的选项,然后使用
$ gdb <binary>
(gdb) symbol-file <sym file>
(gdb) target remote <host>:<port number>
(gdb) b <function>
(gdb) c
'b' 设置断点。 'n' 's' 'i' 可用于单步执行代码。在gdb模式下输入“info”会显示更多信息
【讨论】:
http://www.xenproject.org/help/questions-and-answers/problem-with-vga-passthrough.html
从上面的链接是进入 QEMU 单步模式的命令行选项。接下来是获取QEMU的源码(http://wiki.qemu.org/Download)
函数monitor.c:do_singlestep(Monitor *mon, const QDict *qdict)
只需简单地设置一个标志“单步”。请注意,这与“singlestep_enabled”不同,后者是模拟硬件单步模拟。
(全局变量在 vl.c 中声明)。
现在查看 targt-i386/translate.c 中的所有函数 - 测试“单步”标志的地方是:
if (singlestep) {
gen_jmp_im(pc_ptr - dc->cs_base);
gen_eob(dc);
break;
}
这是执行二进制文件的地方(或者更准确地说是“翻译”),或者以其他方式引发硬件异常和处理程序(例如)。如果您有任何想要修改的行为,也许您可以在这里尝试?
【讨论】: