Я хотел бы изучить память о жизненном процессе, и когда я это сделаю, процесс не должен нарушаться - поэтому привязка gdb к процессу (который остановит его) не является вариантом. Поэтому я хотел бы получить эту информацию от /proc/kcore (если вы знаете другой способ сделать это, пожалуйста, дайте мне знать). Поэтому я сделал небольшой эксперимент. Я создал файл под названием TEST с только "EXTRATESTEXTRA" внутри. Затем я открыл его с меньшим
$ less TEST
Я получил PID этого процесса с помощью
$ ps aux | grep TEST
user 7785 0.0 0.0 17944 992 pts/8 S+ 16:15 0:00 less TEST
user 7798 0.0 0.0 13584 904 pts/9 S+ 16:16 0:00 grep TEST
И затем я использовал этот script для создания дампа всех файлов:
#!/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
(я нашел его на этом сайте https://serverfault.com/info/173999/dump-a-linux-processs-memory-to-file)
$ sudo ./dump_all_pid_memory.sh 7785
После этого я искал "TRATESTEX" во всех сбрасываемых файлах:
$ grep -a -o -e '...TRATESTEX...' ./*.dump
./7785-00624000-00628000.dump:HEXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
./7785-00b8f000-00bb0000.dump:EXTRATESTEXTRA
Итак, я пришел к выводу, что должна быть видимость этой строки где-то между 0x00624000 и 0x00628000. Поэтому я преобразовал смещения в десятичные числа и использовал dd для получения памяти из /proc/kcore:
$ sudo dd if="/proc/kcore" of="./y.txt" skip="0" count="1638400" bs=1
К моему удивлению, файл y.txt был заполнен нулями (я не нашел строку, которую я искал в ней).
В качестве бонусного сюрприза я одновременно проверил сравнительный тест с другим тестовым файлом и обнаружил, что другая тестовая строка, которую я использовал (оба процесса с меньшим количеством выполнялись одновременно) должны быть найдены в одном месте (демпинг и градация дали такое же смещение). Поэтому должно быть что-то, что я не понимаю ясно.
-
Не предполагается, что /proc/pid/maps отображает смещение памяти (например: если бы он сказал, что "XXX" находится на смещении 0x10, другая программа не может использовать такое же смещение am я право? - это источник моего второго удивления)
-
Как я могу прочитать /proc/kmap, чтобы получить память, принадлежащую процессу, который я знаю pid?
EDIT - для будущих споткнеров (см. ниже):
Подводя итоги и добавьте собственные комментарии:
-/proc/pid/maps отображает части памяти. КАК ПРОЦЕСС СИДЕТЬ ЭТО (по-разному для каждого процесса, ищет сопоставление памяти в Linux), поэтому разные процессы могут использовать одну и ту же часть памяти (поскольку она выглядит с их точки зрения). Вы можете прочитать детали, указанные здесь, из /proc/pid/mem как суперпользователь (или родительский процесс, например gdb, с помощью ptrace)
- память в /proc/kcore
не совпадает с памятью с точки зрения процесса в /proc/pid/mem
- поэтому для поиска памяти процесса в /proc/kcore
нужно было бы выяснить, как память процесса отображается в память ядра ( много грязных вещей и много времени)
Таким образом, чтобы получить память процесса, сначала прочитайте, в каких областях /proc/pid/maps
разрешено читать/писать с/на, а затем сбрасывать копии областей из /proc/pid/mem
. script ниже выгружает все записываемые области (источник: https://unix.stackexchange.com/info/6301/how-do-i-read-from-proc-pid-mem-under-linux). EDIT: пересмотренный рабочий python script переносится на свой собственный ответ, поэтому его можно прокомментировать в отличие от вопроса.