Обзор
То, что вы пытаетесь сделать, абсолютно возможно, и есть даже инструменты, которые помогут, но вам придется выполнять больше работы, чем я думаю, вы ожидаете.
В вашем случае вас особенно интересует "где лежат переменные". API кучи системы в Windows станет для вас невероятной помощью. Ссылка действительно неплохая, и хотя это не будет единый непрерывный регион, API скажет вам, где находятся ваши переменные.
В общем, хотя, ничего не зная о том, где находится ваша память, вам придется выполнить сканирование всего адресного пространства процесса. Если вам нужны только данные, вам также придется выполнить некоторую фильтрацию, потому что в них также присутствует бессмысленность кода и стека. Наконец, чтобы избежать сбоя при сегментировании во время выгрузки адресного пространства, вам может потребоваться добавить обработчик сигнала segfault, который позволяет пропускать не отображенную память во время выгрузки.
Схема памяти процесса
В рабочем процессе у вас будет несколько непересекающихся отрезков памяти для распечатки. Они будут включать:
- Скомпилированный код (только для чтения),
- данные стека (локальные переменные),
- Статические глобалы (например, из общих библиотек или в вашей программе) и
- Данные динамической кучи (все от
malloc
или new
).
Ключом к разумному сбросу памяти является возможность определить, какой диапазон адресов принадлежит какому-либо семейству. Это ваша основная работа, когда вы сбрасываете программу. Некоторое из этого вы можете сделать, прочитав адреса функций (1) и переменных (2, 3 и 4), но если вы хотите напечатать больше, чем несколько вещей, вам понадобится некоторая помощь.
Для этого у нас есть ...
Полезные инструменты
Вместо того, чтобы просто слепо искать адресное пространство от 0 до 2 ^ 64 (которое, как мы все знаем, мучительно огромны), вы захотите использовать инструменты разработчика ОС и компилятора, чтобы сузить свой поиск. Кому-то там нужны эти инструменты, может даже больше, чем вам; это просто вопрос их поиска. Вот некоторые из них, о которых я знаю.
Отказ от ответственности: я не знаю многих эквивалентов Windows для многих из этих вещей, хотя я уверен, что они где-то существуют.
Я уже упоминал API кучи системы Windows . Это лучший сценарий для вас. Чем больше вещей вы сможете найти в этом ключе, тем точнее и проще будет ваша свалка. Действительно, операционная система и среда выполнения C довольно много знают о вашей программе. Это вопрос извлечения информации.
В Linux типы памяти 1 и 3 доступны через такие утилиты, как / proc / pid / maps. В / proc / pid / maps вы можете видеть диапазоны адресного пространства, зарезервированного для библиотек и программного кода. Вы также можете увидеть биты защиты; Например, диапазоны только для чтения - это, вероятно, код, а не данные.
Для советов по Windows Марк Руссинович написал несколько статей о том, как узнать адресное пространство процесса Windows и где хранятся разные вещи. Я полагаю, у него там могут быть хорошие указатели.