Если вы хотите перехватить весь доступ к определенной странице памяти, вам может пригодиться mprotect
. Но вы хотите ограничить мониторинг на основе адреса инструкции, а не целевого адреса.
Существует пара подходов, и все они требуют идентификации указателя в исходном коде. Если вы не собираетесь делать это часто для разных функций, вероятно, это проще сделать вручную.
Один метод состоит в том, чтобы найти инструкции, которые делают косвенный доступ к памяти и устанавливают условные точки останова (то есть прерывание, если указатель находится вне буфера, который вы ожидаете изменить).
Другим методом будет исправление кода функции для вставки кода для проверки или печати всех используемых указателей.
Еще один способ - пометить код функции неисполняемым (например, с помощью mprotect). Тогда ваш обработчик сигнала (ошибка сегментации) будет запущен вместо функции. Затем для интерпретации кода можно использовать метод VM, а не выполнять его непосредственно на оборудовании.
Последний метод был бы наиболее общим методом, первый метод был бы наименьшим количеством усилий, если вы хотите отслеживать доступ к памяти только в одной функции, второй метод, вероятно, является наиболее трудоемким, но и самым маленьким ударом по производительности .