Расположение объектов (структур) в памяти - как? - PullRequest
1 голос
/ 13 марта 2010

Как бы вы нашли объект в памяти, скажем, что у вас есть структура, определенная как:

struct POINT {
   int x;
   int y;
};

Как бы я просканировал область памяти моего приложения, чтобы найти экземпляры этой структуры, чтобы я мог их прочитать?

Спасибо Р.

Ответы [ 9 ]

4 голосов
/ 13 марта 2010

Вы не можете без добавления информации о типе в структуру. В памяти подобная структура - не что иное, как 2 целых числа, поэтому вы не можете узнать их лучше, чем любой другой объект.

3 голосов
/ 13 марта 2010

Вы не можете. Структуры не хранят никакой информации о типе (если они не имеют виртуальных функций-членов), поэтому вы не можете отличить их от других блоков байтов sizeof (POINT).

Почему вы не храните свои очки в векторе или чем-то еще?

2 голосов
/ 13 марта 2010

Краткий ответ: вы не можете. Любая (соответствующим образом выровненная) последовательность из 8 байтов потенциально может представлять ТОЧКУ. Фактически, массив целых будет неотличим от массива ТОЧЕК. В некоторых случаях вы можете воспользоваться знанием реализации компилятора, чтобы добиться большего успеха. Например, если структура имеет виртуальные функции, вы можете искать правильный указатель vtable - но могут быть и ложные срабатывания.

Если вы хотите отслеживать объекты, вам нужно зарегистрировать их в их конструкторе и отменить их регистрацию в деструкторе (и заплатить штраф за производительность), или назначить им собственный распределитель.

2 голосов
/ 13 марта 2010

Вы не ... как бы вы отличали два произвольных целых числа от случайного шума?

(но, учитывая Point p; в исходном коде, вы можете получить его адрес с помощью оператора address-of ... Point* pp = &p;).

2 голосов
/ 13 марта 2010

Вы не можете. Вы должны знать макет, чтобы знать, какой раздел памяти должен представлять переменную. Это своего рода протокол, и поэтому мы используем текстовые языки вместо необработанных значений.

1 голос
/ 13 марта 2010

То, что все остальные сказали, правда. В памяти ваша структура занимает всего несколько байтов, и ничего особенного для ее различения не существует.

Однако, если вам захочется немного взломать, вы можете посмотреть внутренности своей библиотеки C и выяснить, где память хранится в куче и как она выглядит. Например, эта ссылка показывает, как вещи распределяются в одной конкретной системе.

Вооружившись этим знанием, вы можете сканировать свою кучу, чтобы найти выделенные блоки, которые были sizeof(POINT), что значительно сузило бы поиск. Если вы посмотрите на таблицу, то заметите, что записываются имя файла и номер строки вызова malloc() - если вы знаете, где в исходном коде вы выделяете POINT s, вы можете использовать это как Ссылка тоже.

Однако, если ваша структура была размещена в стеке, вам не повезло.

1 голос
/ 13 марта 2010

Вы не можете. Нечто подобное, вероятно, было бы возможно в некоторой «тегированной» архитектуре, которая также поддерживала тегирование объектов пользовательских типов. Но на традиционной архитектуре абсолютно невозможно точно сказать, что хранится в памяти, просто взглянув на необработанный контент памяти.

Вы можете приблизиться к достижению того, чего хотите, введя уникальную подпись в типе, например

struct POINT { 
   char signature[8];
   int x; 
   int y; 
}; 

и осторожно устанавливая для него фиксированный и «уникальный» шаблон в каждом объекте типа POINT, а затем ищем этот шаблон в памяти. Если это ваше приложение, вы можете быть с достаточной степенью уверенности уверены, что каждый экземпляр шаблона является вашим POINT объектом. Но в целом, конечно, никогда не будет никакой гарантии, что шаблон, который вы нашли, принадлежит вашему объекту, а не случайно.

1 голос
/ 13 марта 2010

Нет стандартного способа сделать это. Платформа может указывать некоторые API, которые позволяют вам получить доступ к стеку и бесплатному хранилищу. Более того, даже если бы вы это сделали, без какой-либо дополнительной информации, как бы вы были уверены, что читаете объект POINT, а не пару int s? Компилятор / компоновщик может прочитать это, потому что он имеет дело с (хотя и виртуальными) адресами и имеет немного больше информации (и контроля), чем вы.

1 голос
/ 13 марта 2010

Нет способа идентифицировать эту структуру. Вам нужно поместить структуру где-нибудь, где ее можно найти, в стек или в кучу.

Иногда структуры данных помечаются идентифицирующей информацией, чтобы помочь с отладкой или управлением памятью. Как средство организации данных это один из худших возможных подходов.

Вам, вероятно, нужно много общего прочитать о управлении памятью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...