32

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

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

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

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

私は Google を試して、問題を約 2 時間読んでみました。いくつかの興味深いことを学びましたが、まだ必要なものが見つかりません。

4

2 に答える 2

34

@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>
于 2010-04-07T01:24:56.010 に答える
6

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

#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()ます。

于 2010-04-03T00:20:17.037 に答える