我知道这可能有点模糊和牵强(抱歉,stackoverflow警察!)。
在没有外力的情况下,是否有办法对每个指针访问进行检测(基本跟踪)并跟踪读取和写入 - 通常的读/写或每次访问的读/写数量。如果可以对所有变量进行加分并区分堆栈和堆栈变量,则可以获得奖励。
有没有办法一般包装指针,还是应该通过自定义堆完成?即使使用自定义堆,我也想不出办法。
最终,我希望看到所述日志的直观表示,这些变量将向我显示以块(字节或倍数)表示的变量以及用于读取和写入的热图。
超简单的例子:
int i = 5;
int *j = &i;
printf("%d", *j); /* Log would write *j was accessed for read and read sizeof(int) bytes
以更简洁的方式尝试改写:
(如何)我可以在没有外部二进制检测的情况下拦截(和记录)对C中指针的访问? - 如果我可以区分读取和写入并获取指针的名称和读/写的大小(以字节为单位),则可获得奖励。
答案 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代码生成器可能非常相关。详细了解reflection和homoiconicity。 Dynamic software updating也与您的问题有关。
另请参阅oprofile等分析工具以及sound static source analyzers等Frama-C。
你也可以在一些(仪表)emulator内部运行你的程序(如Qemu,Unisim等...)。
你也可以编译一个像MMIX这样的虚构架构并设法模拟它。