簡體   English   中英

我有一個發布二進制文件,沒有使用gcc構建的調試信息,有源代碼

[英]I have a release binary with no debug information build with gcc , have source code

當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,gdb的回溯中僅顯示了幾種方法,為什么會發生這種情況? 這是因為在調試模式下有額外的方法,在調試和釋放模式下如何使兩個方法具有相同的地址。 同樣在這種情況下,如何構建具有完整堆棧跟蹤的准確地址信息。 任何幫助將不勝感激,因為我是Linux調試的新手,而Windows對pdb文件的調試似乎要容易得多。

正如@rockoder答案的注釋中所討論的那樣,除了在優化的構建中缺少調試符號(它將包含在-g )之外,由於內聯,整個函數調用可能不再存在。

當我嘗試使用調試模式構建源代碼時,顯示的堆棧完全不同,並且在釋放的情況下,gdb的回溯中僅顯示了幾種方法,為什么會發生這種情況? 這是因為在調試模式下還有其他方法嗎?

這可能只是由於編譯器優化。 您所謂的發布版本可能是在啟用編譯器速度優化和禁用調試符號的情況下構建的。 速度優化包括代碼內聯,該代碼內聯僅將函數代碼復制到位而不是調用它,因此函數在調用堆棧中不可見。 如果代碼是通過適當的預處理程序檢查編寫的,則可能還會有一些其他/不同的方法。

如何在調試和釋放模式下使兩個方法具有相同的地址。

取決於您的調試和發布模式。 如果它們使用相同的編譯器優化並且僅在調試信息上有所不同,則方法將具有相同的地址。 如果您的調試版本未進行優化(在GCC上為-O0),則方法會更大,因為會進行許多不必要的工作,例如,在每次操作之前從內存中讀取變量,然后在執行之后將其寫回。 由於每種方法可能會更小,因此函數將具有不同的地址,因為它們通常一個接一個地打包在一起。

同樣在這種情況下,如何構建具有完整堆棧跟蹤的准確地址信息。

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

任何幫助將不勝感激,因為我是Linux調試的新手,而Windows對pdb文件的調試似乎要容易得多。

Windows二進制調試是否有顯着差異?

g ++ / gcc有許多用於調試程序的選項,但最常見的是-g 參考鏈接 討論的第一個選項是-g

這里有一些附加信息。

例:

編譯不帶-g代碼:

g++ broken.cpp -o broken_release

-g編譯代碼:

g++ -g broken.cpp -o broken_debug

現在啟動ls -l並注意文件broken_releasebroken_debug之間的大小不同。 broken_debug大小應大於broken_release 那是因為它包含調試信息,調試信息可以由gdb調試器使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM