簡體   English   中英

什么是調試優化的C / C ++程序的有效方法?

[英]What are efficient ways to debug an optimized C/C++ program?

很多時候我使用優化代碼(有時甚至涉及矢量化循環),其中包含錯誤等。 如何調試這樣的代碼? 我正在尋找任何類型的工具或技術。 我使用以下(可能是過時的)工具,所以我想升級。

我使用以下內容:

  • 既然用ddd,就看不到代碼了,我用gdb + dissambler命令查看生成的代碼; 我不能真正使用它來完成程序。
  • ndisasm

謝謝

調試優化程序總是比較困難,但總有辦法。 一些額外的提示:

  • 進行調試構建,看看你是否在調試版本中遇到了同樣的錯誤。 如果您不需要,則無需調試優化版本。
  • 如果在支持它的平台上使用valgrind。 您看到的錯誤可能更難理解,但提前解決問題通常會簡化調試。
  • printf調試是原始的,但有時如果你有一個只出現在優化版本中的復雜問題,它是最簡單的方法。
  • 如果您懷疑計時問題(特別是在多線程程序中),請滾動您自己的斷言版本,如果違反條件則中止或打印,並在幾個選定的位置使用它,以排除可能的問題。
  • 看看你是否可以在不使用-fomit-frame-pointers的情況下重現問題,因為這會使代碼很難調試,並且啟用-O2或-O3。 這可能會為您提供足夠的信息來查找問題的原因。
  • 隔離代碼的一部分,構建測試套件,看看是否可以識別出任何失敗的測試用例。 調試一個函數要比整個程序容易得多。
  • 嘗試使用-fno-X選項逐個關閉優化。 這可能有助於您找到嚴格的別名問題等常見問題。
  • 打開更多編譯器警告。 有些事情,比如嚴格的別名問題,如果它們在不同的優化級別之間產生行為差異,就會產生編譯器警告。

調試發布版本時,你可以放入__asm nops; 作為斷點的占位符(int 3)。 這很好,因為您可以保證斷點位置而不會弄亂編譯器優化或編寫printf / cout語句。

當然,調試非優化版本總是更容易。 如果做不到這一點,反匯編代碼會很有幫助。 我使用的其他技術包括通過強制打印或記錄中間結果,或者將關鍵變量更改為“volatile”來部分去優化代碼,這樣我至少可以在調試器中查看值。

機會就是你所謂的優化代碼被削減到剃須周期(這使調試變得困難),但實際上並沒有非常優化。 這是我的意思的一個例子。

我會關閉編譯器優化,自己調試和調整,然后如果代碼中有熱點實際上是編譯器看到的代碼(不在外部庫中),則重新啟用編譯器優化。 (我將熱點定義為經常找到PC的代碼的一部分。這會自動豁免包含函數調用的循環,因為它們會偷走PC。)

暫無
暫無

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

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