2015-04-16 14 views
11

Come è possibile automatizzare l'impostazione di un punto di interruzione su tutti i metodi in una classe Objective C utilizzando lldb?breakpoint lldb su tutti i metodi nell'obiettivo di classe c

Questo è utile per l'apprendimento del comportamento di una classe legacy complicata. Sto usando Xcode (include lldb) per lo sviluppo iOS, ed è complicato passare manualmente attraverso il file (grande) in Xcode e fare clic sul margine interno accanto a ciascun metodo per impostare i breakpoint.

risposta

17

Un'opzione è utilizzare i punti di interruzione delle espressioni regolari.

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

È possibile giocare con l'espressione regolare in base alle proprie esigenze.

Il comando creerà un punto di interruzione che si arresta su tutti i metodi implementato da da quella classe. Tuttavia, non ci saranno punti di interruzione sui metodi ereditati dalle superclassi.

Per ottenere i metodi sulla superclasse, è necessario utilizzare un punto di interruzione condizionale. Ad esempio, se la superclasse è UIViewController, si potrebbe fare qualcosa di simile:

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

Per cambiare x86 (id)$arg1 a *(id*)($ebp+8).

Infine, se si vuole veramente conoscere il flusso di controllo attraverso varie classi, controllare dtrace. Probabilmente è più adatto a questo di un debugger.

+0

Sono confuso cosa intendi per '\ [ClassName (\ (. * \)). * \] $', Tuttavia '\ [FooViewController. * \] $' Ha fatto il trucco per me. Mi piace anche che omettendo il $ causa i breakpoint anche sui blocchi. Anche la regex per rompere i metodi della superclasse è bella. Grazie per i suggerimenti, e sarò sicuro di controllare dtrace. – tboyce12

+0

Ci sarebbe dovuto essere '?' Dopo '(\ (. * \))'. Quella parte è per abbinare le categorie, ad es. '- [UIView (Geometry) setFrame:]'. Lo tirerò fuori perché non dovrebbe essere necessario. –

+0

Dove scrivo questo comando. Si prega di suggerire su console o sul terminale o nel codice. – Chandni

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

"br se" è l'abbreviazione di "set punto di interruzione", passare il proprio nome del file per l'argomento -f, e l'argomento -p è un'espressione regolare greggio per le proprietà e metodi in Objective C.

Avvertenze : Questo non sembra funzionare per i file .h, quindi se si hanno proprietà dichiarate nell'intestazione che si desidera guardare, potrebbe essere necessario impostare i watchpoint sulle loro variabili di istanza di supporto.

Questa è la soluzione migliore che ho trovato finora, si prega di inviare soluzioni alternative se si pensa che saranno utili.

Problemi correlati