Можно ли сбросить текущую память, выделенную для процесса (по PID), в файл? Или как-нибудь прочитать?
Я сделал сценарий, который решает эту задачу.
Идея исходит из ответа Джеймса Лори и этого сообщения: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
#!/bin/bash
grep rw-p /proc/$1/maps \
| sed -n 's/^\([0-9a-f]*\)-\([0-9a-f]*\) .*$/\1 \2/p' \
| while read start stop; do \
gdb --batch --pid $1 -ex \
"dump memory $1-$start-$stop.dump 0x$start 0x$stop"; \
done
поместите это в файл (например, "dump-all-memory-of-pid.sh") и сделайте его исполняемым
использование: ./dump-all-memory-of-pid.sh [pid]
Вывод печатается в файлы с именами: pid-startaddress-stopaddress.dump
Зависимости: gdb
Я не уверен, как вы сбрасываете всю память в файл, не делая этого повторно (если кто-то знает автоматический способ заставить GDB сделать это, дайте мне знать), но следующее работает для любого пакета памяти, если вы знаете pid:
$ cat /proc/[pid]/maps
Это будет в формате (пример):
00400000-00421000 r-xp 00000000 08:01 592398 /usr/libexec/dovecot/pop3-login
00621000-00622000 rw-p 00021000 08:01 592398 /usr/libexec/dovecot/pop3-login
00622000-0066a000 rw-p 00622000 00:00 0 [heap]
3e73200000-3e7321c000 r-xp 00000000 08:01 229378 /lib64/ld-2.5.so
3e7341b000-3e7341c000 r--p 0001b000 08:01 229378 /lib64/ld-2.5.so
Выберите один пакет памяти (например, 00621000-00622000), затем используйте gdb как root для подключения к процессу и выгрузите эту память:
$ gdb --pid [pid]
(gdb) dump memory /root/output 0x00621000 0x00622000
Затем проанализируйте / root / output с помощью команды strings, если вы не хотите, чтобы PuTTY был по всему экрану.
пытаться
gcore $pid
где $pid
это фактический номер pid; для получения дополнительной информации см .: info gcore
дамп может занять некоторое время, и некоторая память может быть не читаемой, но достаточно хороша ... имейте в виду, что он может создавать большие файлы, я только что создал файл размером 2 ГБ таким образом ..
Чистое решение bash:
procdump()
(
cat /proc/$1/maps | grep "rw-p" | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
Использование: procdump PID
для более чистого сброса фильтра *.so
разделяемые библиотеки с отображением памяти и пустые диапазоны памяти:
procdump()
(
cat /proc/$1/maps | grep -Fv ".so" | grep " 0 " | awk '{print $1}' | ( IFS="-"
while read a b; do
dd if=/proc/$1/mem bs=$( getconf PAGESIZE ) iflag=skip_bytes,count_bytes \
skip=$(( 0x$a )) count=$(( 0x$b - 0x$a )) of="$1_mem_$a.bin"
done )
)
человек прок говорит:
/ proc / [pid] / mem Этот файл можно использовать для доступа к страницам памяти процесса через open (2), read (2) и lseek (2).
Может быть, это поможет тебе
Я сделал свою собственную программу для сброса всей памяти процесса, она на C, поэтому ее можно кросс-компилировать для Android, что мне и нужно.
Вы также можете указать IP-адрес и TCP-порт. Исходный код Вот.
Инструмент для вывода процесса на стандартный вывод, pcat / memdump:
Теперь вы можете использовать procdump из пакета SysInternals в Linux:
Если вы хотите сбросить отдельный сегмент памяти запущенного процесса без создания огромного файла ядра (скажем, с помощью gcore), вы можете использовать небольшой инструмент из Вот. В README также есть однострочник, если вы хотите выгрузить все читаемые сегменты в отдельные файлы.