2017-07-31 84 views
1

據我所知,程序中的每個函數符號在地址空間都有相應的內存區域。 call彙編指令推動ip和其他一些信息在堆棧上並跳轉到該範圍的開始處。如何使用GDB獲取函數的內存區域

我需要在使用GDB進行調試時獲得該範圍。我可以很容易地使用info symbol獲得與給定地址或行相對應的函數的名稱。我需要相反的:符號 - >地址範圍。實際上,我甚至可以使用TUI模式,將彙編代碼滾動到函數末尾,並在最後一條指令附近查看「<symbol_name> + <offset>」註釋,但這絕對不是正確的方法(更糟的是,因爲我使用GDB/MI)。

如何使用GDB將符號與其內存範圍相匹配?

回答

0

據我所知,對於程序中的每個函數符號,地址空間中都有相應的內存區域。

給定的「源」功能可以佔據0(在情況下,函數不會被調用和所述接頭垃圾收集它)或更多的地址鏈接的ELF圖像中的範圍內:

  1. 編譯器可以自由地將函數分成多個部分,每個部分都有自己的地址範圍,鏈接器沒有義務將這些部分放在一起。 GCC會這樣做,以便例如爲了最大限度地減少TLB刷新,請在foofoo.hot部分)和頻繁執行的部分(foo.cold部分)中分別保留 頻繁執行的部分。

  2. 反轉也是可能的:當foo被頻繁地用一個固定的參數值調用時,GCC可以複製該函數(foo.clone.123)併爲該值優化該副本。

我如何使用GDB到內存範圍內的符號匹配嗎?

要找到範圍的開始,只需print &foo

似乎沒有辦法在GDB中查找範圍的末尾(除了已發現的disas命令外)。在ELF平臺上,您可以輕鬆地從例如readelf -Ws | grep foo