5

我包含了 iOS 标签,但我在 Core i7 MacBook Pro(x86-64,对吗?)上的模拟器中运行,所以我认为这无关紧要。

我目前正在调试 Flurry 的视频广告中的崩溃。我在 Objective-C 异常上设置了一个断点。当断点被击中时,我在objc_msgSend. 调用堆栈包含私有 Flurry 和 iOS 方法的混合,没有公开的,也没有我写过的。register read从 堆栈帧调用objc_msgSend输出以下内容:

(lldb) register read
General Purpose Registers:
       eax = 0x1ac082d0
       ebx = 0x009600b5  "spaceWillDismiss:interstitial:"
       ecx = 0x03e2cddb  "makeKeyAndVisible"
       edx = 0x0000003f
       edi = 0x0097c6f3  "removeWindow"
       esi = 0x00781e65  App`-[FlurryAdViewController removeWindow] + 12
       ebp = 0xbfffd608
       esp = 0xbfffd5e8
        ss = 0x00000023
    eflags = 0x00010202  App`-[FeedTableCell setupVisibleCommentAndLike] + 1778 at FeedTableCell.m:424
       eip = 0x049bd09b  libobjc.A.dylib`objc_msgSend + 15
        cs = 0x0000001b
        ds = 0x00000023
        es = 0x00000023
        fs = 0x00000000
        gs = 0x0000000f

我有几个关于这个输出的问题。

  • 我假设 $ebx 包含导致崩溃的选择器,而 $edi 是最后一个执行方法。是这样吗?
  • $eip 是我崩溃的地方。通常是这样吗?
  • $eflags 引用了一个实例方法,据我所知,该方法与这次崩溃无关。那是什么?
  • 我可以从这些寄存器中撬出任何其他信息吗?
4

1 回答 1

1

我不能专门谈论 iOS/Objective-C 框架布局,所以我无法回答您关于 EBX 和 EDI 的问题。但我可以帮助您了解 EIP 和 EFLAGS,并为您提供一些有关 ESP/EBP 和选择器寄存器的一般提示。(顺便说一下,模拟器正在模拟 32 位 x86 环境;您可以知道,因为您的寄存器是 32 位长的。)

EIP是指令指针寄存器,也称为程序计数器,包含当前正在执行的机器指令的地址。因此,它将指向您的程序崩溃的位置,或者更一般地说,您的程序在遇到断点、转储核心等时所在的位置。

EIP 被保存和恢复以实现函数调用(在机器代码级别——内联可能导致高级语言调用不执行实际调用)。在内存不安全的语言中,堆栈缓冲区溢出会覆盖指令指针的保存值,导致返回指令返回错误的位置。如果幸运的话,覆盖的值将在下一次内存获取时触发段错误,但 EIP 的值将是任意的,并且对调试问题没有帮助。如果你不走运,攻击者制作了新的 EIP 以指向有用的代码,因此许多环境使用“堆栈 cookie”或“金丝雀”在恢复保存/覆盖的 EIP 之前检测这些覆盖,在这种情况下,EIP 值可能是有用。

EFLAGS不是内存地址,也可以说不是通用寄存器。EFLAGS 的每一位都是一个标志,可以通过各种指令设置或测试。最重要的标志是进位、零和符号标志,它们由算术指令设置并用于条件分支。您的调试器将其误解为内存地址并将其显示为最接近的函数,但这实际上与您的崩溃无关。(这+ 1778是赠品:这意味着 EFLAGS 将 1778 字节指向函数,但该函数实际上不太可能是 1778 字节长。)

ESP 是堆栈指针,而 EBP(通常)是帧指针(也称为基指针)。这些寄存器将当前帧绑定在调用堆栈上。您的调试器通常可以根据这些指针向您显示堆栈变量的值和当前调用堆栈。如果发生损坏,有时您可以手动检查堆栈以恢复 EBP 并手动展开调用堆栈。请注意,可以在没有帧指针的情况下编译代码(省略帧指针),从而释放 EBP 以供其他用途;这在 x86 上很常见,因为通用寄存器很少。

SS、CS、DS、ES、FS 和 GS 保存段选择器,在分页之前用于实现分段的糟糕时代。今天 FS 和 GS 被操作系统普遍用于进程和线程状态块;它们是唯一继承到 x86-64 的选择器寄存器。选择器寄存器通常对调试没有帮助。

于 2014-10-06T14:26:58.787 回答