2013-10-11 65 views
1

我有一個精簡的linux系統,爲此我必須在另一個系統上交叉編譯我需要的所有應用程序。這些應用程序經常是核心,我從中得到的唯一信息是核心和指令抵消的功能。如果我沒有其他選擇,我對可執行文件執行objdump,並嘗試從指令偏移量和彙編代碼片段中猜測源代碼。這是我的生活。從C++核心轉儲推斷源代碼行號

注意:應用程序使用g ++進行交叉編譯,並被剝離。所以gdb沒有太多幫助我

問題: 由於編譯器/ gcc已將源代碼行轉換爲彙編指令,wouldnt會有一些選項,會給指令偏移量和行之間的相關性?

回答

4

-g創建構建,然後從中獲取符號映射。將它保存到某處(我會建議使用調試符號保存二進制文件 - 這樣更簡單),然後去除調試符號(使用strip程序),並將生成的二進制文件部署到目標系統。這裏是如何:https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

它崩潰後,或者恢復轉儲與-g編譯二進制或與釋放二進制和單獨的調試文件。如果你有調試符號的崩潰地址和二進制文件,並且你想把它映射到源代碼行 - 你可以使用addr2line -e your_binary crash_address而不是gdb。

2

您需要使用-g標誌編譯源代碼,該標誌啓用調試信息,從而提供您所要求的完全相關性。

然後,如果您的應用程序崩潰,您可以在gdb中運行它,並在崩潰時檢查程序狀態。

2

如果您使用非剝離二進制來調試核心文件(這是由剝離的二進制生成的),您可以獲得行/文件信息。