Come modificare il valore delle variabili durante il debug con LLDB in Xcode?


173

In Xcode, GDB ti consente di modificare le variabili locali durante il debug (vedi come modificare il valore NSString durante il debug in XCode? ). LLDB offre una funzionalità simile? In tal caso, come possiamo usarlo?


1
Assicurati di vedere il debug avanzato in iOS . È fantastico
Honey,

Sto cercando di impostare una proprietà object, che funziona se la lunghezza della stringa è compresa tra 0-15 caratteri. L'impostazione di una stringa di 16 o più caratteri è accettata, ma quando lo stampa indietro, mi mostra una stringa senza senso: po myObj.someString = "1234567890123456", che funziona, ma quando stampo ottengo (String? $ R68 = " \ 0 \ 0 \ 0 \ 0 @ \ a \ u {1} \ c {5} \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ "
Nick Wright

Risposte:


267
expr myString = @"Foo"

(lldb) help expr
Valuta un'espressione C / ObjC / C ++ nel contesto del programma corrente, usando le variabili attualmente nell'ambito. Questo comando accetta input "non elaborati" (non è necessario citare cose).

Sintassi: espressione -

Opzioni del comando Utilizzo: espressione [-f] [-G] [-d] [-u] - espressione [-o] [-d] [-u] - espressione

   -G <gdb-format>  ( --gdb-format <gdb-format> )
        Specify a format using a GDB format specifier string.

   -d <boolean>  ( --dynamic-value <boolean> )
        Upcast the value resulting from the expression to its dynamic type
        if available.

   -f <format>  ( --format <format> )
        Specify a format to be used for display.

   -o  ( --object-description )
        Print the object description of the value resulting from the
        expression.

   -u <boolean>  ( --unwind-on-error <boolean> )
        Clean up program state if the expression causes a crash, breakpoint
        hit or signal.

Esempi:

expr my_struct-> a = my_array [3]
expr -f bin - (indice * 8) + 5
expr char c [] = "pippo"; c [0]

NOTA IMPORTANTE: poiché questo comando accetta input "raw", se si utilizzano opzioni di comando è necessario utilizzare "-" tra la fine delle opzioni di comando e l'inizio dell'input raw.

"expr" è un'abbreviazione di "espressione"


1
Grazie davvero! Un'altra piccola domanda: lo sto facendo per provare a cambiare il testo di un UILabel: 'expr myLabel.text = @"hello!"ma ho un error: property 'text' not found on object of type 'UILabel *'... Qualche idea?
Eric

10
expr (void)[label setText:@"Foo"]dovrebbe farlo. La sintassi del punto di solito non funziona nel debugger. Probabilmente lldb lo interpreta come se volessi accedere a un membro di una c-struct, ma non sono sicuro che questa sia la ragione per cui non funzionerà. Dot-Syntax non funziona poneanche per . invece di po label.textte devi usarepo [label text]
Matthias Bauch il

4
In realtà, lldb gestisce la sintassi dei punti molto meglio di gdb. gdb presuppone che tu lo stia trattando come una C-struct, che fallisce. lldb accederà correttamente alle proprietà, ma solo se sono effettivamente dichiarate con @property.
BJ Homer,

28
Puoi anche usare pcome scorciatoia per expr. Esempio:(lldb) p url = @"http://google.com"
funroll

11
Puoi anche usare ecome scorciatoia per expr. A proposito, pè un alias per la stampa che è un alias per expr --(solo per valutare l'input grezzo, senza flag) expr -o -- [object]o che in pogenere ti dà un output più utile per gli oggetti.
Jason Newell,

21

Le seguenti cose funzionano per me. Sto usando Xcode 8.

Se si desidera impostare una variabile (ad esempio un "dict") su zero e quindi testare il flusso di codice, è possibile provare quanto segue.

  1. Posizionare correttamente il punto di interruzione dopo l'inizializzazione sul valore desiderato.
  2. quindi esegui "espressione dict = nil" nella riga di comando di lldb per cambiarlo. (ad esempio "zero")
  3. Oltrepassa il punto di interruzione.
  4. Controlla la variabile "dict" nella riga successiva. Sarà zero.

Sembrerà qualcosa di simile nella console.

(lldb) expression dict = nil
(NSDictionary *) $5 = nil

3

Se si utilizza Xcode 10 o 11, inserire correttamente il punto di interruzione dopo l'inizializzazione della variabile richiesta, quindi è possibile modificare po myString = "Hello World"facilmente la variabile .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.