【发布时间】:2016-04-13 07:37: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;
}
我主要对访问内存的函数和修改过的内容的地址感兴趣。
我曾尝试使用多种内存工具,例如 ptrace、strace、ASan、Dmalloc,但我没有达到效果。
另一个想法是修改内存,使用 mprotect 更改内存的保护并为页面错误编写处理程序。我将内存设为只读,当发生写入时,处理程序会修改页面保护并让函数将内容写入内存,但之后我无法再次将页面设为只读,以便进一步访问。
对于如何监控对堆内存的每次写入,您有什么建议吗?
【问题讨论】:
-
使用
gdb,可以在地址上设置硬件断点。 GDB 称它们为 watchpoint。据我所知,在 x86 平台上,您有 4 个观察点的限制,但这可能是一个实现细节?我不是 100% 确定那个。见sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints.html -
您考虑过使用
memcmp()吗?对于您希望监控的块,您可以保留一份副本,然后定期检查感兴趣的内存位置是否仍与其副本匹配。memcmp(copy, location, len_location); -
请提供更多细节。您是否对来自应用程序内部 的运行时通知感兴趣,或者通过使用外部工具,或者 cmets 中提到的调试方法是否足够? DMalloc 发布的功能似乎与您所描述的要求完全匹配。那么究竟是什么不适用于 DMalloc?
-
您使用的是什么操作系统?
-
@IvanAngelov 我正在使用 Ubuntu 14.04,但我很感兴趣如何在 Linux 和 Windows 环境中执行此操作。我决定从 Ubuntu 入手,因为我之前有过使用它的经验。
标签: c memory heap-memory