1

ユーティリティでフォークされた子プロセスを終了するときに、すべてのメモリを解放できないことがよくあります。ライブラリ内のこれらのメモリ リーク検出を抑制したい。

--show-leak-kinds=allライブラリを使用している開発者に、誰も実際には何もできない子プロセスからのリーク レポートを確認しなければならないという負担をかけたくありません。

コマンドラインで を使用して、すべての fork プロセスのレポートを抑制できることは承知してい--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