2009-10-12 82 views
2

什麼是最好的和最簡單的方法來調試優化的代碼在Unix上編寫的C?Unix上的優化代碼?

有時我們還沒有構建未優化庫的代碼。

+0

優秀的整合問題。 – whatnick 2009-10-12 11:59:01

回答

3

這是一個非常好的問題。過去,我不得不在我的應用程序中集成第三方工具,但我也遇到過類似的困難。根據我的經驗,您需要在關聯的符號文件中至少包含有意義的調用堆棧。這僅僅是地址和相關函數名稱的列表。這些通常會被剝離,從二進制文件中你不會得到它們......如果你有這些符號文件,你可以在啓動gdb或之後添加它們來加載它們。如果不是這樣,你就會陷入彙編級別......

一個奇怪的行爲:即使你有源代碼,它會在你不期待的地方跳來跳去(語句可能會被重新排序爲了獲得更好的性能)或變量不再存在(優化離開!),在內聯函數中設置斷點是毫無意義的(它們不在那裏,而只是它們內聯的一部分)。所以即使有源代碼,也要注意這些陷阱。

我忘了提,符號文件的擴展名通常.GDB,但也可以是不同的...

0

通過相同的接口寫的小代碼樣本(在它的頭的東西),並調用您的樣品而不是那個優化的代碼,比如說模擬,來縮小你調試的代碼範圍。此外,您可以在樣本中進行錯誤注射。

+0

是的,但如果它包含幾百個用於構建一個可執行文件的c文件,並且我正在調試該可執行文件,那麼會導致頭疼:( – Vijay 2009-10-12 11:31:41

+0

樣本大小(總共有多少行)取決於您,現在您可以使用debuger(即gdb),因爲擁有所有的源代碼。 – Test 2009-10-12 12:36:39

2

這個問題不像「修理乘用車的最佳方法是什麼?」

在UNIX上調試優化代碼的最佳方法取決於您具有哪個UNIX,您有哪些可用的工具以及您嘗試調試的問題類型。

malloc中調試崩潰與調試unresolved symbol at runtime有很大不同。

對於一般的調試技術,我推薦這個book

幾件事情會更容易在「集結號級別」調試:

  • 你應該知道呼叫 約定的平臺,讓你 能告訴什麼是傳遞 和返回值,在哪裏可以找到指針,哪些寄存器是「主叫保存」的,哪些是「被保存的」,等等。
  • 你應該知道你的操作系統「調用約定」 - 系統調用是什麼樣的,哪個寄存器系統調用號碼,第一個參數等。
  • 你應該 「大師」的調試器:知道如何 找到線程,如何阻止個別 線程,如何設置單獨的指令,單步條件 斷點,單步或跳過函數調用, 等等。

它通常有助於「並行」調試工作程序和破損程序。如果版本1.1工作,版本1.2不工作,那麼他們在特定的API方面有什麼分歧?在調試器下啓動這兩個程序,在同一組函數上設置斷點,運行這兩個程序並觀察哪些斷點被擊中的差異以及傳遞哪些參數。

+0

我通常會遇到一個崩潰問題,我正在AIX平臺上工作。在我的工作環境中,只有dbx可用。有時它會顯示錯誤的行號值和有時候,我會在函數調用中看到soem垃圾值。這讓我很困惑。 – Vijay 2009-10-14 05:10:23