我想在方法调用的最开始设置断点,以便我可以检查它的$ rdi $ rsi等。
在Xcode中,当我在一个方法调用时设置一个符号断点 - 例如[HelperClass doThingWithBlock:],它停在方法体的第一行,在方法调用开始后已经有几条指令,如图所示在下面的方法调用的反汇编中。
DebugBlock`-[HelperClass doThingWithBlock:]:
0x109844aa0 <+0>: pushq %rbp
0x109844aa1 <+1>: movq %rsp, %rbp
0x109844aa4 <+4>: subq $0x30, %rsp
0x109844aa8 <+8>: leaq -0x18(%rbp), %rax
0x109844aac <+12>: movq %rdi, -0x8(%rbp)
0x109844ab0 <+16>: movq %rsi, -0x10(%rbp)
0x109844ab4 <+20>: movq $0x0, -0x18(%rbp)
0x109844abc <+28>: movq %rax, %rdi
0x109844abf <+31>: movq %rdx, %rsi
0x109844ac2 <+34>: callq 0x109844c74 ; symbol stub for: objc_storeStrong
0x109844ac7 <+39>: leaq 0x15a2(%rip), %rax ; @"hi"
0x109844ace <+46>: movl $0x16, %ecx
0x109844ad3 <+51>: movl %ecx, %edx
-> 0x109844ad5 <+53>: movq -0x18(%rbp), %rsi
0x109844ad9 <+57>: movq %rsi, %rdi
0x109844adc <+60>: movq %rsi, -0x20(%rbp)
0x109844ae0 <+64>: movq %rax, %rsi
0x109844ae3 <+67>: movq -0x20(%rbp), %rax
0x109844ae7 <+71>: callq *0x10(%rax)
0x109844aea <+74>: xorl %ecx, %ecx
0x109844aec <+76>: movl %ecx, %esi
0x109844aee <+78>: leaq -0x18(%rbp), %rdx
0x109844af2 <+82>: movq %rdx, %rdi
0x109844af5 <+85>: movb %al, -0x21(%rbp)
0x109844af8 <+88>: callq 0x109844c74 ; symbol stub for: objc_storeStrong
0x109844afd <+93>: addq $0x30, %rsp
0x109844b01 <+97>: popq %rbp
0x109844b02 <+98>: retq
答案 0 :(得分:3)
Jason的建议适用于更复杂的问题,但这是一个非常常见的要求,因此break set
有一个专门用于控制推断断点超过序言的选项:
(lldb)break set -n main --skip-prologue 0
答案 1 :(得分:1)
lldb会将断点位置提前到函数中的第一个源行。我们的想法是,大多数拥有源级别信息的人对使用其名称打印参数更感兴趣,而不是查看用于传递它们的寄存器。
如果您使用的是简单的C函数,则可以设置一个地址断点,将函数名称评估为一个地址,例如
(lldb) br s -n main
Breakpoint 1: where = a.out`main + 11 at a.c:3, address = 0x0000000100000f8b
(lldb) br s -a `main`
Breakpoint 2: address = 0x0000000100000f80
(lldb)
反引号符号``将反引号中的表达式计算为地址/值。 breakpoint set --address
可以按照您的预期运作。
甚至还有一些特殊的魔法,你不需要反对那些期望地址的东西,比如br s -a
。你可以做br s -a main
并且它可以工作 - 作为一个非常特殊的奖励,你可以在这里添加偏移量,例如br s -a main+5
,这通常不是有效的C表达式。
很遗憾,我们正在使用objc方法-[HelperClass doThingWithBlock:]
,您不能像我在main
那样使用表达式。我认为在这种情况下,您需要自己查找地址,例如您可以在开头反汇编指令dis -c 1 -n '-[ViewController setRepresentedObject:]'
,然后将该地址反馈到br s -a
。