Zawarłem tag iOS, ale używam symulatora na komputerze MacBook Pro Core i7 (x86-64, prawda?), Więc myślę, że to nieistotne.Co zawiera zawartość rejestrów ogólnego przeznaczenia?
Obecnie trwa debugowanie awarii w reklamach wideo Flurry. Mam punkt przerwania ustawiony na wyjątków Objective-C. Po trafieniu punktu przerwania znajduję się w objc_msgSend
. Callstack zawiera mieszankę prywatnych metod Flurry i iOS, nic publicznego i nic, co napisałem. Wywołanie register read
wyjść z ramy stos objc_msgSend
następujące:
(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
Mam kilka pytań dotyczących tego wyjścia.
- Założono, że $ ebx zawiera selektor, który spowodował awarię, a $ edi jest ostatnią metodą wykonywania. Czy tak jest?
- $ eip to miejsce, w którym się rozbiłem. Czy to zwykle tak jest?
- $ eflags odwołuje się do metody instancji, która, o ile mi wiadomo, nie ma nic wspólnego z tą awarią. Co to jest?
- Czy są jakieś inne informacje, które mogę wyciągnąć z tych rejestrów?