回答
這是一個非常好的問題。過去,我不得不在我的應用程序中集成第三方工具,但我也遇到過類似的困難。根據我的經驗,您需要在關聯的符號文件中至少包含有意義的調用堆棧。這僅僅是地址和相關函數名稱的列表。這些通常會被剝離,從二進制文件中你不會得到它們......如果你有這些符號文件,你可以在啓動gdb或之後添加它們來加載它們。如果不是這樣,你就會陷入彙編級別......
一個奇怪的行爲:即使你有源代碼,它會在你不期待的地方跳來跳去(語句可能會被重新排序爲了獲得更好的性能)或變量不再存在(優化離開!),在內聯函數中設置斷點是毫無意義的(它們不在那裏,而只是它們內聯的一部分)。所以即使有源代碼,也要注意這些陷阱。
我忘了提,符號文件的擴展名通常.GDB,但也可以是不同的...
這個問題不像「修理乘用車的最佳方法是什麼?」
在UNIX上調試優化代碼的最佳方法取決於您具有哪個UNIX,您有哪些可用的工具以及您嘗試調試的問題類型。
在malloc
中調試崩潰與調試unresolved symbol at runtime
有很大不同。
對於一般的調試技術,我推薦這個book。
幾件事情會更容易在「集結號級別」調試:
- 你應該知道呼叫 約定的平臺,讓你 能告訴什麼是傳遞 和返回值,在哪裏可以找到指針,哪些寄存器是「主叫保存」的,哪些是「被保存的」,等等。
- 你應該知道你的操作系統「調用約定」 - 系統調用是什麼樣的,哪個寄存器系統調用號碼,第一個參數等。
- 你應該 「大師」的調試器:知道如何 找到線程,如何阻止個別 線程,如何設置單獨的指令,單步條件 斷點,單步或跳過函數調用, 等等。
它通常有助於「並行」調試工作程序和破損程序。如果版本1.1工作,版本1.2不工作,那麼他們在特定的API方面有什麼分歧?在調試器下啓動這兩個程序,在同一組函數上設置斷點,運行這兩個程序並觀察哪些斷點被擊中的差異以及傳遞哪些參數。
我通常會遇到一個崩潰問題,我正在AIX平臺上工作。在我的工作環境中,只有dbx可用。有時它會顯示錯誤的行號值和有時候,我會在函數調用中看到soem垃圾值。這讓我很困惑。 – Vijay 2009-10-14 05:10:23
- 1. 優化代碼
- 2. 代碼優化
- 3. 使用#pragma G代碼優化的C代碼優化
- 4. 優化Android代碼
- 5. 優化代碼jsf
- 6. 優化Haskell代碼
- 7. VBA代碼優化
- 8. PHP代碼優化
- 9. 優化C++代碼
- 10. 優化VHDL代碼
- 11. 優化此代碼?
- 12. 優化pymssql代碼
- 13. 優化XSLT代碼
- 14. viewDidLoad - 代碼優化
- 15. 優化硒代碼
- 16. 優化C代碼
- 17. 優化C代碼
- 18. jQuery代碼優化
- 19. Python代碼優化
- 20. 優化python代碼
- 21. 優化Python代碼
- 22. Java代碼優化
- 23. SQL代碼優化
- 24. VB.Net代碼優化?
- 25. 優化Python代碼
- 26. Spark代碼優化
- 27. 優化C++代碼
- 28. C#代碼優化
- 29. SSE2代碼優化
- 30. 優化jQuery代碼
優秀的整合問題。 – whatnick 2009-10-12 11:59:01