2011-01-21 144 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 inline函数,是有可能知道堆的开始和堆结束的地址?还有程序结束的地址?

asm(<assembly code>); 

因此,使用此代码我可以确定在我的应用程序中使用的堆的大小。这种方法对于确定堆的大小是否有效?

请指教。

非常感谢。

+1

“程序结束”是什么意思?代码段结束?或者最后一节结束?或者汇编程序结束? – Max 2011-01-21 05:07:44

+0

嗨,最高,我的意思是代码部分。谢谢 – domlao 2011-01-21 05:09:05

+1

如果你能告诉我需要这样做的好理由,我会留下深刻的印象。 – GManNickG 2011-01-21 05:13:14

回答

4

您必须至少指定您正在处理的平台,并在许多平台上实现该问题并没有真正的答案。 “堆”不需要是连续的 - 在许多情况下,对于不同类型的对象(比如对于特定大小的请求)会有几个堆,并且运行时可能根据需要从底层OS获取“堆”的块。

同样,对于'程序' - 可执行文件的各个部分可能会散布数据或地址空间中没有任何内容的区域。

3

装配是完全没用为此。如果您的系统的标准库实现暴露了一个变量来存储堆顶部的地址,那么您可以轻松访问它,而无需使用asm。否则,您可能能够访问和处理操作系统特定的过程数据,例如(在Linux上)/proc/self/smaps,以确定您的程序的地址布局。但无论如何,asm都不会帮你

2

如果您的标准库是glibc(可能),那么您可以#include <malloc.h>并致电malloc_stats();将一个堆报告打印到stderr

相关问题