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.
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.
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
Je viens de voir ce qui suit:
set mem inaccessible-by-default [on|off]
Cela vous permettra peut-être de chercher sans égard si la mémoire est accessible.
Vous pouvez aussi utiliser info files
pour répertorier toutes les sections de tous les fichiers binaires chargés dans le processus binaire.
(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.
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
).