如何在C中检测/配置内存(堆,指针)读写?

时间:2015-10-27 16:42:03

标签: c pointers memory memory-management

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

在没有外力的情况下,是否有办法对每个指针访问进行检测(基本跟踪)并跟踪读取和写入 - 通常的读/写或每次访问的读/写数量。如果可以对所有变量进行加分并区分堆栈和堆栈变量,则可以获得奖励。

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

最终,我希望看到所述日志的直观表示,这些变量将向我显示以块(字节或倍数)表示的变量以及用于读取和写入的热图。

超简单的例子:

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

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

以更简洁的方式尝试改写:

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

1 个答案:

答案 0 :(得分:2)

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

我还猜你正在追踪一个顽皮的错误,而不是从纯粹的理论角度来问这个(太广泛的)问题。

(请注意,实际上你的问题没有简单的答案,因为在实践中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代码生成器可能非常相关。详细了解reflectionhomoiconicityDynamic software updating也与您的问题有关。

另请参阅oprofile等分析工具以及sound static source analyzersFrama-C

你也可以在一些(仪表)emulator内部运行你的程序(如QemuUnisim等...)。

你也可以编译一个像MMIX这样的虚构架构并设法模拟它。