web-dev-qa-db-fra.com

Comment imprimer de la mémoire dans 0xb0987654 en utilisant lldb?

J'utilise LLDB, je me demande comment imprimer la valeur dans la mémoire 0xb0987654?

40
Adam Lee

Xcode a une très belle fenêtre Navigateur de mémoire , qui affichera très bien le contenu des adresses mémoire. Il vous permet également de contrôler le regroupement d'octets et le nombre d'octets affichés, et de faire reculer ou avancer une page mémoire:

enter image description here

Vous pouvez y accéder en appuyant sur ⌘ ^ ⌥⇧M (⌘⇧M dans Xcode 9 et versions antérieures)

ou

Débogage -> Workflow de débogage -> Afficher la mémoire

Remarquez le champ dans son coin inférieur gauche où vous pouvez coller l'adresse mémoire que vous souhaitez inspecter!

Documentation ici: https://developer.Apple.com/library/ios/recipes/xcode_help-debugger/articles/viewing_memory.html

Réponse connexe ici: Comment puis-je ouvrir le navigateur de mémoire dans Xcode 4?

60
Eric

Pour compléter la réponse de Michael.

J'ai tendance à utiliser:

memory read -s1 -fu -c10000 0xb0987654 --force

Cela s'imprimera dans le débogueur.

  1. -s pour le regroupement d'octets donc utilisez 1 pour uint8 par exemple et 4 pour int
  2. -f pour le format. J'oublie par nature le bon symbole. Mettez simplement la déclaration avec -f et elle vous reviendra et vous donnera la liste de toutes les options
  3. -c est pour le nombre d'octets
  4. si vous imprimez plus de 1024 octets, ajoutez avec --force

J'espère que cela t'aides.

43
Khaled Barazi

"me" est la commande que vous recherchez.

Par exemple, cette commande lldb:

me -r -o /tmp/mem.txt -c512 0xb0987654

copiera 512 octets de votre adresse mémoire dans un fichier à /tmp/mem.txt.

8

Voici une astuce simple pour afficher des tableaux typés de longueur fixe dans lldb. Si votre programme contient une variable longue * qui pointe vers 9 éléments, vous pouvez déclarer un type struct qui contient un tableau fixe de 9 valeurs longues et convertir le pointeur sur ce type:

long *values = new long[9]{...};

(lldb) expr typedef struct { long values[9]; } l9; *(l9 *)values
(l9) $1 = {
  values = {
    [0] = 0
    [1] = 1
    [2] = 4
    [3] = 9
    [4] = 16
    [5] = 25
    [6] = 36
    [7] = 49
    [8] = 64
  }
}

J'utilise le typedef lorsque je code en C, ce n'est pas nécessaire en C++.

1
Patrick Beard

par exemple, une mémoire d'impression de 16 x 4 octets.

x/16  0xb0987654
0
lbsweek