2016-10-28 12 views
-2

私はARM Cortex-A9で動作するアプリケーションを持っています。コードの特定の部分を入力すると、Linuxタスクの「top」ビューで、アプリケーションが物理メモリが不足して終了するまでメモリ使用量が増加することがわかります。Embedded Linuxデバイスで実行されているC/C++アプリケーションでのメモリリークのデバッグ

これについていくつかの調査を行い、mtraceを実装しようとしましたが、それは私に非常に簡潔な結果を与えませんでした。基本的に私はこの

Memory not freed: 
----------------- 
    Address  Size  Caller 
0x03aafe18  0x38 at 0x76e73c18 
0x53a004a8  0x38 at 0x76e73c18 

のようなものを取得し、私も、これは大きな問題(多分別の小さい問題)ではないと思います。

それとコンパイラをインストールするには、デバイス上に十分なスペースがないので、私はまた

は、だから私は、私は単にコードを通過する必要があることを恐れて...(おそらく素晴らしい仕事だろう)Valgrindのを使用することはできませんメモリ使用量の増加を引き起こす可能性のあるものを探してください。どこかのガイドがありますか?コードでは、 "malloc"または "new"はほとんど使用されません。

私はgdbを利用することができます。コード内の多くはあり

while(someloop){ 
... 
    double *someptr; 
... 
} 

など

while(someloop){ 
... 
    int32 someArray[100] = {0}; 
... 
} 

をそのうち次が問題であるならば、私は上の明確でないです

一つのことです。そのループが発生し、それらの変数またはポインタをインスタンス化するときは、空き領域を使用し続けますか、または最後の反復のスペースを使用しますか?

+0

示されたコードに問題はありません。バグは他の場所になければなりません。 –

+0

なぜデバイス上にコンパイラが必要ですか? –

+0

最後の2つのスニペットに応答して、コードは最後の反復からのスペースを使用する必要があります。毎回より多くの領域を割り当てていた場合は、スタックにオーバーフローすることになります(これらの変数はスタックに割り当てられているため)。アセンブリコードを見て確認することができます。 '-S'でコンパイルしてアセンブリコードを取得するか、デバッガでアセンブリコードを参照してください。 – user3386109

答えて

1

スタックにアロケートされている場合は、メモリが再利用されます。ただし、ヒープ上に配置することで削除する必要があります。 また、あなたがdouble * ptr; ... ptr = new double [5]、あなたはdelete [] ptrで削除する必要があります。

C++では、新規および削除演算子を上書きして、デバッグ用のメッセージを出力できます。

ベストはgdbを使ってデバッグし、どのオブジェクトが作成され、削除されていないかを確認することです。

コード内で内部的なものを削除しないクラスを使用する可能性があります。

ヒント:スタック上に配置された小さなオブジェクトは、より高速で安全です。