【问题标题】:How to instrument/profile memory(heap, pointers) reads and writes in C?如何在 C 中检测/分析内存(堆、指针)读写?
【发布时间】:2015-10-27 16:42:03
【问题描述】:

我知道这可能有点模糊和牵强(抱歉,stackoverflow 警察!)。

有没有办法在没有外力的情况下检测(基本上跟踪)每个指针访问和跟踪读取和写入——一般读取/写入或每次访问的读取/写入数量。如果可以为所有变量完成并区分堆栈和堆变量,则奖励。

一般来说有没有办法包装指针,还是应该通过自定义堆来完成?即使使用自定义堆,我也想不出办法。

最终,我希望看到所述日志的可视化表示,它将向我显示表示为块(字节或倍数)的变量以及在它们上用于读取和写入的热图。

超简单的例子:

int i = 5;
int *j = &i;

printf("%d", *j); /* Log would write *j was accessed for read and read sizeof(int) bytes

尝试以更简洁的方式重新表述:

(如何)在没有外部二进制检测的情况下,我如何拦截(并记录)对 C 中指针的访问? - 如果我能区分读取和写入并获得指针的名称和读取/写入的大小(以字节为单位),则奖励。

【问题讨论】:

  • 它是特定于实现的:取决于编译器、libc、操作系统等...标准 C99 或 C11 不了解检测或分析。因此,编辑您的问题,通过详细介绍您的 C 实现和代码来改进它
  • 另外,解释一下你为什么这么问......如果没有额外的编辑,我很快就会对这个问题投反对票,因为不清楚,并且可能会因为过于宽泛而投票支持关闭......
  • 我为什么要问?我为什么不呢?此外,它在问题的末尾进行了解释。如果可能,我想记录对所有或选择指针的每次访问并区分读取和写入,并记录读取/写入的数量。实施并不重要,因为我想看看这是可能的任何方式。如果它确实重要,那么 GCC 5.2(OSX、Windows/MinGW 和 Linux)以及它附带的一切都是香草。
  • 我投了反对票(但我正在输入答案),因为您没有编辑您的问题...
  • 我做了,但我不能同时写评论和编辑。

标签: c pointers memory memory-management


【解决方案1】:

我猜(或希望你)你正在使用 最近GCC(2015 年 10 月为 5.2)或 Clang/LLVM 编译器(3.7)在 Linux/x86-64 上进行开发。

我也猜想你在跟踪一个顽皮的错误,而不是从纯粹的理论角度提出这个(太宽泛的)问题。

(请注意,您的问题实际上没有简单的答案,因为实际上 C 编译器生成的机器代码接近硬件,并且大多数硬件没有像你梦寐以求的)

当然,编译时包含所有警告和调试信息 (gcc -Wall -Wextra -g)。使用调试器 (gdb),尤其是与您的问题相关的观察点设施。也可以使用valgrind。 另请注意,GDB(最近的版本,如 7.10)可以在 Python(或 Guile)中编写脚本,您可以为 GDB 编写一些脚本来帮助您。

另请注意,最近的 GCC 和 Clang/LLVM 有几种消毒剂。使用一些-fsanitize= debugging options,尤其是address sanitizer-fsanitize=address;他们正在检测代码以帮助检测指针访问,因此他们在做你想做的事。当然,检测生成的代码的性能正在下降(取决于清理程序,可能是 10% 或 20% 或 50 倍)。

最后,您甚至可以考虑通过自定义编译器来添加自己的工具,例如使用MELT - 一种高级域特定语言,专为 GCC 的此类定制任务而设计。这将需要几个月的工作,除非您已经熟悉 GCC 内部(然后,只需几周)。您可以在 GCC 中添加一个“优化”通道,它将检测(通过更改 Gimple 代码)您想要的任何访问或存储。

阅读更多关于aspect-oriented programming的信息。

还要注意,如果您的 C 代码已生成,也就是说,如果您是 meta-programming,那么更改 C 代码生成器可能非常相关。阅读有关reflectionhomoiconicity 的更多信息。 Dynamic software updating也和你的问题有关。

还可以查看像 oprofile 这样的分析工具和像 Frama-C 这样的 sound static source analyzers

您也可以在一些(仪器)emulator(如QemuUnisim 等...)中运行您的程序。

您还可以针对MMIX 之类的虚构架构进行编译,并对其模拟器进行检测。

【讨论】:

    猜你喜欢
    • 2019-01-24
    • 2013-07-23
    • 1970-01-01
    • 2011-03-05
    • 2012-05-28
    • 2012-09-16
    • 2021-09-01
    • 2016-03-06
    • 2019-04-27
    相关资源
    最近更新 更多