【问题标题】:How to use single step mode in QEMU?如何在 QEMU 中使用单步模式?
【发布时间】:2013-11-15 17:23:31
【问题描述】:

我是 qemu 的新手,我读到它允许单步模式仿真。这很有帮助,因为我试图在每个周期都转储物理内存的一些地址。不幸的是,qemu 文档非常糟糕。我知道如何从 qemu 监视器启用单步模式,但我不知道在哪里放置我想在每一步执行的代码。有人知道这方面的信息吗?

【问题讨论】:

标签: processor qemu kvm emulation


【解决方案1】:

你可以使用 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”会显示更多信息

【讨论】:

  • 还有 -singlestep 模式 - 不确定它是如何工作的 - 也许它会在 gdb 挂钩的每个步骤中引发一个断点?
  • 这里是更详细的 QEMU GDB 设置指南:stackoverflow.com/a/33203642/895245
【解决方案2】:

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;
    }

这是执行二进制文件的地方(或者更准确地说是“翻译”),或者以其他方式引发硬件异常和处理程序(例如)。如果您有任何想要修改的行为,也许您可​​以在这里尝试?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-30
    • 2015-06-06
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2020-11-23
    • 2021-05-20
    • 2018-12-20
    相关资源
    最近更新 更多