web-dev-qa-db-fra.com

GDB: Liste de toutes les régions de mémoire mappées pour un processus bloqué

J'ai un dump complet du noyau d'un processus mort sur une machine Linux x86 (noyau 2.6.35-22 si c'est important), que je tente de déboguer dans GDB.

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

La raison pour laquelle je pose cette question est que je dois rechercher une certaine chaîne binaire dans le segment de processus entier, et pour pouvoir utiliser la commande find, il faut que mes débuts et fins se terminent. adresse. Rechercher simplement de 0x00 à 0xff .. ne fonctionne pas car find s'arrête dès qu'il rencontre une adresse à laquelle il n'a pas accès:

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

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

Je dois donc obtenir une liste de toutes les régions d'adresses lisibles en mémoire pour pouvoir les rechercher une à la fois.

(La raison pour laquelle je dois faire que est que je dois trouver toutes les structures en mémoire qui pointent à une certaine adresse.)

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

49
Crashworks

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.

Tu veux 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 au lieu.

73
Employed Russian

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

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

 $gdb ./test core

2) tapez des fichiers d’information et voyez quels sont les différents segments présents dans le fichier de base.

    (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 un segment dans lequel rechercher des données. Par exemple, sélectionnons load11 et recherchons un motif. Load11 a l'adresse de début 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 permettant d'imprimer 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 l’utiliser au lien suivant qui affiche les données de tous les segments d’un fichier core ou d’un fichier exécutable.

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

Je viens de voir ce qui suit:

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

ici

Cela vous permettra peut-être de chercher sans égard si la mémoire est accessible.

5
tothphu

Vous pouvez aussi utiliser info files pour répertorier toutes les sections de tous les fichiers binaires chargés dans le processus binaire.

4
abhi
(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 dans le paquetage arm-none-eabi-gdb v7.4.1.20130913-cvs du paquetage gcc-arm-none-eabi Ubuntu.

4
alexei

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

0
Ta Thanh Dinh