2016-03-19 30 views
6

Sto provando a stampare l'indirizzo di una variabile con lldb. Tuttavia, chiamando print &(myVar) stampa il contenuto della variabile invece del suo indirizzo.lldb: Stampa dell'indirizzo di una variabile

(lldb) print &(myVar) 
(const string *) $18 = "hello" 

Uguale a expression &(myVar).

(lldb) expression &(myVar) 
(const string *) $19 = "hello" 

Ho provato anche expression s' -L opzione:

(lldb) expression -L -- &(myVar) 
0x00000000021aea80: (const string *) $20 = "hello" 

(lldb) expression -L -- myVar 
0x0000000002a15430: (std::string) $23 = "hello" 

Tuttavia l'indirizzo cambia emesso ogni volta invoco expression -L. Quindi sto assumendo che non corrisponda all'indirizzo della variabile in memoria.

Come si ottiene l'indirizzo della variabile in memoria?

(io uso lldb 3.4)

risposta

8

Sì, la posizione -L ti sta dicendo sulla variabile che lldb fa per rappresentare il risultato di espressione, in modo che non è ciò che si desidera. Anche se il comando comune alias print fa sembrare che questo comando stampi solo valori, fa molto più di questo: ad es. creare nuove entità nel programma in esecuzione. Quindi la posizione del risultato dell'espressione non è banalmente correlata all'espressione che hai valutato.

In ogni caso, ci sono due semplici modi per ottenere questo. Il primo è quello di spegnere la sintesi di stringa, in modo da poter vedere il risultato effettivo della stampa all'indirizzo:

(lldb) expr --raw -- &my_string 
(string *) $14 = 0x00007fff5fbff618 

Un altro modo per ottenere gli stessi dati è quello di utilizzare il comando "variabile frame". Questo comando ti dà accesso alle variabili locali, senza il sovraccarico del parser di espressioni complete. Dal momento che frame variable stampe le variabili direttamente come riportato dal informazioni di debug, in questo caso l'opzione -L è esattamente la posizione della variabile:

(lldb) frame var -L my_string 
0x00007fff5fbff618: (std::__1::string) my_string = "Some string here" 
+0

Grazie per la risposta dettagliata! –