1

从实用程序派生的子进程退出时,通常不可能释放所有内存。我想在库中抑制对这些的内存泄漏检测。

我不想让使用该库的开发人员--show-leak-kinds=all不得不查看来自子进程的泄漏报告,因为没有人可以真正对它们做任何事情。

我知道--child-silent-after-fork=yes命令行可用于禁止所有分叉进程的报告,但这也可能禁止来自主应用程序的报告,并要求用户记住始终指定此选项。

一个非常常见的问题是在使用 fork/exec 的代码中,当触发错误路径时需要终止子进程而不执行目标可执行文件(可能某些设置失败或可执行文件毕竟不是可执行文件) . 其他用例可能包括寿命更长的辅助进程(例如在 pulseaudio 或类似代码出现之前来自 alsa 的 dmix 进程)。

由于这应该对开发人员友好,因此我正在寻找可以在库中实现而无需手动将参数添加到 valgrind 调用的解决方案。可能的解决方案可能包括使用客户端请求、使用客户端请求监控命令或智能编码。

最小的例子:

// build with cc example.c -o example
// valgrind --leak-check=full --show-leak-kinds=all ./example

#include <stdlib.h>
#include <unistd.h>

void something_that_forks() {
    pid_t pid = fork();
    if (pid == 0) {
        _exit(0);
    }
}

int main(int argc, char* argv[]) {
    void *some_allocation = malloc(1000);
    something_that_forks();
    free(some_allocation);
    return 0;
}

我想something_that_forks 在某个图书馆里。我正在寻找一种方法来修改它,以便 valgrind 不会报告子进程中的泄漏。当然,库对其他组件在主程序中的分配一无所知。

4

1 回答 1

1

目前(valgrind 3.15),加载抑制文件的唯一方法是在命令行上指定它。

然而,添加一个监视器命令来加载一个新的抑制文件看起来很容易。然后可以交互地使用此监视器命令(使用 vgdb)和/或使用客户端请求 VALGRIND_MONITOR_COMMAND。这样,子进程或库中的代码可以加载特定于该库或进程的抑制文件。

例如,为了抑制 fork 之后的所有泄漏,您可以在 _exit(0) 之前调用以下代码:

VALGRIND_MONITOR_COMMAND("load_suppression a_specific_file_for_this_process_or_library.supp");

其中给定的抑制文件包含与所有堆栈跟踪匹配的泄漏的抑制条目。

请参阅附加到https://bugs.kde.org/show_bug.cgi?id=411134的 补丁 此补丁允许在启动后更改各种命令行选项,包括告诉是否/如何进行泄漏搜索的选项。

该补丁作为 3a803036 被推送到 Valgrind git 存储库。

于 2019-08-03T13:48:26.843 回答