2012-07-23 38 views
3

我有一個程序,它有大量的靜態定義的變量。如果我在GDB啓動它,在主一個破發點,然後運行PMAP,我看到有大約100MB的數據已經分配:GDB - 我可以在內存中找到大數據元素

08838000 107576K rw--- [ anon ] 

我已經發現的功能,一堆有巨大靜態定義的數組(例如200,000整數),並在我找到它們的時候擺脫它們。

有什麼方法可以找出堆/數據段上最大的項目是什麼?無論是在GDB還是通過其他方式?

+3

您可以通過objdump和nm輸出獲取符號(對象)大小。我想,需要調試信息。 – fork0 2012-07-23 13:42:37

+1

太棒了!花式寫它作爲答案:) nm --size-sort完全符合我的要求(並且在一些測試代碼中找到了一個20MB的2,500,000個整數,這在大多數系統中都不會使用!) – asc99c 2012-07-23 14:07:37

+0

這聽起來像一個一小部分代碼因爲缺乏關注:) – fork0 2012-07-23 14:28:04

回答

5

的信息可以通過使用對象代碼檢查公用事業等納米(1)中找到:

nm --size-sort <object-file.o> 

此外,objdump的可以給完全鏈接的程序額外的見解,給予足夠的調試信息。

這些實用程序通常是針對特定平臺的,因此在交叉編譯時必須注意使用正確的程序(即類似x86_64-linux-gnu-gcc-nm而不是僅僅是nm)。

+0

可以使用'C++ filt'將C++ mangled名稱後處理爲更多(或更少,如果有多個模板)可讀形式。 – fork0 2012-07-23 14:32:27

+0

或使用'nm'的'--demangle'選項。 – Shahbaz 2012-07-23 14:35:21

+0

@Shahbaz:對。有時它不起作用(我沒有找到原因),但無論如何都應該嘗試。 – fork0 2012-07-23 14:37:46

相關問題