4

私は非常にユニークな問題を抱えています。Octeonベースのハードウェアである特別なハードウェアでLinuxを実行しています。特定の操作を実行すると、プロセスがメモリを割り当て続けることがわかります。コードのどの部分がこの呼び出しを行っているかを追跡したいと思います。

これが私の環境の詳細です

  1. OcteonMIPSアーキテクチャ32ビット。
  2. Linuxカーネル2.6
  3. 最小限のLinux実装。

ただし、これが回避する必要のある私のオプション/制限です。

  1. 独自のmallocを作成することが役立つかどうかはわかりません。これが可能であれば、誰かが説明してもらえますか?
  2. このアーキテクチャでは使用できない、walgrindなどのツールは使用できません。
  3. コードベースは巨大であり、完全に理解していないため、レビューは実行可能で迅速ではありません。
  4. straceは割り当てられたメモリアドレスを教えてくれますが、これを作成したコードからどのように理解できますか?

これについて行く方法があるかどうか提案してください。

どうもありがとう。

私が言及するのを忘れたもう一つのことは、プロセスの仮想メモリが最大1.4GBまで増加し続け、そこで停止し、コード内の割り当てがENOMEMで失敗することを確認します。この1.4GBの制限は、32ビットマシンと関係がありますか?AFAIU 32ビットマシンは、プロセスごとに3 GBの仮想メモリを許可する必要がありますか?また、プロセスごとの制限はありません。これをsetrlimit/getrlimitで確認しました。

乾杯、パヴァン

4

2 に答える 2

5

にラッパー関数を書きたい場合mallocは、関数が呼び出されるコード内のすべてのインスタンスを変更せずに行うことができます。単純なマクロトリックで十分です。

void* my_malloc(size_t size, const char *file, int line, const char *func);

#define malloc(X) my_malloc( X, __FILE__, __LINE__, __FUNCTION__)

void* my_malloc(size_t size, const char *file, int line, const char *func)
{

    void *p = malloc(size);
    printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);

    /*Link List functionality goes in here*/

    return p;
}

同様に、マップfreeして独自の関数を呼び出すこともできます。

割り当てられたアドレスのリストを維持し、 で新しいエントリを追加したり、 でmalloc関連するエントリをリストから削除したりできますfree。プログラムの最後にリストに残っているのは、場所を含むメモリ リークです。

于 2012-06-06T18:29:38.037 に答える
0

Dmallocをご覧になることをお勧めします。valgrind よりもアーキテクチャへの依存がはるかに少ないはずです。

于 2012-06-06T18:26:58.073 に答える