2009-10-06 72 views
2

在使用跟蹤時,我發現一些函數沒有在源代碼中列出,同時試圖找到它們以便放置一個斷點。這些函數似乎只在我以彙編格式查看源文件時纔會出現。使用Lauterbach進行調試(Trace32)

我對我的前輩說過,他們告訴我,如果任何函數只被調用一次,它將被Trace優化並顯示爲內聯,因此可以在彙編中看到。

我的問題是:

  1. 這是如何發生的優化通過勞特巴赫?
  2. 這是否有利?

回答

5

有幾件事情:

  1. 關於我發現一些功能沒有在源上市,而試圖找到他們爲了把一個斷點」的說法,只是檢查映射文件/映射文件,它由構建中使用的不同功能,它們在內存中的位置等組成,如果在那裏找不到功能,則只需查看優化[只有這可能是問題] 。

  2. 正如所指出的那樣,優化不是由勞特巴赫完成的,而是由編譯器完成的。通常情況下,有不同的優化級別[在ARM中我們有O0-O2],其中O0是可能的最優化,但只有在向客戶發佈時纔會使用,否則優化級別O2應該用於調試。

  3. 如果您覺得該功能可能會被編譯器優化,請嘗試使其成爲volatile

  4. 其他可能與此無直接關係但可能有所幫助的一點是要知道「內存的哪個區域是你的文件所在」,因爲很多時候,當你想調試某些東西,並且Page仍然是不是在RAM中,你將不能夠把斷點,直到該頁面被認爲在RAM [基本上,像按需分頁,如果它出現在你的系統]

希望時間這有助於。

-hjsblogger

1

內聯僅被調用一次的函數可以由編譯器完成。

其優點是它節省了函數調用(運行時,代碼空間和堆棧空間)的開銷,並且仍然可以以很好的模塊化方式將代碼編寫爲幾個函數。

缺點是調試變得困難,因爲在調試過程中功能與調用者混淆了。

W.r.t.你的跟蹤工具的行爲你的問題是相當不清楚的。

1

如果有被調用的函數,你不能在你的源代碼中找到它不可能是因爲內聯函數有兩個原因:

  1. 內聯函數調用不會顯示爲子程序調用在彙編代碼中 - 實現該函數的代碼在內聯函數調用所在的點處發出(這就是內聯的地方)

  2. 當編譯器內聯函數調用時,函數名稱(如果可以的話)在彙編輸出中看到它)仍然是你的源代碼的一部分 - 這是編譯器w的地方應該得到內聯代碼。

但是,編譯器有時插入神祕函數調用內部輔助函數到所生成的代碼來實現的東西等的算術運算,該CPU不直接支持(整數除法或浮點運算例如)。

'神祕功能'的名字是什麼?

4

優化由編譯器完成,而不是由Lauterbach完成。編譯器會嘗試優化其彙編語言輸出,而默認設置通常會內聯僅調用一次的函數。

要覆蓋這些用於測試目的的優化,可以使用編譯器標記--no_inline