Je ne suis pas sûr de savoir comment vider toute la mémoire dans un fichier sans le faire plusieurs fois (si quelqu'un connaît un moyen automatisé d'obtenir que gdb le fasse, merci de me le faire savoir), mais les procédures suivantes fonctionnent pour tout lot de mémoire en supposant que vous le sachiez le pid:
Choisissez un lot de mémoire (par exemple, 00621000-00622000), puis utilisez gdb en tant que racine pour l'attacher au processus et videz cette mémoire:
Impressionnant! Je viens de l'utiliser pour découvrir quel script une instance mystérieuse de bash était en cours d'exécution.
Tobia
Pourquoi recherchez-vous uniquement des plages avec des rw-pautorisations?
mxmlnkn
@mxmlnkn C'est data ( rw-p), les autres plages sont pour code ( r-xp). Si vous voulez un dump des deux, alors allez-y et échangez greppar exemple cat.
A. Nilsson
39
essayer
gcore $pid
où $pidest le nombre actuel du pid; pour plus d'informations, voir:info gcore
le dump peut prendre un peu de temps, et une partie de la mémoire peut ne pas être lisible, mais est assez bonne ... sachez aussi qu'il peut créer de gros fichiers, je viens de créer un fichier de 2 Go de cette façon ..
Cela ne suffit pas, la lecture d'un autre processus nécessite une combinaison de / proc / <pid> / {mem, * maps}, ptrace et de la gestion du signal pour éviter de suspendre le processus cible.
J'ai également créé mon propre programme pour vider toute la mémoire du processus, elle est en C et peut donc être compilée de manière croisée sur Android, ce dont j'avais besoin.
Vous pouvez également spécifier une adresse IP et un port TCP. Code source ici .
Donc, d'après ce que j'ai compris, l'idée de nettoyage est que seuls les fichiers en mémoire ont une taille attachée à la région mémoire contrairement à la mémoire réelle de l'application, qui a la taille 0 (la taille réellement utilisée est inconnue du OS).
Mxmlnkn
Un problème que j'ai avec ce script est que la taille de bloc de 1 conduit à une bande passante de ~ 30 Ko / s trop lente comparée à l'utilisation d'une taille de bloc égale à la taille de la page (4096 pour moi) pour laquelle j'obtiens ~ 100 Mo / s! Voir ici . getconf PAGESIZEest utilisé pour obtenir la taille de la page et ensuite les adresses et les comptes sont divisés par elle.
mxmlnkn
1
Outil de sauvegarde du processus vers la sortie standard, pcat / memdump:
Celui-ci est obsolète (supprimé à la demande du responsable); J'ai quand même installé l'ancien paquet et cela a échoué avec "Erreur d'entrée / sortie; avez-vous utilisé GCC avec les fichiers d'en-tête d'une autre machine?".
Tobu
0
Vous pouvez maintenant utiliser procdump de la suite SysInternals sous Linux:
Si vous souhaitez vider un segment de mémoire distinct du processus en cours sans créer un fichier core énorme (par exemple avec gcore), vous pouvez utiliser un petit outil à partir d' ici . Il existe également une ligne dans README si vous souhaitez transférer tous les segments lisibles dans des fichiers séparés.
/proc/$pid/mem
.Réponses:
Je ne suis pas sûr de savoir comment vider toute la mémoire dans un fichier sans le faire plusieurs fois (si quelqu'un connaît un moyen automatisé d'obtenir que gdb le fasse, merci de me le faire savoir), mais les procédures suivantes fonctionnent pour tout lot de mémoire en supposant que vous le sachiez le pid:
Ce sera dans le format (exemple):
Choisissez un lot de mémoire (par exemple, 00621000-00622000), puis utilisez gdb en tant que racine pour l'attacher au processus et videz cette mémoire:
Ensuite, analysez / root / output avec la commande strings, moins vous voulez le PuTTY sur tout votre écran.
la source
J'ai fait un script qui accomplit cette tâche.
L'idée vient de la réponse de James Lawrie et de cet article: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
mettre ceci dans un fichier (par exemple "dump-all-memory-of-pid.sh") et le rendre exécutable
usage:
./dump-all-memory-of-pid.sh [pid]
La sortie est imprimée dans des fichiers avec les noms suivants:
pid-startaddress-stopaddress.dump
Les dépendances:
gdb
la source
rw-p
autorisations?rw-p
), les autres plages sont pour code (r-xp
). Si vous voulez un dump des deux, alors allez-y et échangezgrep
par exemplecat
.essayer
où
$pid
est le nombre actuel du pid; pour plus d'informations, voir:info gcore
le dump peut prendre un peu de temps, et une partie de la mémoire peut ne pas être lisible, mais est assez bonne ... sachez aussi qu'il peut créer de gros fichiers, je viens de créer un fichier de 2 Go de cette façon ..
la source
gcore
dumping est-il un fichier fragmenté?l'homme proc dit:
Peut-être que cela peut vous aider
la source
J'ai également créé mon propre programme pour vider toute la mémoire du processus, elle est en C et peut donc être compilée de manière croisée sur Android, ce dont j'avais besoin.
Vous pouvez également spécifier une adresse IP et un port TCP. Code source ici .
la source
Solution pure bash:
Utilisation: PID procdump
pour un dépotoir plus propre:
la source
getconf PAGESIZE
est utilisé pour obtenir la taille de la page et ensuite les adresses et les comptes sont divisés par elle.Outil de sauvegarde du processus vers la sortie standard, pcat / memdump:
la source
Vous pouvez maintenant utiliser procdump de la suite SysInternals sous Linux:
https://github.com/Microsoft/ProcDump-for-Linux
la source
Si vous souhaitez vider un segment de mémoire distinct du processus en cours sans créer un fichier core énorme (par exemple avec gcore), vous pouvez utiliser un petit outil à partir d' ici . Il existe également une ligne dans README si vous souhaitez transférer tous les segments lisibles dans des fichiers séparés.
la source