2011-01-21 1 views
0

返事と回答ありがとう。この質問は編集されました。なぜなら、私の以前の質問すべてが非常にぼやけていて、私が達成したいと思うことと目標を正確に示していないからです。 LinuxプラットフォームでC言語を使用してヒープの最後のアドレスを知るには?

、私のアプリケーションで使用されるヒープのサイズを決定することが可能でどのような方法:

は質問を更新しました。例えばのような..

void printHeapReport() 
{ 
    /* implementation here to print the heap size */ 
} 

int main() 
{ 
    char *ptemp = NULL; 
    p = (char*)malloc(10); /* 10 bytes */ 

    printHeapReport(); 

    return 0; 
} 

アプリケーションの標準出力画面で出力されます:私は、ヒープのサイズを印刷するアプリケーションでのデバッグレポートを作成したいので

Debug Report: 
-------------- 
Heap: 10 bytes 
-------------- 

が、私はこれを聞いて。

アドバイスをしてください。

多くのありがとうございます。


旧質問:

、CのASMのインライン関数を使用するには、ヒープの開始およびヒープの終わりのアドレスを知ることができますか?また、プログラムの最後のアドレス?

asm(<assembly code>); 

このコードを使用すると、アプリケーションで使用されるヒープのサイズを判断できます。このアプローチは、ヒープのサイズを決定するのに有効ですか?

アドバイスをしてください。

多くのありがとうございます。

+1

「プログラムの終了」とはどういう意味ですか?コードセクションの終わり?最後のセクションの終わりか?またはアセンブラプロシージャの終了? – Max

+0

こんにちは、私はコードセクションを意味します。ありがとうございます – domlao

+1

これを行う必要がある正当な理由を教えていただけたら感心します。 – GManNickG

答えて

4

あなたは少なくともあなたが扱っているプラ​​ットフォームを指定しなければならず、多くのプラットフォームでその質問には本当に答えがないということを認識しなければなりません。 'ヒープ'は連続している必要はありません。多くの場合、さまざまな種類のオブジェクト(特定のサイズの要求など)にはいくつかのヒープがあり、実行時には、必要に応じて基礎となるOSから 'ヒープ' 。

同様に、「プログラム」 - 実行可能ファイルのさまざまな部分には、データがないか、またはアドレス空間に何も含まれていない領域が散在している場合があります。

+0

だから、私はヒープのアドレスを決定し、ヒープのサイズを計算することは不可能だと思います。 – domlao

+1

@sasayins:プラットフォームによっては可能かもしれません。あなたが 'asm'ブロックを使用しているので、私は移植性があなたにとってあまり重要ではないと考えます。 –

3

アセンブリは全く役に立たないこれです。システムの標準ライブラリの実装が、ヒープの先頭のアドレスを格納する変数を公開している場合、asmなしで簡単にアクセスできます。それ以外の場合は、OS固有のプロセスデータ(Linuxの場合)/proc/self/smapsにアクセスして処理することができ、プログラムのアドレスレイアウトを決定することができます。しかし、関係なく、さんはあなたを助けません

+0

ヒープのサイズを知る実装があることを願っています。 – domlao

+0

あなたが達成しようとしていること、「ヒープ」として含めることが何を意味しているのか、どのOSにいるのかを説明してください。それ以外の場合は、「ヒープ」の概念が実装固有のものであるため、手助けする方法はありません。 –

+0

@R:私はLinux OSです。私は本当に私のアプリケーションのヒープのサイズを知ることができますか知りたいです。編集された質問ありがとうございます。 – domlao

2

標準ライブラリがglibc(可能性が高い)の場合は、#include <malloc.h>を呼び出し、malloc_stats();を呼び出してヒープレポートをstderrに出力します。

関連する問題