Le vidage de mémoire n'est que le vidage de l'empreinte mémoire de vos programmes, si vous savez où tout était, vous pouvez simplement l'utiliser.
Vous utilisez l'exécutable car il explique où (en termes d'adresses logiques) les choses se trouvent dans la mémoire, c'est-à-dire le fichier principal.
Si vous utilisez une commande, objdump
elle videra les métadonnées sur l'objet exécutable que vous étudiez. Utilisation d'un objet exécutable nommé a.out comme exemple.
objdump -h a.out
vide les informations d'en-tête uniquement, vous verrez des sections nommées par exemple. .data ou .bss ou .text (il y en a beaucoup plus). Ceux-ci informent le chargeur du noyau où dans l'objet diverses sections peuvent être trouvées et où dans l'espace d'adressage du processus la section doit être chargée, et pour certaines sections (par exemple .data .text) ce qui doit être chargé. (La section .bss ne contient aucune donnée dans le fichier mais elle fait référence à la quantité de mémoire à réserver dans le processus pour les données non initialisées, elle est remplie de zéros).
La disposition du fichier objet exécutable est conforme à un ELF standard.
objdump -x a.out
- décharge tout
Si l'objet exécutable contient toujours ses tables de symboles (il n'a pas été supprimé - man strip
et vous avez utilisé -g
pour générer une génération de débogage en gcc
supposant une compilation de source CA), alors vous pouvez examiner le contenu principal par des noms de symboles, par exemple si vous aviez une variable / tampon nommé inputLine dans votre code source, vous pouvez utiliser ce nom gdb
pour consulter son contenu. c.-à gdb
-d. connaîtrait l'offset depuis le début du segment de données initialisé de votre programme où commence InputLine et la longueur de cette variable.
Pour en savoir plus sur l' article 1 , l'
article 2 , et pour la spécification Nitty Gritty Executable and Linking Format (ELF) .
Mettre à jour après le commentaire @mirabilos ci-dessous.
Mais si vous utilisez la table des symboles comme dans
$ gdb --batch -s a.out -c core -q -ex "x buf1"
Produit
0x601060 <buf1>: 0x72617453
puis ne pas utiliser la table des symboles et examiner l'adresse directement dans,
$ gdb --batch -c core -q -ex "x 0x601060"
Produit
0x601060: 0x72617453
J'ai examiné la mémoire directement sans utiliser la table des symboles dans la 2e commande.
Je vois également que la réponse de @ user580082 ajoute des explications et fera un vote positif.