54 votes

GDB: Listing all mapped memory regions for a crashed process

J'ai un vidage de cœur complet d'un processus mort sur une machine Linux x86 (noyau 2.6.35-22 si cela importe), que j'essaie de déboguer dans GDB.

Y a-t-il une commande GDB que je peux utiliser qui signifie "montrez-moi une liste de toutes les régions d'adresses mémoire allouées par ce processus?" En d'autres termes, puis-je savoir quelles sont toutes les adresses mémoire valides possibles que je peux examiner dans ce vidage?

La raison pour laquelle je demande est que j'ai besoin de rechercher dans toute la pile du processus une certaine chaîne binaire, et pour utiliser la commande find, j'ai besoin d'avoir une adresse de début et de fin. La simple recherche de 0x00 à 0xff.. ne fonctionne pas car find s'arrête dès qu'il rencontre une adresse à laquelle il ne peut pas accéder:

(gdb) find /w 0x10000000, 0xff000000, 0x12345678

avertissement : Impossible d'accéder à la mémoire cible à l'adresse 0x105ef883, arrêt de la recherche.

Je dois donc obtenir une liste de toutes les régions d'adresses lisibles en mémoire afin de pouvoir les rechercher une par une.

(La raison pour laquelle j'ai besoin de faire cela est que je dois trouver toutes les structures en mémoire qui pointent vers une certaine adresse.)

Aucune des commandes show mem, show proc, info mem, info proc ne semblent faire ce dont j'ai besoin.

82voto

Employed Russian Points 50479

Dans GDB 7.2 :

(gdb) help info proc
Afficher les informations du processus /proc sur n'importe quel processus en cours d'exécution.
Spécifiez n'importe quel ID de processus, ou utilisez le programme en cours de débogage par défaut.
Spécifiez l'un des mots-clés suivants pour des informations détaillées :
  mappings -- liste des régions de mémoire mappées.
  stat     -- liste d'un tas d'infos aléatoires sur le processus.
  status   -- liste d'un tas d'autres infos aléatoires sur le processus.
  all      -- Liste de toutes les informations /proc disponibles.

Vous voulez info proc mappings, sauf que ça ne fonctionne pas quand il n'y a pas de /proc (comme pendant le débogage post-mortem).

Essayez plutôt maintenance info sections.

17voto

vedasolutions Points 259

Si vous avez le programme et le fichier core, vous pouvez suivre les étapes suivantes.

1) Exécutez gdb sur le programme avec le fichier core

 $gdb ./test core

2) tapez info files et voyez quels différents segments sont présents dans le fichier core.

    (gdb)info files

Une sortie d'exemple:

    (gdb)info files 

    Symboles de "/home/emntech/debugging/test".
    Fichier de vidage de core local :
`/home/emntech/debugging/core', type de fichier elf32-i386.
  0x0055f000 - 0x0055f000 est load1
  0x0057b000 - 0x0057c000 est load2
  0x0057c000 - 0x0057d000 est load3
  0x00746000 - 0x00747000 est load4
  0x00c86000 - 0x00c86000 est load5
  0x00de0000 - 0x00de0000 est load6
  0x00de1000 - 0x00de3000 est load7
  0x00de3000 - 0x00de4000 est load8
  0x00de4000 - 0x00de7000 est load9
  0x08048000 - 0x08048000 est load10
  0x08049000 - 0x0804a000 est load11
  0x0804a000 - 0x0804b000 est load12
  0xb77b9000 - 0xb77ba000 est load13
  0xb77cc000 - 0xb77ce000 est load14
  0xbf91d000 - 0xbf93f000 est load15

Dans mon cas, j'ai 15 segments. Chaque segment a un début d'adresse et une fin d'adresse. Choisissez un segment pour rechercher des données. Par exemple, sélectionnons load11 et cherchons un motif. Load11 a une adresse de début de 0x08049000 et se termine à 0x804a000.

3) Recherchez un motif dans le segment.

(gdb) find /w 0x08049000 0x0804a000 0x8048034
 0x804903c
 0x8049040
 2 motifs trouvés

Si vous n'avez pas de fichier exécutable, vous devez utiliser un programme qui imprime les données de tous les segments d'un fichier core. Ensuite, vous pouvez rechercher des données particulières à une adresse. Je ne trouve aucun programme de ce type, vous pouvez utiliser le programme sur le lien suivant qui imprime les données de tous les segments d'un fichier core ou d'un fichier exécutable.

 http://emntech.com/programs/printseg.c

7voto

abhi Points 886

Vous pouvez également utiliser fichiers d'information pour répertorier toutes les sections de tous les binaires chargés dans le binaire du processus.

5voto

tothphu Points 185

Je viens de voir ceci:

set mem inaccessible-by-default [on|off]

ici

Cela pourrait vous permettre de rechercher sans tenir compte de l'accessibilité de la mémoire.

4voto

alexei Points 338
(gdb) maintenance info sections 
Fichier exécutable : 
    `/chemin/vers/app.out', type de fichier elf32-littlearm. 
    0x0000->0x0360 à 0x00008000 : .intvecs ALLOC LOAD READONLY DATA HAS_CONTENTS 

Ceci est un commentaire de phihag ci-dessus, mérite une réponse séparée. Cela fonctionne mais info proc ne fonctionne pas sur le arm-none-eabi-gdb v7.4.1.20130913-cvs du paquet gcc-arm-none-eabi Ubuntu.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X