4

Linux の ARM CPU ハードウェアで C++ コードを実行しています。ハードウェアでバイナリを実行し、プロセスを監視して、メモリ使用量が時間の経過とともに増加しているかどうかを 30 分ごとに確認します。

top -p pid-of-process

列を表示するには:上部の出力にRESメモリとメモリ %

また、チェック

cat /proc/pid-of-process/status 

フィールドVMRSSを表示するには: これは、プロセスの Resident Set サイズ メモリです。

VMRSS および RES メモリが 1 時間ごとに数百キロバイトずつ増加し続けていることがわかります。プロセスは実行されているだけで、テストは実行されていないため、常に同じことを実行しており、負荷は変化しません。

今私が持っている質問は次のとおりです。これは、コードにメモリリークの可能性があることを意味しますか?

それとも、もしあれば、この増加は何か他のものに起因する可能性がありますか?

メモリ リークがあるかどうかを確認するには、次の手順を実行します。

  1. コードを見直して、すべての新しい(動的メモリ演算子)に対応する削除(空きメモリ)があることを確認しました

  2. valgrind memcheck でプロセス全体を実行しましたが、レポートにはリークは見られませんでした。そうですか

確実に失われました: 0 ブロックに 0 バイト

間接的に失われた: 0 ブロックで 0 バイト

失われた可能性: 7 ブロックで 1,008 バイト

* *編集: 以下のアルネのコメントに答えるために。おそらく失われたブロックは、pthread_create 以降の glibc のものです。

5 ブロックの 720 バイトが損失レコード 27/56 で失われる可能性があります

==11151== 0x402732C: calloc (vg_replace_malloc.c:467)

==11151== by 0x4010C34: allocate_dtv (dl-tls.c:300)

==11151== by 0x40113D8: _dl_allocate_tls (dl-tls.c:464)

==11151== by 0x404746C: pthread_create@@GLIBC_2.1 (allocatestack.c:571)**

この時間の経過に伴うメモリの増加は何でしょうか? 原因を見つけるためにさらにデバッグするにはどうすればよいですか?

4

1 に答える 1

0

単純なリークを見つけることができないため、メモリ状態のスナップショットを比較して、何が変化したかを確認する必要があるようです。簡単に検索すると、valgrind の massif がスナップショットを実行できることがわかり、それらを比較するためのpython スクリプトがあります (ただし、プログラムが小さい場合は、おそらく手動で比較できます)。

于 2013-08-21T15:09:42.677 に答える