當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,只有少數方法顯示在回溯與gdb, 爲什麼會發生這種情況?這是因爲在調試模式下還有其他方法,在調試和釋放模式下,兩個方法如何具有相同的地址? 同樣在這種情況下,我怎樣才能建立到具有完整的堆棧跟蹤準確的地址信息。任何幫助將不勝感激,因爲我是在Linux上進行調試的新手,Windows使用pdb文件似乎更容易。我有一個沒有使用gcc構建調試信息的版本二進制文件,它有源代碼
1
A
回答
0
1
正如對@ rockoder的回答的評論中所討論的那樣,除了缺少調試符號(將包含在-g
中)的優化構建中,整個函數調用可能因內聯而不再存在。
1
當我嘗試建立與調試模式下顯示源的堆棧 完全不同勢和釋放的情況下,只有在使用gdb回溯所示的幾個方法 ,爲什麼會出現這種情況?這是 ,因爲在調試模式下有額外的方法?
這可能只是由於編譯器的優化。您稱之爲發佈版本可能是在啓用編譯器速度優化和禁用調試符號的情況下構建的。速度優化包括代碼內聯,它只是複製功能代碼而不是調用它,所以函數在調用堆棧中不可見。 也可能有一些額外/不同的方法,如果代碼是用一些適當的預處理器檢查寫的。
在調試和發佈 模式下,如何使兩種方法具有相同的地址。
取決於您的調試和發佈模式。如果它們使用相同的編譯器優化並且僅在調試信息方面不同,則方法將具有相同的地址。如果你的調試版本沒有優化(GCC上的-O0),那麼方法會變得更大,因爲完成了許多不必要的工作,例如變量在每次操作之前都從內存中讀取並在其後寫回。由於每種方法可能會更小,函數將具有不同的地址,因爲它們通常是一個接一個地打包。
同樣在這種情況下,我該如何建立到具有完整堆棧跟蹤的準確地址 信息。
啓用調試信息。在GCC上會是-g3(或-g或類似的)。這會爲代碼地址< - >源代碼行查詢(來自調試器或崩潰堆棧轉儲)添加足夠的信息。
任何幫助將不勝感激,因爲我是新手在Linux上進行調試, Windows對於pdb文件似乎更容易。
與Windows二進制文件調試有任何顯着差異嗎?
相關問題
- 1. 在GCC調試二進制文件中的源代碼位置
- 2. 在構建的二進制文件中更改版本信息
- 3. 過剩,GLEW DLL:二進制沒有調試信息的
- 4. 調試混合Delphi(本地)和C#代碼,得到「二進制沒有調試信息」
- 5. 二進制文件中的GCC版本
- 6. 有沒有開源的二進制文件有區別?
- 7. 有沒有辦法讓gcc輸出原始二進制文件?
- 8. 用gdb調試沒有源代碼
- 9. GNU Autotools:重建沒有版本信息
- 10. 模塊沒有調試信息建
- 11. 沒有可用的版本信息
- 12. 從已經安裝二進制文件的源代碼構建一個包
- 13. 「二進制沒有與調試信息」警告意義在mfc應用程序?
- 14. 編譯靜態二進制文件,代碼中有一個函數調用gethostbyname
- 15. 二進制版本和源代碼版本之間的區別?
- 16. 輸出二進制文件鏈接我的版本控制服務器沒有構建系統?
- 17. gcc是否有任何選項在ELF二進制文件中添加版本信息?
- 18. C#項目構建好,但沒有生成二進制文件
- 19. 構建一個沒有源代碼的linux模塊
- 20. 構建一個extjs應用程序,我只有源代碼
- 21. 從python腳本創建沒有.exe的二進制文件
- 22. 具有時間戳的二進制文件的版本控制
- 23. 我有DevExpress 9.1源代碼,我想調試它,怎麼做?
- 24. TeamCity有沒有辦法讓最後一個固定版本號碼進入當前版本的構建步驟?
- 25. 可以通過.NET代碼簽署一個二進制文件嗎? (沒有signtool.exe)
- 26. 我應該有一個項目的構建文件以及源代碼嗎?
- 27. 爲什麼gcc源代碼中沒有.l文件?
- 28. 沒有代碼覆蓋測試信息使用Moles
- 29. 有沒有辦法使用螞蟻構建UTF-8源文件
- 30. 有沒有優化x86二進制代碼的庫?
-1這根本不回答問題。 – Manu343726
+1 @ Manu343726,是的。這與這部分完全相關:「當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,gdb的回溯中只顯示了幾個方法,爲什麼會發生這種情況?」 – rerx
@rerx寫了'g ++ -g'文檔不是對這個問題的回答....答案是缺少調試simbols和編譯器在釋放模式下執行的優化(內聯,在少功能的情況下) 。 – Manu343726