我包含了 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 引用了一个实例方法,据我所知,该方法与这次崩溃无关。那是什么?
- 我可以从这些寄存器中撬出任何其他信息吗?