【发布时间】:2016-01-27 14:47:28
【问题描述】:
我试图检测在运行时用 C/C++ 编写的每个访问程序,特别是动态分配的内存。此外,我想了解有关访问地点的一些信息。进行访问的函数名正是我要查找的。p>
例如,对于以下代码:
void MemoryAccess(int* my_vector) {
int x = my_vector[0]; // Read access from 0xFFFF0000.
my_vector[0] = x + 1; // Write access to 0XFFFF0000.
}
int main(void) {
// Assume that the address returned by malloc is 0xFFFF0000.
int* vec = malloc(VEC_SIZE * sizeof(int));
if (!vec) {
return MEMORY_ALLOCATION_FAIL;
}
MemoryAccess(vec);
int second_elem = vec[1]; // Read access from 0xFFFF0004.
v[1] = 10; // Write access to 0xFFFF0004.
return 0;
}
我想记录一个日志文件,其中包含以下内容:已访问的地址、进行访问的函数名。对于上面的例子,我的日志应该是这样的:
{Read} {MemoryAccess} {0xFFFF0000}
{Write} {MemoryAccess} {0xFFFF0000}
{Read} {main} {0xFFFF0004}
{Write} {main} {0xFFFF0004}
我已经能够在 Windows 上使用异常过滤器执行类似的操作并修改受监视内存块的页面保护。我无法获得进行访问的函数名,只有在引发异常时的指令指针值,我不知道如何使用它来获取函数名。
注意:我的目标是监控基于 Linux 的系统(主要是 Debian/Ubuntu)上的内存访问,而不是 Windows。
【问题讨论】:
-
valgrind 能帮到你吗?
-
请提供该“C/C++”语言规范的链接。在此之前,只有两种不同语言 C 和 C++。这不是 C++。两种语言都有不同的解决方案来解决您的问题。
-
@Angew:我认为 Valgrind 不会监控每个访问。
-
请给出你的动机,以便编辑你的问题以大大改进它。
-
您关心一个特定的程序(哪一个?)或者您是否有足够的野心寻求更通用的解决方案?那你为什么问?
标签: c memory trace heap-memory