所以我有一个有5个参数的方法。正如预期的那样,寄存器版权状态,它被称为前:在取消引用寄存器(%r11)时崩溃了objc_msgSend,但我不明白为什么
$rdi: The receiver
$rsi: the selector for the method
$rdx: first arg
$rcx: second arg
$r8: third arg
$r9: fourth arg
$r10 fifth arg
在这个方法中,它做的第一件事是调用另一个Objective-C的方法
这反过来调用objc_msgSend
(见偏移+58):
MyApp`-[GTMOAuth2WindowController webView:resource:willSendRequest:redirectResponse:fromDataSource:]:
0x10044a1a0 <+0>: pushq %rbp
0x10044a1a1 <+1>: movq %rsp, %rbp
0x10044a1a4 <+4>: subq $0x40, %rsp
0x10044a1a8 <+8>: movq 0x10(%rbp), %rax
0x10044a1ac <+12>: movq %rdi, -0x10(%rbp)
0x10044a1b0 <+16>: movq %rsi, -0x18(%rbp)
0x10044a1b4 <+20>: movq %rdx, -0x20(%rbp)
0x10044a1b8 <+24>: movq %rcx, -0x28(%rbp)
0x10044a1bc <+28>: movq %r8, -0x30(%rbp)
0x10044a1c0 <+32>: movq %r9, -0x38(%rbp)
0x10044a1c4 <+36>: movq %rax, -0x40(%rbp)
0x10044a1c8 <+40>: movq -0x10(%rbp), %rax
0x10044a1cc <+44>: movq -0x38(%rbp), %rdx
0x10044a1d0 <+48>: movq 0x2ffda9(%rip), %rsi ; "handleCookiesForResponse:"
0x10044a1d7 <+55>: movq %rax, %rdi
0x10044a1da <+58>: callq 0x1005839a2 ; symbol stub for: objc_msgSend
,然后转到指令objc_msgSend
:
libobjc.A.dylib`objc_msgSend:
-> 0x7fff9084a0c0 <+0>: testq %rdi, %rdi
0x7fff9084a0c3 <+3>: je 0x7fff9084a140 ; <+128>
0x7fff9084a0c6 <+6>: testb $0x1, %dil
0x7fff9084a0ca <+10>: jne 0x7fff9084a14b ; <+139>
0x7fff9084a0cd <+13>: movabsq $0x7ffffffffff8, %r11
0x7fff9084a0d7 <+23>: andq (%rdi), %r11
0x7fff9084a0da <+26>: movq %rsi, %r10
0x7fff9084a0dd <+29>: andl 0x18(%r11), %r10d
我有时在偏移量+29
上崩溃,当CPU试图取消引用%r11
寄存器时。
我的问题是,为什么objc_msgSend
解除引用注册?根据System V ABI这是一个临时寄存器。但它每次被取消引用objc_msgSend
,我真的不知道它用于什么。
我崩溃发生的事情时,有在%r11
无效的指针,看起来像在+23,该%rdi
寄存器(指针接收器)取消引用和andq
“随着%r11
万桶,但我不不要做什么。但是如果接收器在这里被释放,%r11
可能会被垃圾填满?
这一理论得到这个assembly source w/ comments
在哪里,我认为它指出了%r11
用于isa
财产
“级=自我> ISA”证实。
这将意味着该对象被释放,因为isa
属性junked
如果是这样的话,我怎么能防止呢?
在致电objc_msgSend
之前查看if(self)
就足够了吗?
msgSend所做的第一件事就是如果在调用之前这样做并不会有多大帮助。正如你所说,'self'指向垃圾,但不幸的是它不是'NULL'。 – Jester
有什么办法来检查'self'的地址是否包含有效的对象,而不是垃圾? –