2013-03-20 85 views
24

我有一個斷點,看起來像這樣如何使用符號斷點在Objective-C參數,以獲得

-[UITableViewCell setSelected:] 

和它的作品,但我想不出如何獲取正在被傳遞的值。

我試過-[UITableViewCell setSelected:(BOOL)what]-[UITableViewCell setSelected:what],根本不工作。

如何訪問參數?

如果這不起作用,我將不得不做一個DebugUITableViewCell只是爲了看看發生了什麼,這是一個麻煩,觸及了很多代碼。

+1

我沒有足夠的勇氣來發布這個真正的答案,因爲我只是猜測,但我相信只是沒有提供給調試器。你沒有得到UIKit的符號,所以調試器不知道這個方法的參數名稱是什麼,運行時可能能夠找出它的類型,但它與具有真正的符號信息不一樣。我猜你的子類技巧是可行的,因爲你也將該符號信息提供給調試器。 – 2013-03-20 00:29:16

回答

26

如果你在設備上調試你的代碼,當你命中斷點時的參數將一直存在於寄存器r0,r1和r2中。如果您使用po $r0,則會看到接收setSelected的對象。如果你使用po $r1,你會得到「沒有可用的Objective-C描述」,因爲這是選擇器。檢查$ r2以查看是否選擇了YES或NO。這是i386上的一個類似的故事,但我不記得哪些寄存器被使用。

+0

我知道這是一個用gdb很好用的技巧,但我相信它在lldb中不會一直工作。 – 2013-03-20 01:36:03

+1

@darren在發佈我的答案之前,我用lldb測試了這個,但是是什麼讓你認爲它不起作用? – 2013-03-20 01:42:58

+9

它會在lldb下正常工作。事實上,在lldb中它更好,因爲(對於在arm和x86_64等寄存器中傳遞參數的體系結構)提供'$ arg0','$ arg1'等別名到該體系結構的正確寄存器。 – 2013-03-20 02:25:52

4

您可以用您自己的實現替換-[UITableViewCell setSelected:]以進行調試。下面,將調用UITableViewCellSetSelected而不是UIKit的方法。

static void (*__originalUITableViewCellSetSelected)(UITableViewCell *, SEL, BOOL) ; 
static void UITableViewCellSetSelected(UITableViewCell * self, SEL _cmd, BOOL b) 
{ 
    // your code here... (or set a breakpoint here) 
    NSLog(@"%@<%p> b=%s\n", [ self class ], self, b ? "YES" : "NO") ; 

    (*__originalUITableViewCellSetSelected)(self, _cmd, b) ; // call original implementation: 
} 

@implementation UITableViewCell (DebugIt) 

+(void)load 
{ 
    Method m = class_getInstanceMethod([ self class ], @selector(setSelected:)) ; 
    __originalUITableViewCellSetSelected = (void(*)(id, SEL, BOOL))method_getImplementation(m) ; 
    method_setImplementation(m, (IMP)UITableViewCellSetSelected) ; 
} 

@end 
+0

雖然對於快速解決方案@阿倫的答案是好的。我會在這裏留下這個信息... – nielsbot 2013-03-20 01:27:29

+0

我想我可能會接受亞倫的答案,因爲它更重要,但這也很棒。謝謝! – 2013-03-20 02:53:27

7

在LLDB上模擬器使用

p $arg3

對於第一個參數。

1

根據-[UIApplication sendAction:toTarget:fromSender:forEvent:]符號,我們可以添加符號斷點來檢查哪個發送者已將操作發送到哪個目標。

我們創建具有象徵性的斷點:

  • 符號:-[UIApplication sendAction:toTarget:fromSender:forEvent:]
  • 調試程序的命令行操作:
    • po "Target"
    • po $arg4
    • po "Sender"
    • po $arg5

輸出將是: "Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>

那麼作爲@丹所述,方法參數開始參數3(po $arg3)。

相關問題