Gdb 与#x27;单步';和';启用单步&x27;QEMU中的变量

Gdb 与#x27;单步';和';启用单步&x27;QEMU中的变量,gdb,qemu,processor,emulation,Gdb,Qemu,Processor,Emulation,因此,我将一个新的特定arch集成到QEMU仿真器中(QEMU中的实现类似于OpenRISC arch,因此在回答问题时可以依赖这个arch),并运行一些测试。 QEMU的版本为2.0.93 当我在正常模式下运行测试时,QEMU以错误的答案结束 当im在-singlestep模式下运行时,QEMU在运行singlestep时无法通过我的断言将多个命令放入TargetBlock 当我使用GDB运行QEMU时,它提供了singlestep\u enabled模式,var等于7(意思是SSTEP\u

因此,我将一个新的特定arch集成到QEMU仿真器中(QEMU中的实现类似于OpenRISC arch,因此在回答问题时可以依赖这个arch),并运行一些测试。
QEMU的版本为2.0.93

  • 当我在正常模式下运行测试时,QEMU以错误的答案结束
  • 当im在
    -singlestep
    模式下运行时,QEMU在运行singlestep时无法通过我的断言将多个命令放入TargetBlock
  • 当我使用GDB运行QEMU时,它提供了
    singlestep\u enabled
    模式,var等于7(意思是
    SSTEP\u ENABLE | SSTEP\u NOIRQ | SSTEP\u NOTIMER
    ),我得到了测试的正确答案
  • 问题是,为什么会这样,这两种模式之间的实际执行差异是什么?
    我在网上没有找到太多关于QEMU的文档,到目前为止,这两个标志执行不同的功能

    “singlestep”是一个bool,用于指示是否提供了命令行“-singlestep”选项。这基本上将QEMU置于一种模式中,即在每个TB中只放置一条来宾指令。我们并不是在每次指令后都停止

    “singlestep_enabled”是每个CPU的,并且在gdb存根想要执行单步时设置(通过CPU_single_step()函数)。然后,目标前端将发出执行单个指令并引发调试异常的代码。(然后gdb存根将处理该异常并将控制权返回给调试器。)

    代码中的第三种单步是模拟目标CPU的内置调试单步行为,我们至少在x86和ARM上实现了这种行为。这通常以特定于目标的方式处理,以提供来宾CPU所需的任何步进语义

    如果您的代码为单步操作和正常操作生成不同的答案,这可能意味着您在生成TCG代码的方式上有一个错误:可能是辅助函数上没有正确的标志,或者错误处理TCG局部变量。或者,当发生加载/存储异常时,您可能无法正确恢复状态


    旁注:2.0.93是QEMU的旧版本,甚至不是发行版(它是2.1的候选发行版)。如果您正在开发一个新的目标前端,您应该使用当前的git master。

    这两个标志执行不同的功能

    “singlestep”是一个bool,用于指示是否提供了命令行“-singlestep”选项。这基本上将QEMU置于一种模式中,即在每个TB中只放置一条来宾指令。我们并不是在每次指令后都停止

    “singlestep_enabled”是每个CPU的,并且在gdb存根想要执行单步时设置(通过CPU_single_step()函数)。然后,目标前端将发出执行单个指令并引发调试异常的代码。(然后gdb存根将处理该异常并将控制权返回给调试器。)

    代码中的第三种单步是模拟目标CPU的内置调试单步行为,我们至少在x86和ARM上实现了这种行为。这通常以特定于目标的方式处理,以提供来宾CPU所需的任何步进语义

    如果您的代码为单步操作和正常操作生成不同的答案,这可能意味着您在生成TCG代码的方式上有一个错误:可能是辅助函数上没有正确的标志,或者错误处理TCG局部变量。或者,当发生加载/存储异常时,您可能无法正确恢复状态


    旁注:2.0.93是QEMU的旧版本,甚至不是发行版(它是2.1的候选发行版)。如果您正在开发一个新的目标前端,您应该使用当前的git master。

    这两个标志执行不同的功能

    “singlestep”是一个bool,用于指示是否提供了命令行“-singlestep”选项。这基本上将QEMU置于一种模式中,即在每个TB中只放置一条来宾指令。我们并不是在每次指令后都停止

    “singlestep_enabled”是每个CPU的,并且在gdb存根想要执行单步时设置(通过CPU_single_step()函数)。然后,目标前端将发出执行单个指令并引发调试异常的代码。(然后gdb存根将处理该异常并将控制权返回给调试器。)

    代码中的第三种单步是模拟目标CPU的内置调试单步行为,我们至少在x86和ARM上实现了这种行为。这通常以特定于目标的方式处理,以提供来宾CPU所需的任何步进语义

    如果您的代码为单步操作和正常操作生成不同的答案,这可能意味着您在生成TCG代码的方式上有一个错误:可能是辅助函数上没有正确的标志,或者错误处理TCG局部变量。或者,当发生加载/存储异常时,您可能无法正确恢复状态


    旁注:2.0.93是QEMU的旧版本,甚至不是发行版(它是2.1的候选发行版)。如果您正在开发一个新的目标前端,您应该使用当前的git master。

    这两个标志执行不同的功能

    “singlestep”是一个bool,用于指示是否提供了命令行“-singlestep”选项。这基本上将QEMU置于一种模式中,即在每个TB中只放置一条来宾指令。我们并不是在每次指令后都停止

    “singlestep_enabled”是每个CPU的,并且在gdb存根想要执行单步时设置(通过CPU_single_step()函数)。然后,目标前端将发出执行单个指令并引发调试异常的代码。(然后gdb存根将处理该异常并将控制权返回给调试器。)

    代码中的第三种单步是模拟