【问题标题】:Memory access monitor for c programsc程序的内存访问监视器
【发布时间】: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;
}

我主要对访问内存的函数和修改过的内容的地址感兴趣。

我曾尝试使用多种内存工具,例如 ptracestraceASanDmalloc,但我没有达到效果。

另一个想法是修改内存,使用 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


【解决方案1】:

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

由于在这种特殊情况下检测每条指令的成本可能很高,并且您可以负担对内存引用的采样,因此我建议您从最新的英特尔处理器(AMD 处理器有类似名称的 IBS)探索 PEBS 基础架构 [3] )。 PEBS 可以从 Linux OS [4] 中可用的 perf 工具中使用(我不知道它是否在其他 OSeS 上可用)

[1] 密码https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool

[2] DynInst http://www.dyninst.org

[3] 英特尔手册第 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/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多