2016-05-13 57 views
0

我想在方法調用的一開始就設置斷點,這樣我可以檢查它的$ RDI $ RSI等

在Xcode中,當我在一個方法調用設置一個象徵性的斷點說 - [助手類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 

回答

3

賈森的建議是很好的更爲複雜的問題,但是這是一個很常見的要求,因此break set有一個選項專門控制推斷點過去的序幕:

(LLDB)破設置-n主 - skip-prologue 0

+0

完美!正是我在找什麼。 –

+0

哈,我正在專門尋找這樣的選項,但在'help br s'輸出中錯過了它。 –

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

+0

很好的答案。 'br s -a'與'dis -n'配對非常強大。 –

相關問題