Ответ 1
Если вы хотите контролировать каждый доступ к памяти, я бы предложил посмотреть на такие пакеты, как PIN [1] и/или DynInst [2]. Оба являются динамическими пакетами бинарных инструментов, которые позволяют вам модифицировать двоичный код приложения, чтобы ввести нужный код. В этом случае оба инструмента позволяют вам выполнять каждую отдельную инструкцию и знать адрес, который они ссылаются (если они загружаются/хранятся). Затем, если вас интересует только память, выделенная malloc (или realloc или calloc), вы также можете задействовать эти подпрограммы, чтобы отображать их параметры ввода и значения выхода, чтобы определить интересующую область памяти. Оба инструмента обеспечивают аналогичные функции. Я бы сказал, что их основное отличие заключается в том, что PIN-код специально ориентирован на процессоры Intel, а DynInst - проект с открытым исходным кодом, который поддерживает разные архитектуры процессоров (Intel, IBM-Power, ARM).
Поскольку в этом конкретном сценарии инструментарий может быть дорогостоящим, который документирует каждую инструкцию, и вы можете позволить себе образцы ссылок на память, я бы предложил вам изучить инфраструктуру PEBS [3] от недавних процессоров Intel (процессоры AMD имеют нечто похожее под названием IBS). PEBS можно использовать из основного инструмента, доступного в ОС Linux [4] (я не знаю, доступен ли он на других ОСЭ)
[1] PIN https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool
[2] DynInst http://www.dyninst.org
[3] Intel Manual Section 18.4.4 Точная выборка на основе событий (PEBS) http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf
[4] Первичный Linux для выборки адресов памяти https://lwn.net/Articles/531766/