![](/img/trans.png)
[英]Do I have to build gcc-10 from source on Ubuntu 18.04 to have OpenMP GPU target offload?
[英]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二進制調試是否有顯着差異?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.