Gdb: liste de toutes les régions de mémoire mappées pour un processus écrasé

J'ai un vidage de noyau complet d'un processus mort sur une machine Linux x86 (noyau 2.6.35-22 si cela compte), 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'adresse mémoire allouées par ce processus?"En d'autres termes, puis-je comprendre quelles sont toutes les adresses de mémoire valides possibles que je peux examiner dans ce vidage?

La raison pour laquelle je demande est que je dois rechercher dans l'ensemble du processus heap pour une certaine chaîne binaire, et pour utiliser la commande find, j'ai besoin d'une adresse de début et de fin. Il suffit de chercher 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) trouver /w 0x10000000, 0xff000000, 0x12345678

Avertissement: impossible d'accéder à la mémoire cible à 0x105ef883, arrêt rechercher.

J'ai donc besoin d'obtenir une liste de toutes les régions d'adresses lisibles en mémoire afin que je puisse recherche un à la fois.

(la raison pour laquelle je dois faire que {[12] } est que j'ai besoin de trouver toutes les structures en mémoire ce point à une certaine adresse.)

Aucun de show mem, show proc, info mem, info proc semblent faire ce dont j'ai besoin.

46
demandé sur Crashworks 2011-04-17 07:14:44

6 réponses

Dans gdb 7.2:

(gdb) help info proc
Show /proc process information about any running process.
Specify any process id, or use the program being debugged by default.
Specify any of the following keywords for detailed info:
  mappings -- list of mapped memory regions.
  stat     -- list a bunch of random process info.
  status   -- list a different bunch of random process info.
  all      -- list all available /proc info.

Vous voulez info proc mappings, sauf que cela ne fonctionne pas quand il n'y a pas de /proc (comme lors du débogage pos-mortem).

Essayez maintenance info sections à la place.

67
répondu Employed Russian 2011-04-17 04:59:03

Si vous avez le programme et le fichier de base, vous pouvez effectuer les étapes suivantes.

1) Exécutez le gdb sur le programme avec le fichier de base

 $gdb ./test core

2) Tapez des fichiers d'informations et voyez quels sont les différents segments dans le fichier principal.

    (gdb)info files

Un exemple de sortie:

    (gdb)info files 

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

Dans mon cas, j'ai 15 segments. Chaque segment a le début de l'adresse et la fin de l'adresse. Choisissez n'importe quel segment pour rechercher des données. Par exemple, permet de sélectionner load11 et de rechercher un motif. Load11 a adresse de départ 0x08049000 et se termine à 0x804a000.

3) recherchez un motif dans le segment.

(gdb) find /w 0x08049000 0x0804a000 0x8048034
 0x804903c
 0x8049040
 2 patterns found

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 une donnée particulière à une adresse. Je ne trouve aucun programme en tant que tel, vous pouvez utiliser le programme sur le lien suivant qui imprime les données de tous les segments d'un noyau ou d'un fichier exécutable.

 http://emntech.com/programs/printseg.c
15
répondu 2012-03-02 07:41:25

Je viens de voir ce qui suit:

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

Ici

Il peut vous permettre de rechercher sans tenir compte si la mémoire est accessible.

5
répondu tothphu 2012-03-01 22:40:20
(gdb) maintenance info sections 
Exec file:
    `/path/to/app.out', file type elf32-littlearm.
    0x0000->0x0360 at 0x00008000: .intvecs ALLOC LOAD READONLY DATA HAS_CONTENTS

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

4
répondu alexei 2014-04-22 23:02:28

Vous pouvez également utiliser info files pour lister toutes les sections de tous les binaires chargés dans process binary.

4
répondu abhi 2014-11-25 21:43:14

Le problème avec maintenance info sections est que la commande essaie d'extraire des informations de l'en-tête de section du binaire. Cela ne fonctionne pas si le binaire est déclenché (par exemple par sstrip) ou il donne des informations erronées lorsque le chargeur peut changer l'autorisation de mémoire après le chargement (par exemple le cas de RELRO).

0
répondu Ta Thanh Dinh 2017-04-07 07:22:01