我正在尝试追踪对堆分配内存的内存访问。
例如,如果我有以下代码:
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、strace、ASan和Dmalloc,但均未达到预期结果。
另一个想法是修改内存,使用mprotect更改内存保护并编写Page Faults处理程序。我将内存设为只读,当进行写操作时,处理程序会修改页面保护,然后让函数写入内存中的内容,但之后我无法再将页面设置为只读以进行进一步访问。
您有什么建议可以监控每次对堆内存的写操作吗?
gdb
,您可以在地址上设置硬件断点。GDB 将它们称为 watchpoint。据我所知,在 x86 平台上,您最多只能设置 4 个 watchpoints,但这可能是一些实现细节?对此我不是100%确定。请参见 https://sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html。 - inetknghtmemcmp()
函数吗?对于您想要监视的数据块,您可以保留一个 _副本_,然后定期检查感兴趣的内存位置是否仍与其副本匹配。memcmp(copy, location, len_location);
- ryyker