メモリリークがユーザー空間で発生しているのか、カーネル空間で発生しているのかを確認する方法は?

メモリリークがユーザー空間で発生しているのか、カーネル空間で発生しているのかを確認する方法は?

私は独自のOpenGLライブラリであるWayland WestonとLinuxカーネルの独自のグラフィックドライバを使用する大規模なマルチスレッドオープンソースアプリケーションを持っています。このドライバは現在開発中であるため、バグがある可能性があります。

私は次の症状を観察しました。

  1. free -m私のアプリケーションを実行すると、利用可能なメモリ()が常に消費されます。定常状態では約1MB/5分を消費します。

  2. アプリを継続して停止して起動すると、記憶喪失が速くなる可能性があります。アプリケーションを再起動するたびに約0.5MBが失われるようです。

  3. アプリケーションを停止すると、メモリはシステムに返されません。メモリは、電源を入れ直した後にのみ復元されます。

  4. メモリ使用量を記録し、写真を撮り始めました/proc/<pid>/smaps。どのスレッドがメモリを消費しているかを確認でき、さらに詳しく調べてみましょう。

  5. smapsファイルを調べると、古いスナップショットが時間の経過とともにより多くのメモリを消費することがわかりました。anon_inode:dmabuf以前のスナップショットには、次の問題に似た項目があります。

    https://stackoverflow.com/questions/28097766/where-does-the-dev-zero-deleted-anon-inodedmabuf-comes-from-in-proc-p

    https://bugs.freedesktop.org/show_bug.cgi?id=100298

このメモリリークは、ユーザ空間メモリリークまたはカーネルメモリリークである可能性が高いでしょうか?

漏れの原因の範囲を狭めるために他のどの診断を実行できますか?

ベストアンサー1

アプリケーションはmmap()を介して匿名メモリ割り当てを実行しますか?
RAMディスクにデータやログファイルが書き込まれていますか?ずっと開始して終了するスレッドはありますか?スレッド出口を正しく処理しますか? (行ってみると、漏れがあることがわかりました。)

誰がメモリリークをする確率が99%より高いと思います。

おすすめ記事