簡體   English   中英

優化是否會影響使用其PDB調試VC ++應用程序的能力?

[英]Can optimizations affect the ability to debug a VC++ app using its PDB?

為了能夠正確調試發布版本,需要一個PDB文件。 當編譯器使用不同類型的優化(FPO,PGO,內部函數,內聯等)時,PDB文件是否會變得不太可用? 如果是這樣,優化效果是否嚴重或僅僅導致相鄰的代碼行混淆?

(我正在使用VC2005,並且總是選擇可調試性而非優化性能 - 但問題是一般的)

是的,優化的代碼可調試性較差。 不僅缺少一些信息,一些信息也會產生誤導。

我認為最大的問題是局部變量。 編譯器可以使用相同的堆棧地址或在整個函數中注冊多個變量。 正如其他海報所提到的,有時甚至會弄清楚“這個”指針是什么可能需要一些時間。 調試優化代碼時,您可能會看到當前行在單步執行時跳轉,因為編譯器重新組織了生成的代碼。 如果你使用PGO,這種跳躍可能會變得更糟。

如果您有PDB,FPO不應該過多地影響可調試性,因為PDB包含為FPO幀展開堆棧所需的所有信息。 使用需要在沒有符號的情況下獲取堆棧跟蹤的工具時,FPO可能會出現問題。 對於許多項目而言,如今FPO的性能優勢並不超過對可診斷性的影響; 因此,MS決定不使用FPO優化構建Windows Vista( http://blogs.msdn.com/larryosterman/archive/2007/03/12/fpo.aspx )。

我更喜歡調試未優化的代碼,但這並不總是可行的 - 一些問題只能用優化的代碼重新編寫,客戶崩潰轉儲來自已發布的版本,並且有時無法部署調試私有代碼。 通常在調試優化代碼時,我使用反匯編視圖 - dissasembly永遠不會說謊。

這一切都適用於windbg,因為我使用它進行所有本機代碼調試。 Visual Studio的調試器可能會更好地處理其中一些情況。

是。 它有時可能很嚴重,盡管這通常更多是內聯或重新排序代碼的結果。

局部變量也可能無法在監視窗口中准確顯示,因為它們可能僅存在於寄存器中,並且在切換堆棧幀時可能無法正確顯示。

優化會嚴重影響任何平台上的調試(不僅僅是VC的PDB文件)。

正是由於你提到的原因,函數內聯在某些情況下可能完全混淆哪些指令屬於哪個函數(因為有時它們屬於兩者)。

另外一個常見的優化是執行“臟”堆棧幀(GCC中的-fomit-frame-pointer),這會導致代碼無法跟蹤堆棧頂部。 這很好,它為其他操作釋放了額外的寄存器(x86上的ebp)。 但它幾乎不可能解開堆棧以查看實際發生的情況。 它也幾乎不可能在堆棧上找到局部變量和函數參數。

通常:不要期望從“發布”版本中獲取有用的調試信息。 如果調試很重要,即使在發布時也是如此,那么你應該“釋放”調試版本。

除了局部變量之外,'this'指針通常在優化的構建中進行優化。 這有時可以通過在調用堆棧中向上移動到對象指針或引用作為未優化的變量存在的點來解決。

一般來說。 優化構建中的單步執行通常或多或少地工作,並讓人們看到代碼所做的邏輯決策。 檢查這些決策所依據的數據通常要復雜得多。

暫無
暫無

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

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