【问题标题】:Detect every memory accesses made by a C/C++ program [closed]检测 C/C++ 程序进行的每个内存访问 [关闭]
【发布时间】: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


【解决方案1】:

(我专注于Linux)

你想要做的将是非常慢并且如果你天真地做的话需要不可移植的代码。我假设您想要一个通用的解决方案(在许多 C++ 程序上工作,而不是在某个特定的程序上工作)。

你可以修补一些模拟器,比如 Qemu。

也许您只想使用valgrindGCC debugging options 之类的地址清理程序(搜索-fsanitize=address)。或使用 gdb 观察点。请注意,最近的 GDB 可以在 Python 或 Guile 中编写脚本。

也许你可以从valgrindtricks 获得灵感。

还可以查看ptrace(2)

如果您不希望出现灾难性的性能(即天真地解释每条机器指令和/或为每次内存访问处理一个 SIGSEGV,请参阅this 了解更多信息),您需要很棘手。

您可以考虑自定义 GCC 编译器(例如使用 MELT),以便在编译器中检测一些(相关)加载和存储。

如果您采用幼稚的方法(解释每条机器指令和/或粗略的 SIGSEGV 处理),您的程序可能会减慢一千多倍,而这种“半幼稚”的方法仍然需要几个月的时间工作的。你会遇到Heisenbugs

如果你想要一个严肃的方法,你需要修改你的 GCC 编译器(例如使用 MELT),以便编译器发出一些检测代码另外,重新编译程序进行检测(以及它使用的所有库),这可能需要您至少一年的时间(除非您已经精通 GCC 内部)。

如果你是认真的,那就多学习计算机科学(computer architectureoperating systemscompilers),然后让你的博士继续努力。你需要几年的努力。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 2017-04-06
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多