web-dev-qa-db-ja.com

gdbでのC / C ++ヒープメモリ統計の調査

Linux AMD64のgdb内からC/C++ヒープの状態を調査しようとしていますが、これを行うための良い方法はありますか?

私が試したアプローチの1つは「mallinfo()を呼び出す」ことですが、残念ながら、gdbは戻り値を適切に処理しないため、必要な値を抽出できません。

アタッチされているプロセスのバイナリにコンパイルする関数を簡単に作成することはできないため、この方法で独自のコードでmallinfo()を呼び出すことにより、独自の関数を実装して値を抽出できます。これをオンザフライで実行できる巧妙なトリックはありますか?

別のオプションは、ヒープを見つけて、mallocヘッダー/フリーリストをトラバースすることです。これらの場所とレイアウトを見つけるためにどこから始めればよいかへのポインタがあれば幸いです。

私はグーグルで約2時間問題を読み解こうとしましたが、いくつかの魅力的なことを学びましたが、それでも必要なものが見つかりませんでした。

28

@fd- RedHatバグ に答えがありました。

mallinfo関数は廃止されており、更新されません。真のクエリ統計APIはTDBです。今日、あなたはmalloc_statsおよびmalloc_info。どちらのドキュメントも見つかりませんが、こちらが提供するものです。

これは必要なものに十分近いですか?

(gdb) call malloc_stats()
Arena 0:
system bytes     =     135168
in use bytes     =         96
Total (incl. mmap):
system bytes     =     135168
in use bytes     =         96
max mmap regions =          0
max mmap bytes   =          0

(gdb) call malloc_info(0, stdout)
<malloc version="1">
<heap nr="0">
<sizes>
<unsorted from="1228788" to="1229476" total="3917678" count="3221220448"/>
</sizes>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168"/>
<system type="max" size="135168"/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</heap>
<total type="fast" count="0" size="0"/>
<total type="rest" count="3221220448" size="3917678"/>
<system type="current" size="135168
/>
<system type="max" size="135168
/>
<aspace type="total" size="135168"/>
<aspace type="mprotect" size="135168"/>
</malloc>
27
leedm777

コードを変更できる場合:

_#include <malloc.h>
#include <stdio.h>

void dumpMallinfo(void) {
  struct mallinfo m = mallinfo();
  printf("uordblks = %d\nfordblks = %d\n", m.uordblks, m.fordblks);
}
_

GDBでは、call dumpMallinfo()を実行できます。

3
leedm777