2015-04-16 6 views
11

Wie kann ich das Setzen eines Haltepunkts für alle Methoden in einer Objective C-Klasse mithilfe von lldb automatisieren?lldb Haltepunkt für alle Methoden in Klassenziel c

Dies ist nützlich für das Erlernen des Verhaltens einer komplizierten Legacy-Klasse. Ich verwende Xcode (includes lldb) für die iOS-Entwicklung, und es ist umständlich, manuell die (große) Datei in Xcode durchzugehen und auf den Gutter neben jeder Methode zu klicken, um Haltepunkte zu setzen.

Antwort

17

Eine Option ist die Verwendung von Regex Breakpoints.

breakpoint set -r '\[ClassName .*\]$' 

Sie können mit dem regexp spielen, um Ihren Bedürfnissen gerecht wird.

Der Befehl erstellt einen Haltepunkt, der bei allen Methoden von dieser Klasse implementiert wird. Es gibt jedoch keine Haltepunkte für Methoden, die von Superklassen geerbt werden.

Um Methoden für die Oberklasse zu erhalten, müssen Sie einen bedingten Haltepunkt verwenden. Zum Beispiel, wenn die übergeordnete Klasse ist UIViewController, könnten Sie so etwas wie:

br s -r '\[UIViewController .*\]$' -c '(BOOL)[(id)$arg1 isKindOfClass:[CustomVC class]]' 

für x86 Änderung (id)$arg1 zu *(id*)($ebp+8).

Schließlich, wenn Sie wirklich über den Kontrollfluss durch verschiedene Klassen lernen möchten, überprüfen Sie Dtrace. Es ist wahrscheinlich besser geeignet als ein Debugger.

+0

Ich bin verwirrt, was Sie mit '\ [ClassName (\ (. * \)) Bedeuten. * \] $', Jedoch '\ [FooViewController. * \] $' Hat den Trick für mich gemacht. Ich mag auch, dass die $ causes-Haltepunkte auch bei Blöcken weggelassen werden. Die Regex für Superklassen-Methoden ist auch schön. Danke für die Tipps, und ich werde sicher dtrace überprüfen. – tboyce12

+0

Nach dem '(\ (. * \))' Sollte '' 'stehen. Dieser Teil soll Kategorien entsprechen, z. '- [UIView (Geometrie) setFrame:]'. Ich werde es herausnehmen, weil es nicht notwendig sein sollte. –

+0

Wo schreibe ich diesen Befehl. Bitte schlagen Sie auf der Konsole oder am Terminal oder im Code vor. – Chandni

3
br se -f FooViewController.m -p '^@property|^ *- *\(' 

"br se" ist die Abkürzung für "Haltepunkt gesetzt", Ihren eigenen Dateinamen in das -f Argument übergeben, und das -p Argument ist eine grobe regex für Eigenschaften und Methoden in Objective C.

Caveats : Dies scheint nicht für .h Dateien zu funktionieren. Wenn Sie Eigenschaften in der Kopfzeile deklariert haben, die Sie überwachen möchten, müssen Sie möglicherweise Watchpoints für die Backing-Instanzvariablen festlegen.

Dies ist die beste Lösung, die ich bisher gefunden habe, bitte posten alternative Lösungen, wenn Sie denken, dass sie hilfreich sein werden.

Verwandte Themen