2015-01-23 16 views
10

In Objective-C, a volte imposterei i watchpoint in LLDB per farmi sapere quando sono cambiate le variabili di istanza. Posso farlo anche con le proprietà di Swift?È possibile impostare i watchpoint sulle proprietà Swift?

In questo momento, l'unico modo in cui posso raggiungere questo obiettivo è:

  • l'aggiunta di un gestore didSet alla proprietà e l'impostazione di un punto di interruzione all'interno (ma questo richiede l'arresto del programma e ricompilazione, che tipo di sconfitte lo scopo)
  • l'aggiunta di un punto di interruzione simbolico [setPropertyName:] ma questo funziona solo se la classe accade per sostenere Objective-C colmare

Devo tutte le altre opzioni?

risposta

14

La risposta è stata molto più semplice di quanto immaginassi. Il modo più semplice per farlo è semplicemente aggiungere un punto di interruzione nella dichiarazione delle proprietà. Il debugger si interromperà ogni volta che la proprietà viene letta o scritta.

Se, come me, si desidera interrompere solo quando la proprietà viene modificata e ignorare i recuperi, impostare un punto di interruzione nella dichiarazione di proprietà, quindi accedere alla console LLDB e digitare "lista br" per visualizzare un elenco di tutti punti di interruzione:

(lldb) br list 
Current breakpoints: 
1: file = '/Users/testuser/Desktop/TestFoo/Test.swift', line = 12, locations = 3, resolved = 3, hit count = 1 

    1.1: where = TestFoo`TestFoo.Test.x.getter : Swift.Int + 12 at Test.swift:12, address = 0x00000001084cfefc, resolved, hit count = 1 
    1.2: where = TestFoo`TestFoo.Test.x.setter : Swift.Int + 16 at Test.swift:12, address = 0x00000001084cff80, resolved, hit count = 0 
    1.3: where = TestFoo`TestFoo.Test.x.materializeForSet : Swift.Int + 16 at Test.swift:12, address = 0x00000001084d00f0, resolved, hit count = 0 

Come potete vedere, c'è un punto di interruzione master "1" con tre sotto-punti di interruzione. Disabilitare il sub-punto di interruzione per il getter:

(lldb) br disable 1.1 
1 breakpoints disabled. 

ed è tutto pronto. Il debugger si interromperà solo quando quella proprietà viene modificata.

1

Su XCode (8.2 Swift 3.0) impostare il punto di interruzione normalmente sulla proprietà swift, quindi eseguire l'app. Dopo l'applicazione è corse andare al pannello di punto di interruzione è possibile espandere il punto di interruzione in più punti di interruzione:

enter image description here

Tutti sono selezionati per impostazione predefinita, è possibile disattivare quelli non necessari. NOTA: ho scoperto che quando si aggiunge il punto di interruzione non si espande fino a quando non si esegue l'app.

Un metodo alternativo che è possibile provare è utilizzare lldb per aggiungerli. Per prima cosa aggiungi il punto di interruzione da qualche parte all'interno dell'istanza della classe, ad esempio viewDidLoad ext. p auto e annota l'indirizzo di memoria della tua istanza.

Quindi aggiungere il punto di interruzione in questo modo dove 0x0f0f0f0f0f0f è l'indirizzo di memoria della classe.

break set -F '-[MyClass setMyProperty:]' -c '$rdi == 0x0f0f0f0f0f0f’ 
Problemi correlati