在ARM

2012-07-17 15 views
3

堆紋我開發的基於MX51-飛思卡爾板的Linux 2.6.35一個GUI重型C++應用程序。 我想執行堆分析。在ARM

不幸的是,我發現所有的堆分析工具要麼過於侵擾或ARM表面上非工作。具體的工具,我已經試過:

  • Valgrind Massif:不可行我的平臺上,由於平臺的微弱CPU。由Massif引入的80%的CPU時間開銷會導致我的應用程序中的一系列問題無法補償。
  • gperftools(原谷歌性能工具)tcmalloc:這個相當非侵入性的,基於庫的libc malloc()更換我的目標除了爲堆探查工作的所有功能。換句話說,線程緩存分配器可以工作,但分析器不能。我會解釋下面的剖析器的失敗模式,好奇任何人。

任何人都可以推薦一組用於在ARM平臺上執行C++堆分析的替換工具嗎?理想的輸出最終將是一個定向分配圖,類似於gperftools的tcmalloc輸出。低資源利用率是必須的 - 我的平臺資源受到很大限制。 gperftools' tcmalloc的


失效模式解釋說:

我只提供了那些好奇的信息;我不期望得到迴應。我看到類似於gperftools'#407以下的問題,除了ARM而不是x86。 具體來說,我總是會收到消息「Hooked allocator frame not found,returns empty trace。」我花了一些時間調試的問題,看來,當動態鏈接庫tcmalloc,在我的應用程序和動態庫之間的邊界的幀指針是空值堆棧不能走「上面」的號召到動態庫。

gperftools問題#407:hxxp://code.google.com/p/gperftools/issues/detail ID = 407

計算器用戶看到ARM的類似問題:Missing frames on shared libraries on ARM

+4

哇,所以512MB是「高度資源約束」... – 2012-07-17 13:20:08

+0

迴應我的想法來自GBA/DS編程:) – 2012-07-17 16:32:50

回答

1

堆。很多方法可以做到這些,但我只跨在嵌入式土地關係3種主要類型運行:

  1. 鏈表堆。每個分配都在「已用」列表中進行跟蹤。一旦釋放,它們將被放入「免費」列表中。在釋放時,相鄰的空閒內存塊被「連接」成較大的塊。分配可以是任何大小。每個alloc和自由是一個O(N)運算,因爲它必須遍歷空閒列表給你一塊內存加上打破空閒塊成大小接近你問什麼,同時留下剩餘塊空閒列表。由於每個分配的開銷不斷增加,該系統無法在較小的系統上使用。如果不採取措施將其最小化,這也會導致內存碎片隨時間推移。

  2. 固定大小(單元)的堆。你把你的堆分成相同大小(較小)的部分。這會浪費內存了一下,這取決於塊有多大(有多少不同的尺寸,固定分配堆創建),但alloc和free都是O(1)時間的操作。沒有搜索,沒有加入。這種風格通常與第一個「小對象分配」相結合,因爲我所使用的引擎有95%的分配低於設定的大小(比如256字節)。通過這種方式,您可以使用單元堆進行小的分配,以獲得巨大的速度並且只有最小的內存損失,同時使用列堆進行更大的分配。沒有外部碎片的內存。

  3. 可重新定位的內存堆。你不會給出指向內存的指針,但是可以處理。這樣,在幕後,您可以在需要時更改內存指針以刪除碎片或其他內容。高開銷。痛苦的@ $$商,因爲它很容易濫用,並得到懸掛指針。還增加了每個內存解引用的開銷。但是想提到它。

有一些基本模式。你可以在野外找到各種使用它們的庫,並且還內置了分配數量,碎片和其他有用統計數據的統計數據。這也不是很難推出自己的真正,雖然我不會推薦它滿足好奇心之外的任何事情,因爲調試沒有工作的malloc確實是痛苦的。添加線程支持也非常簡單,但同樣,下載現成的解決方案是更好的選擇。

以上信息適用於所有平臺,ARM或其他,儘管我的大部分經驗都在低級別的ARM內容上,所以上述信息已針對您的平臺進行了測試。希望這可以幫助!