2013-03-20 5 views
24

ich einen Haltepunkt, dieWie kommt man Parameter mit symbolischen Stützpunkten in Objective-C

-[UITableViewCell setSelected:] 

wie diese aussieht und es funktioniert, aber ich kann nicht herausfinden, wie den Wert zu erhalten, die in übergeben wird.

Ich habe versucht -[UITableViewCell setSelected:(BOOL)what] und -[UITableViewCell setSelected:what], die überhaupt nicht funktionieren.

Wie kann ich auf die Parameter zugreifen?

Wenn dies nicht funktioniert, ich werde ein DebugUITableViewCell nur machen, um zu sehen, was los ist, was für ein Aufwand ist und eine Menge Code berührt.

+1

Ich bin nicht mutig genug, um dies eine echte Antwort zu posten, wie ich spekuliere, aber ich glaube, will nicht für den Debugger. Sie erhalten nicht die Symbole für UIKit, so dass der Debugger keine Ahnung hat Wie lautet der Name des Arguments zu dieser Methode? Die Laufzeit könnte ihren Typ herausfinden, aber sie ist nicht mit der echten Symbolinformation identisch.Ihr Trick mit der Unterklasse funktioniert vermutlich, weil Sie dem Debugger auch diese Symbolinformationen zur Verfügung stellen. –

Antwort

26

Wenn Sie Ihren Code auf dem Gerät debuggen, befinden sich die Parameter beim Auftreffen auf den Haltepunkt konsistent in den Registern r0, r1 und r2. Wenn Sie po $r0 verwenden, sehen Sie das Objekt, das setSelected empfängt. Wenn Sie po $r1 verwenden, erhalten Sie "keine Objective-C-Beschreibung verfügbar", da dies der Selektor ist. Inspizieren Sie $ r2, um zu sehen, ob ausgewählt wurde auf JA oder NEIN. Es ist eine ähnliche Geschichte auf i386, aber ich kann mich nicht erinnern, welche Register verwendet werden.

+0

Ich weiß, das war ein gut benutzter Trick mit gdb, aber ich glaube, dass es in lldb nicht einheitlich funktionieren wird. –

+1

@darren Ich habe dies mit lldb getestet, bevor ich meine Antwort gepostet habe, aber was lässt dich denken, dass es nicht funktionieren würde? –

+9

Es wird gut mit lldb funktionieren. Tatsächlich ist es in lldb sogar noch besser, weil (für Architekturen, die Argumente in Registern wie arm und x86_64 übergeben) '$ arg0',' $ arg1' usw. vorhanden sind, die das richtige Register für diese Architektur bilden. –

4

Sie können -[UITableViewCell setSelected:] durch Ihre eigene Implementierung für Debugging-Zwecke ersetzen. Unten wird UITableViewCellSetSelected anstelle von UIKits Methode aufgerufen.

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

obwohl für eine schnelle lösung @ aaron die antwort ist gut. Ich werde das hier für Info lassen ... – nielsbot

+0

Ich denke, ich könnte Aarons Antwort akzeptieren, weil es mehr auf Punkt ist, aber das ist auch toll. Vielen Dank! –

7

In LLDB auf Simulator verwenden

p $arg3

für den ersten Parameter.

1

Basierend auf dem Symbol -[UIApplication sendAction:toTarget:fromSender:forEvent:] können wir einen symbolischen Haltepunkt hinzufügen, um zu überprüfen, welcher Absender eine Aktion an welches Ziel gesendet hat.

Wir schaffen symbolischen Breakpoint mit:

  • Symbol: -[UIApplication sendAction:toTarget:fromSender:forEvent:]
  • Debugger Kommandozeile Aktionen:
    • po "Target"
    • po $arg4
    • po "Sender"
    • po $arg5

würde der Ausgang sein: "Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>

So wie @ Dan gesagt, starten Verfahrensparameter mit Argument 3 (po $arg3).

Verwandte Themen