Я не уверен, как вы выгружаете всю память в файл, не делая этого многократно (если кто-то знает автоматический способ заставить GDB сделать это, пожалуйста, дайте мне знать), но следующее работает для любой партии памяти, если вы знаете, пид:
Выберите одну порцию памяти (например, 00621000-00622000), затем используйте gdb в качестве пользователя root для подключения к процессу и выведите эту память:
Потрясающие! Просто использовал его, чтобы узнать, какой скрипт запускает таинственный экземпляр bash.
Тобиа
Почему вы работаете только с диапазонами с rw-pразрешениями?
mxmlnkn
@mxmlnkn Это data ( rw-p), остальные диапазоны для кода ( r-xp). Если вы хотите получить дамп обоих, тогда идите и обменивайтесь, grepнапример cat.
А. Нильссон
39
пытаться
gcore $pid
где $pidактуальный номер пид; для получения дополнительной информации см .:info gcore
для создания дампа может потребоваться некоторое время, и некоторая память может быть не читаемой, но достаточно хорошей ... имейте в виду, что она может создавать большие файлы, я только что создал файл 2 ГБ таким образом ...
Этого недостаточно, для чтения другого процесса требуется сочетание / proc / <pid> / {mem, * maps}, ptrace и некоторой обработки сигналов, чтобы избежать зависания целевого процесса.
Я также создал свою собственную программу для выгрузки всей памяти процесса, она находится на C, чтобы ее можно было кросс-компилировать для Android, что мне и было нужно.
Вы также можете указать IP-адрес и порт TCP. Исходный код здесь .
Итак, из того, что я понимаю, идея чистого дампа заключается в том, что только файлы в памяти имеют размер, прикрепленный к области памяти, в отличие от фактической памяти приложения, которая имеет размер 0 (так как фактически используемый размер неизвестен ОПЕРАЦИОННЫЕ СИСТЕМЫ).
mxmlnkn
Одна проблема, с которой я сталкиваюсь с этим сценарием, состоит в том, что размер блока 1 приводит к полосе пропускания неприемлемо медленной ~ 30 кБ / с по сравнению с использованием размера блока, равного размеру страницы (для меня 4096), для которого я получаю ~ 100 МБ / с! Смотрите здесь . getconf PAGESIZEиспользуется для получения размера страницы, а затем адреса и количество делятся на нее.
mxmlnkn
1
Инструмент для вывода процесса на стандартный вывод, pcat / memdump:
Этот устарел (удален по запросу сопровождающего); В любом случае я установил старый пакет, и он завершился с ошибкой «Ошибка ввода / вывода; вы использовали GCC с заголовочными файлами другой машины?».
Тобу
0
Теперь вы можете использовать procdump из пакета SysInternals в Linux:
Если вы хотите сбросить отдельный сегмент памяти запущенного процесса без создания огромного файла ядра (скажем, с помощью gcore), вы можете использовать небольшой инструмент здесь . В README также есть однострочная строка, если вы хотите сбросить все читаемые сегменты в отдельные файлы.
/proc/$pid/mem
.Ответы:
Я не уверен, как вы выгружаете всю память в файл, не делая этого многократно (если кто-то знает автоматический способ заставить GDB сделать это, пожалуйста, дайте мне знать), но следующее работает для любой партии памяти, если вы знаете, пид:
Это будет в формате (пример):
Выберите одну порцию памяти (например, 00621000-00622000), затем используйте gdb в качестве пользователя root для подключения к процессу и выведите эту память:
Затем проанализируйте / root / output с помощью команды strings, но вы не хотите использовать PuTTY по всему экрану.
источник
Я сделал скрипт, который выполняет эту задачу.
Идея взята из ответа Джеймса Лори и этого поста: http://www.linuxforums.org/forum/programming-scripting/52375-reading-memory-other-processes.html#post287195
поместите это в файл (например, "dump-all-memory-of-pid.sh") и сделайте его исполняемым
использование:
./dump-all-memory-of-pid.sh [pid]
Вывод распечатывается в файлы с именами:
pid-startaddress-stopaddress.dump
зависимости:
gdb
источник
rw-p
разрешениями?rw-p
), остальные диапазоны для кода (r-xp
). Если вы хотите получить дамп обоих, тогда идите и обменивайтесь,grep
напримерcat
.пытаться
где
$pid
актуальный номер пид; для получения дополнительной информации см .:info gcore
для создания дампа может потребоваться некоторое время, и некоторая память может быть не читаемой, но достаточно хорошей ... имейте в виду, что она может создавать большие файлы, я только что создал файл 2 ГБ таким образом ...
источник
gcore
демпинг разреженного файла?man proc говорит:
Может быть, это может помочь вам
источник
Я также создал свою собственную программу для выгрузки всей памяти процесса, она находится на C, чтобы ее можно было кросс-компилировать для Android, что мне и было нужно.
Вы также можете указать IP-адрес и порт TCP. Исходный код здесь .
источник
Чистое решение Bash:
Использование: procdump PID
для более чистой свалки:
источник
getconf PAGESIZE
используется для получения размера страницы, а затем адреса и количество делятся на нее.Инструмент для вывода процесса на стандартный вывод, pcat / memdump:
источник
Теперь вы можете использовать procdump из пакета SysInternals в Linux:
https://github.com/Microsoft/ProcDump-for-Linux
источник
Если вы хотите сбросить отдельный сегмент памяти запущенного процесса без создания огромного файла ядра (скажем, с помощью gcore), вы можете использовать небольшой инструмент здесь . В README также есть однострочная строка, если вы хотите сбросить все читаемые сегменты в отдельные файлы.
источник