【问题标题】:How to print disassembly registers in the Xcode console如何在 Xcode 控制台中打印反汇编寄存器
【发布时间】:2011-10-18 19:02:10
【问题描述】:

我正在查看一些反汇编代码并看到类似0x01c8f09b <+0015> mov 0x8(%edx),%edi 的内容,我想知道%edx%edi 的值是什么。

有没有办法打印%edx 或其他汇编变量的值?有没有办法打印%edx 指向的内存地址的值(我假设edx 是一个寄存器,其中包含指向...的指针)。

例如,您可以通过在控制台中输入po 来打印对象,那么在程序集中是否有用于打印寄存器/变量的命令或语法?

背景:

我在这条线上收到EXC_BAD_ACCESS,我想调试正在发生的事情。我知道这个错误与内存管理有关,我正在寻找可能丢失/太多保留/释放/自动释放调用的位置。

附加信息:

这是在 IOS 上,我的应用程序在 iPhone 模拟器中运行。

【问题讨论】:

    标签: objective-c xcode gdb disassembly


    【解决方案1】:

    您可以使用以下命令打印寄存器(例如,eax):

    print $eax
    

    或者简称:

    p $eax
    

    将其打印为十六进制:

    p/x $eax
    

    显示寄存器指向的值:

    x $eax
    

    查看 gdb 帮助了解更多详情:

    help print
    help x
    

    【讨论】:

      【解决方案2】:

      取决于您使用的 Xcode 编译器/调试器。对于 gcc/gdb 它是

      info registers
      

      但对于 clang/lldb 它是

      register read
      

      【讨论】:

        【解决方案3】:
        (gdb) info reg
        eax            0xe  14
        ecx            0x2844e0 2639072
        edx            0x285360 2642784
        ebx            0x283ff4 2637812
        esp            0xbffff350   0xbffff350
        ebp            0xbffff368   0xbffff368
        esi            0x0  0
        edi            0x0  0
        eip            0x80483f9    0x80483f9 <main+21>
        eflags         0x246    [ PF ZF IF ]
        cs             0x73 115
        ss             0x7b 123
        ds             0x7b 123
        es             0x7b 123
        fs             0x0  0
        gs             0x33 51
        

        来自Debugging with gdb

        您可以在表达式中将机器寄存器内容引用为具有名称的变量 以“$”开头。每台机器的寄存器名称不同;使用信息 注册以查看您机器上使用的名称。

        info registers
        

        打印除浮点以外的所有寄存器的名称和值 寄存器(在选定的堆栈帧中)。

        info all-registers
        

        打印所有寄存器的名称和值,包括浮点数 注册。

        info registers regname ...
        

        打印每个指定寄存器 regname 的相对化值。 regname 可以是在您使用的机器上有效的任何寄存器名称, 带或不带开头的“$”。

        【讨论】:

          【解决方案4】:

          如果你使用的是 LLDB 而不是 GDB,你可以使用 register read

          【讨论】:

            【解决方案5】:

            那些不是变量,而是寄存器。

            在 GDB 中,您可以使用以下命令查看标准寄存器的值:

            info registers
            

            请注意,寄存器包含整数值(在您的情况下为 32 位,因为寄存器名称以 e 为前缀)。它代表什么不得而知。它可以是指针、整数,几乎可以是任何东西。

            如果po 在您尝试将寄存器的值打印为指针时崩溃,则该值可能不是指针(或无效指针)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-20
              • 1970-01-01
              • 1970-01-01
              • 2013-01-21
              • 1970-01-01
              • 2014-05-25
              相关资源
              最近更新 更多