2011-01-21 106 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