gpt4 book ai didi

c - 如何在 C 中检测/分析内存(堆、指针)读写?

转载 作者:太空宇宙 更新时间:2023-11-04 02:39:41 24 4
gpt4 key购买 nike

我知道这可能有点含糊和牵强(对不起,stackoverflow 警察!)。

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

有没有一种方法可以在一般情况下包装指针,还是应该通过自定义堆来完成?即使使用自定义堆,我也想不出办法。

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

超简单的例子:

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

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

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

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

最佳答案

我猜想(或者希望您)您正在 Linux/x86-64 上开发最近 GCC (2015 年 10 月 5.2)或者可能是 Clang/LLVM编译器 (3.7)。

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

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

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

另请注意,最近的 GCC 和 Clang/LLVM 有几种 sanitizer 。使用一些 -fsanitize= debugging options , 特别是 address sanitizer使用 -fsanitize=address;他们正在检测代码以帮助检测指针访问,所以他们有点像你想做的那样。当然,检测生成的代码的性能正在下降(取决于 sanitizer ,可以是 10% 或 20% 或 50 倍)。

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

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

另请注意,如果您的 C 代码已生成,即如果您是 meta-programming ,然后更改 C 代码生成器可能非常相关。阅读更多关于 reflection 的信息和 homoiconicity . Dynamic software updating也与你的问题有关。

另请查看分析工具,例如 oprofile并进入 sound static source analyzers喜欢Frama-C .

您还可以在一些(检测)emulator 中运行您的程序(如 QemuUnisim 等...)。

你也可以为一个虚构的架构编译,比如 MMIX并检测其模拟器。

关于c - 如何在 C 中检测/分析内存(堆、指针)读写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33373687/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com