Обнаружение всех изменений памяти в C - PullRequest
2 голосов
/ 17 апреля 2010

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

Ответы [ 4 ]

6 голосов
/ 17 апреля 2010

Если вы можете запустить программное обеспечение, которое вы хотите исследовать, в Linux или Mac OS, я бы посоветовал изучить Valgrind , в частности, инструмент Valcherind Memcheck.

В двух словах, Valgrind запускает вашу программу на «синтетическом процессоре». Он не выполняет код программы напрямую на реальном оборудовании. В результате он может использовать все, что делает программа. Инструмент Memcheck способен наблюдать за всеми обращениями к памяти программы. Это может сделать удивительную работу по поиску различных типов ошибок памяти.

1 голос
/ 17 апреля 2010

Ну, есть различные методы отладки, которые вы можете использовать для мониторинга распределения памяти в приложении на Си. Например, вот некоторые опции для Linux.

0 голосов
/ 18 апреля 2010

Если вы хотите перехватить весь доступ к определенной странице памяти, вам может пригодиться mprotect. Но вы хотите ограничить мониторинг на основе адреса инструкции, а не целевого адреса.

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

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

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

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

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

0 голосов
/ 17 апреля 2010

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

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

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

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