【问题标题】:Valgrind mark deliberate leakValgrind 标记故意泄漏
【发布时间】:2013-07-25 23:02:45
【问题描述】:

我觉得这必须是一个功能,但我的 Google-Fu 让我失望了。如果之前有人问过/回答过这个问题,我提前道歉,感觉很明显,但我找不到任何东西。

有没有办法将分配标记为故意泄漏?上下文是在程序初始化期间动态分配一次并在整个程序生命周期中使用的数据结构。没有真正的理由在程序终止之前释放所有分配的对象(为什么要清理房间,因为整个房子都有一个破坏球?),但它会导致 valgrind 的很多误报。

我知道我可以创建一个抑制文件,但感觉是手动的且不连贯。我更喜欢某种宏或其他源内注释,即有意永远不会释放此分配(例如类似于malloc(...) -> malloc_IGNORE_LEAK(...) 的东西)。 valgrind 是否以某种方式支持这一点?

如果不是,那么标记/跟踪故意“泄漏”的首选解决方案是什么?

【问题讨论】:

  • 这个关于执行结束时释放内存的问题的答案总结了我对它的看法:stackoverflow.com/a/2213644/1609219
  • 在这种情况下,我的意识形态正好相反。有问题的应用程序根本不是跨平台的(也不是试图跨平台的),它被设计为在相对高性能的机器上运行在 Unix 环境中。在现代语境中,这意味着虚拟内存。事实上,凯文的以下回答在这种情况下非常合适。这个问题不是“我应该释放程序生命周期内存”,而是“我打算让操作系统完成它的工作,我该如何告诉其他工具”
  • 我理解你的问题,这就是为什么我没有发布作为答案,只是评论。话虽如此,它们仍然可以到达吗?或者,您能否存储指向所有已分配内容的指针,从而保持内存可访问,并使--show-reachable=no 可行。
  • 使用malloc确实很难避免泄漏,malloc本质上是不安全的。

标签: c memory-leaks annotations valgrind false-positive


【解决方案1】:

下面的代码在malloc() 上使用了一些全局变量和一个包装器。您可以将它用于任何您不担心从中泄漏内存的 malloc 调用。使用 my_malloc() 分配的任何内容都将显示在仍然可以访问的泄漏下,因为您仍然可以引用它。

void ** memorys = NULL;
size_t max_index = 0;
size_t use_index = 0;

void grow_memorys() {
    if (memorys == NULL) {
        max_index = 8;
        memorys = malloc(max_index * sizeof(void *));
    }
    else { 
        max_index *= 2;
        memorys = realloc(memorys, max_index * sizeof(void *));
    }
}   

void * my_malloc(size_t size) {
    void * point = malloc(size);
    if (use_index >= max_index) {
        grow_memorys();
    }
    memorys[use_index] = point;
    use_index++;
    return point;
}

【讨论】:

  • 以这种方式使用 show-reachable 会将问题从误报变为误报。可能有一些仍然可以访问的块应该被释放。这仅在我释放了我想要的所有东西的情况下才有用,这是我首先要证明的。如果我可以指示 valgrind “忽略从 memorys 访问的所有内容”,它会起作用,但如果存在,我可以简单地将它应用于初始分配并完成它。
【解决方案2】:

您可以制作自己的 malloc 包装器,它为要释放的 atexit 处理程序注册“永久”分配。但是,如果其他线程仍然可以使用它们,这在多线程程序中可能是不安全的。

【讨论】:

  • 你错过了问题的精神。目标是释放内存,只是向工具(valgrind 等人)表达我故意“泄漏”内存,因为释放它没有意义——确实存在实际上可能是负面后果。
  • 我只是说“在最后一分钟释放内存,以一种对程序设计无创且在不使用 valgrind 时易于关闭的方式”将是一种方式让泄漏报告安静下来。
  • 啊,更好一点。是的,我想这将是一个解决方案,但它需要类似于 Macattack 的分配跟踪器的东西,因为该程序是大量多线程的。在某些时候,需要权衡多少时间/精力/代码应该投入到泄漏跟踪调试器中:/
猜你喜欢
  • 2011-01-10
  • 2013-06-24
  • 2020-03-31
  • 2016-03-15
  • 2014-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多