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.
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.
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
(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.
Vous pouvez également utiliser info files
pour lister toutes les sections de tous les binaires chargés dans process binary.
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
).