È possibile utilizzare DTrace per monitorare un'applicazione in esecuzione per visualizzare i metodi e le classi chiamate. Si può facilmente monitorare un app iOS in esecuzione nel simulatore usando DTrace sulla riga di comando, In primo luogo è necessario trovare il PID dell'applicazione utilizzando ps
e quindi è possibile eseguire una sonda DTrace come la seguente:
sudo dtrace -q -n 'objc1234:::entry { printf("%s %s\n", probemod, probefunc); }'
dove 1234 è l'ID di processo dell'app.
Questo produrrà un output che appare simile al seguente:
UIStatusBarItemView -isVisible
UIStatusBarLayoutManager -_positionAfterPlacingItemView:startPosition:
UIView(Geometry) -frame
CALayer -frame
UIStatusBarLayoutManager -_startPosition
UIView(Geometry) -bounds
CALayer -bounds
UIStatusBarItemView -standardPadding
UIStatusBarItem -appearsOnLeft
UIStatusBarItem -leftOrder
Se siete interessati solo a tracciare una singola classe, UIView
ad esempio, è possibile utilizzare:
sudo dtrace -q -n 'objc1234:UIView::entry { printf("%s %s\n", probemod, probefunc); }'
Se si voleva per tracciare tutte le chiamate a dealloc
su tutte le classi, si può usare:
sudo dtrace -q -n 'objc1234::-dealloc:entry { printf("%s %s\n", probemod, probefunc); }'
Ovviamente, è possibile combinare questi per vedere solo UIView
dealloc
s:
sudo dtrace -q -n 'objc1234:UIView:-dealloc:entry { printf("%s %s\n", probemod, probefunc); }'
Se si vuole essere in grado di distinguere un oggetto specifico di una classe si potrebbe anche stampare l'indirizzo di memoria dell'oggetto (self
) utilizzando il seguente:
sudo dtrace -q -n 'objc1234:UIView:-dealloc:entry { printf("%s (0x%p) %s\n", probemod, arg0, probefunc); }'
DTrace è estremamente potente e può fare molto più di quanto non abbia mostrato qui.
@trojanfoe: buona ricerca. Va notato che la risposta accettata non fa ciò che (credo) 動靜 能量 sta chiedendo perché richiede che il metodo sia conosciuto in anticipo, ma sia [Ole Begemann's] (http://stackoverflow.com/a/1632030 /) o [emp's] (http://stackoverflow.com/a/7130268/603977) la risposta funzionerà. –
In effetti, stavo essenzialmente suggerendo la soluzione di emp da solo. –
non è un duplicato, sta chiedendo di intercettare tutti i metodi, non solo uno ... usando lo swizzling qui significa re-implementare l'intera classe. – bontoJR