2016-01-08 3 views
10

Я пытаюсь отследить доступ к памяти для выделенной памяти.Монитор доступа к памяти для программ c

Например, если у меня есть следующий код:

void set_value(int* buffer, size_t pos, int value) { 
    buffer[pos] = value; 
} 
int main(void) {  
    int* buffer = malloc(BUFF_SIZE * sizeof(int)); 
    set_value(buffer, 2, 10); 
    set_value(buffer, 3, 12); 

    free(buffer); 
    return 0; 
} 

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

Я попытался использовать несколько инструментов памяти как ptrace, Трассирование, Асан, пооддержки, но я не достиг результата.

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

У вас есть какие-либо советы о том, как отслеживать каждую запись, сделанную в память кучи?

+1

Используя 'gdb', вы можете установить аппаратную точку останова по адресу. GDB называет их * watchpoint * s.Насколько мне известно, на платформе x86 у вас есть ограничение на 4 точки наблюдения, но это может быть деталь реализации? Я не уверен на это на 100%. См. Https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html – inetknght

+0

Считаете ли вы использование 'memcmp()'? Для блоков, которые вы хотите отслеживать, вы можете сохранить _copy_, а затем периодически проверять, что интересующая ячейка по-прежнему совпадает с ее копией. 'memcmp (копия, местоположение, len_location);' – ryyker

+0

Пожалуйста, предоставьте немного более подробную информацию. Вас интересуют уведомления во время выполнения от _within_ вашего приложения или с помощью внешнего инструмента или достаточно ли метод отладки, упомянутый в комментариях? _ [DMalloc] (http://dmalloc.com/docs/latest/online/dmalloc_7.html) _ публикует возможности, которые, как представляется, идеально соответствуют тому, что вы описали как ваши требования. Так что же конкретно не с DMalloc? – ryyker

ответ

1

Если вы хотите следить за каждым доступом к памяти, я бы предложил взглянуть на такие пакеты, как PIN [1] и/или DynInst [2]. Оба являются динамическими пакетами бинарных инструментов, которые позволяют вам модифицировать двоичный код приложения, чтобы ввести нужный код. В этом случае оба инструмента позволяют вам выполнять каждую отдельную инструкцию и знать адрес, который они ссылаются (если они загружаются/хранятся). Затем, если вас интересует только память, выделенная malloc (или realloc или calloc), вы также можете задействовать эти подпрограммы, чтобы отображать их параметры ввода и значения выхода, чтобы определить интересующую область памяти. Оба инструмента обеспечивают аналогичные функции. Я бы сказал, что их основное отличие заключается в том, что PIN-код специально ориентирован на процессоры Intel, а DynInst - проект с открытым исходным кодом, который поддерживает разные архитектуры процессоров (Intel, IBM-Power, ARM).

Поскольку в этом конкретном сценарии аппаратура может быть дорогостоящей, что позволяет использовать каждую инструкцию, и вы можете позволить себе образцы ссылок на память, я бы предложил вам изучить инфраструктуру PEBS [3] от недавних процессоров Intel (процессоры AMD имеют нечто похожее IBS). УИБ можно использовать из инструмента перфорация, имеющейся в рамках операционной системы 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 Раздел 18.4.4 Руководство Точное событие на основе выборки (УИБ) 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/

0

Чем лучше инструмент для д o Эта цель заключается в использовании новой функции во всех современных процессорах, так называемом Hardware Performance Counter. Чтобы получить доступ к этим счетчикам, вам нужен специальный API, и я рекомендовал PAPI для вас (PAPI: Performance API). Он предоставляет огромные функции для доступа к этим счетчикам и для измерения всех событий микроархитектуры, таких как кеширование, пропуски, операции с плавающей запятой и так далее.

Смежные вопросы