簡體   English   中英

Visual Studio C ++ 2013調試器不穩定的步驟行為

[英]Visual Studio C++ 2013 Debugger Erratic Step Behavior

我正在使用Visual Studio C ++ 2013 Express Edition調試C ++應用程序,而我的調試器卻異常地跳過了程序某些區域中的代碼行。 這是一些背景信息。 和我觀察到的行為

  • 一切正常,直到我打電話給make_shared <MyClass>(...)
  • 然后,當調試器進入MyClass的構造函數(除了初始化列表除外)為MyClass時,每次我單擊“下一行”時,調試器都會開始向前跳轉幾行
  • 調試器在隨機行上登陸,在不同的成員函數之間跳過
  • 重要的是,調試器有時會在注釋行中停止
  • 我的代碼似乎可以正常運行,如果我等到上面提到的make_shared調用之后幾分鍾,我可以放置斷點並正常執行程序。 似乎構造函數是唯一不起作用的東西。 主要的煩惱是由於這種不穩定的行為,其他斷點也被擊中,因此,如果這是合理的話,我就不會輕易跳過它。

這是我嘗試解決的問題

  • 我嘗試清除我的bin文件夾,刪除.exe和.pdb文件以及其他文件
  • 我已經嘗試過完全重建項目,提出新的解決方案,將所有.h和.cpp文件復制到新項目中,然后重新構建並運行它。 一切似乎都可以正常工作,但是每當我在代碼中放置某個斷點時,我都會發現它被無緣無故地擊中,並且這種不穩定的行為開始了。

我會對任何針對這種情況的一般建議感興趣。 我已經在同一個項目上工作了很長時間,但從未遇到過這個問題。 當我完成一個全新的項目后,當它持續存在時,我感到非常驚訝,我想知道是什么原因造成的。

編輯:僅供參考,我的應用程序中根本沒有花哨的東西。 除了標准庫外,我沒有包含任何其他外部庫。 沒有多個線程或自定義構建設置。 相對於創建一個新的,空的,原始的Visual Studio項目時的默認設置,一切都非常標准。

該問題也可能是由混合的行尾引起的。 在這里看看。 切勿在源文件中混合不同的行尾(Linux樣式:LF'\\ n',Mac OS最高版本9:CR'\\ r',Windows:CRLF'\\ r \\ n')。 將代碼從其他位置復制/粘貼到源文件時,請務必小心。

轉到Visual Studio中的“高級保存選項”,然后選擇行尾並保存文件。

您的信息聽起來像2問題之一:源列表和調試信息或優化副作用之間的同步問題。

我假設這不是同步問題,因為您刪除了所有臨時文件並重新啟動。

編譯器可能已執行了一些嚴重的優化,導致可執行文件與清單不匹配。

這里有些例子。

刪除空函數編譯器和鏈接器開發人員最喜歡的是刪除不包含任何內容或不使用的函數。 這對符號調試器造成了嚴重破壞,因為源代碼表示該函數存在,但是編譯器/鏈接器已將其刪除。

編譯器創建通用代碼
編譯器可能已將函數之間的通用代碼分解為因子。 包含常用指令的新功能通常放在模塊的末尾。 這使調試器感到困惑,因為沒有與新代碼匹配的行號,或者有多個引用新代碼的行號。

編譯器重寫您的代碼
我曾經發生過這種情況。 匯編語言列表未顯示源代碼的匯編代碼,因為編譯器決定重寫該代碼。 一個很好的例子是內聯。 我有一個5次迭代的簡單循環,編譯器用5個循環內容的副本替換了for循環。 與源代碼清單不匹配,因此調試器感到困惑。

組裝清單中的真相
事實在匯編清單中。 如果發布函數的匯編語言或匯編語言和C ++語言的交織列表,我們可以為您提供調試器跳轉原因的更多詳細信息。

暫無
暫無

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

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