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.

2voto

Craig Ringer Points 72371

Notez que aucun de ceux-ci ne vous aidera si vous voulez identifier où le processus avait des segments de mémoire partagée, des régions mmap(), etc. mappés dans son espace d'adressage.

Cette information ne semble pas être incluse dans le noyau. Ni maintenance info target-sections ni maintenance info target ne le montrent.

(Donc, cela ne semble probablement pas exister, ou tout au plus est dans une section de base que gdb n'utilise pas. Il pourrait être possible de le déduire à partir de l'état interne de la bibliothèque libc, mais pas de manière générique).

1voto

Ta Thanh Dinh Points 201

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

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