2013-06-03 4 views
12

Quindi, in un punto di interruzione, ho un'istanza di oggetto casuale. Voglio capire quali oggetti hanno un puntatore a questo oggetto. C'è un modo per vederlo nella console del debugger? Forse qualcosa che mi mostra tutti gli oggetti che hanno un fermo sull'oggetto?LLDB: mostra tutti gli oggetti con un puntatore a un oggetto in memoria

Esempio: ho un'istanza NSViewController e voglio vedere tutti gli altri oggetti che contengono un puntatore questa istanza del controller della vista. Ciò sarebbe utile perché mi consentirebbe di vedere la gerarchia del controller di visualizzazione che incapsula la mia istanza.

Solo un pensiero pazzo che ho avuto sarebbe davvero di aiuto a volte.

+1

Non sono sicuro che sia possibile. Nemmeno il runtime mantiene quel tipo di informazione, perché significherebbe che il bambino ha conoscenza del proprio genitore (viola le regole di dipendenza). – CodaFi

+0

Forse hai ragione. Stavo pensando più a una ricerca di memoria stupida per oggetti che contengono un puntatore a 0x2827 ... –

+0

Una ricerca di memoria stupida non troverà oggetti, però. Troverà i dati ma non saprà cosa rappresenta. – StilesCrisis

risposta

26

In lldb, usa command script import lldb.macosx.heap per installare alcune funzioni di ricerca della memoria . Il comando ptr_refs dovrebbe essere in grado di fare ciò che vuoi; utilizzare ptr_refs --help per saperne di più.

+2

'ptr_refs' è la strada da percorrere. Se lanci la tua app con la variabile di ambiente 'MallocStackLogging = 1', puoi fare' ptr_refs --stack ADDRESS' e non solo vedere tutti i blocchi di memoria che contengono quell'indirizzo, ma il backtrace quando quel blocco oggetto/memoria è stato allocato o liberato. Nota che 'ptr_refs' è solo per le app di Mac OS X a questo punto - il modo in cui viene implementato in Xcode 4.6 impedisce che funzioni su iOS. –

+2

Con Xcode 6.3 ho usato con successo 'ptr_refs' su un'app per iOS sia su un dispositivo (iOS 7.1.2) che sul simulatore (iOS 8.3), quindi sembra che non sia più limitato a Mac OS X. – user2067021

+0

@ user2067021, E cosa hai importato perché funzioni? 'lldb.ios.heap' non sembra esistere –

0

Non una soluzione efficiente, o applicabile in tutti i casi, ma è possibile incapsulare l'oggetto che si sta cercando in un metodo accessor su una delle classi e inserire un punto di interruzione all'interno. Passando attraverso la fine del metodo di accesso, è possibile visualizzare tutti i punti di chiamata.

In alternativa, è possibile rimuovere la definizione della variabile, e il compilatore sputerà un sacco di errori, ognuno sarà anche una chiamata a questo oggetto.

Suggerirei di usare ARC se non lo sei già. Idealmente il tuo codice non sarebbe abbastanza disordinato da non essere in grado di identificare i riferimenti leggendo il codice, ARC può aiutare un po 'in quel dipartimento