C程序的内存访问监视器

10

我正在尝试追踪对堆分配内存的内存访问。

例如,如果我有以下代码:

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;
}

我主要关注能够访问内存和已修改内容地址的函数。

我曾尝试使用多个内存工具,如ptracestraceASanDmalloc,但均未达到预期结果。

另一个想法是修改内存,使用mprotect更改内存保护并编写Page Faults处理程序。我将内存设为只读,当进行写操作时,处理程序会修改页面保护,然后让函数写入内存中的内容,但之后我无法再将页面设置为只读以进行进一步访问。

您有什么建议可以监控每次对堆内存的写操作吗?


1
使用 gdb,您可以在地址上设置硬件断点。GDB 将它们称为 watchpoint。据我所知,在 x86 平台上,您最多只能设置 4 个 watchpoints,但这可能是一些实现细节?对此我不是100%确定。请参见 https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html。 - inetknght
您有考虑使用 memcmp() 函数吗?对于您想要监视的数据块,您可以保留一个 _副本_,然后定期检查感兴趣的内存位置是否仍与其副本匹配。memcmp(copy, location, len_location); - ryyker
请提供更多细节。您是对来自应用程序内部的运行时通知感兴趣,还是使用外部工具,或者在评论中提到的调试方法已经足够?_DMalloc_发布了与您所描述的要求完全匹配的功能。那么 DMalloc 到底有什么问题? - ryyker
你使用的操作系统是什么? - Ivan Angelov
@ryyker DMalloc,据我所知并且能够创建它,可以帮助您记录堆不一致或非法访问的统计信息。我希望我的应用程序监视合法和非法写入。 基本上,每次动态分配的内存区域被写入时,我的应用程序都应将其记录到文件中。 - Florin Avram
显示剩余4条评论
2个回答

2
如果您愿意监控每个内存访问,我建议您看一下像PIN [1]和/或DynInst [2]这样的软件包。它们都是动态二进制仪器包,允许您修改应用程序二进制文件以注入所需的代码。在这种情况下,这两个工具都允许您检测每个单独指令并知道它们引用的地址(如果它们是读取/存储操作)。然后,如果您只对由malloc(或realloc,或calloc)分配的内存感兴趣,您还可以检测这些例程以捕获它们的入口参数和退出值,以确定所需内存区域。这两个工具提供类似的功能。我认为它们的主要区别在于PIN专门针对英特尔处理器,而DynInst是一个开源项目,支持不同的处理器架构(Intel,IBM-Power,ARM)。

由于这种情况下的检测每个指令可能成本较高,而且您可以采样内存引用,我建议您探索最近英特尔处理器上的PEBS基础设施[3](AMD处理器有类似的称为IBS)。PEBS可从Linux操作系统中提供的perf工具中使用[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节精确事件基础采样(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 perf采样内存地址https://lwn.net/Articles/531766/


0
更好的工具来实现这个目的是利用所有现代处理器中的新功能,即所谓的硬件性能计数器。要访问这些计数器,您需要一个特殊的API,我向您推荐PAPI(性能API)。它提供了大量的函数来访问这些计数器,并测量所有微架构事件,例如缓存命中、缺失、浮点运算等等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接