2014-03-31 32 views
1

當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,只有少數方法顯示在回溯與gdb, 爲什麼會發生這種情況?這是因爲在調試模式下還有其他方法,在調試和釋放模式下,兩個方法如何具有相同的地址? 同樣在這種情況下,我怎樣才能建立到具有完整的堆棧跟蹤準確的地址信息。任何幫助將不勝感激,因爲我是在Linux上進行調試的新手,Windows使用pdb文件似乎更容易。我有一個沒有使用gcc構建調試信息的版本二進制文件,它有源代碼

回答

0

g ++/gcc有很多選項用於調試程序,但最常見的是-g。請參閱link。討論的第一個選項是-g

一些附加信息here

例子:

編譯代碼,而無需-g

g++ broken.cpp -o broken_release

編譯代碼-g:現在

g++ -g broken.cpp -o broken_debug

ls -l並注意大小的文件之間的不同和broken_debugbroken_debug的大小應該大於broken_release的大小。這是因爲它包含調試信息,可供調試器使用,如gdb

+0

-1這根本不回答問題。 – Manu343726

+0

+1 @ Manu343726,是的。這與這部分完全相關:「當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,gdb的回溯中只顯示了幾個方法,爲什麼會發生這種情況?」 – rerx

+0

@rerx寫了'g ++ -g'文檔不是對這個問題的回答....答案是缺少調試simbols和編譯器在釋放模式下執行的優化(內聯,在少功能的情況下) 。 – Manu343726

1

正如對@ rockoder的回答的評論中所討論的那樣,除了缺少調試符號(將包含在-g中)的優化構建中,整個函數調用可能因內聯而不再存在。

1

當我嘗試建立與調試模式下顯示源的堆棧 完全不同勢和釋放的情況下,只有在使用gdb回溯所示的幾個方法 ,爲什麼會出現這種情況?這是 ,因爲在調試模式下有額外的方法?

這可能只是由於編譯器的優化。您稱之爲發佈版本可能是在啓用編譯器速度優化和禁用調試符號的情況下構建的。速度優化包括代碼內聯,它只是複製功能代碼而不是調用它,所以函數在調用堆棧中不可見。 也可能有一些額外/不同的方法,如果代碼是用一些適當的預處理器檢查寫的。

在調試和發佈 模式下,如何使兩種方法具有相同的地址。

取決於您的調試和發佈模式。如果它們使用相同的編譯器優化並且僅在調試信息方面不同​​,則方法將具有相同的地址。如果你的調試版本沒有優化(GCC上的-O0),那麼方法會變得更大,因爲完成了許多不必要的工作,例如變量在每次操作之前都從內存中讀取並在其後寫回。由於每種方法可能會更小,函數將具有不同的地址,因爲它們通常是一個接一個地打包。

同樣在這種情況下,我該如何建立到具有完整堆棧跟蹤的準確地址 信息。

啓用調試信息。在GCC上會是-g3(或-g或類似的)。這會爲代碼地址< - >源代碼行查詢(來自調試器或崩潰堆棧轉儲)添加足夠的信息。

任何幫助將不勝感激,因爲我是新手在Linux上進行調試, Windows對於pdb文件似乎更容易。

與Windows二進制文件調試有任何顯着差異嗎?

相關問題