簡體   English   中英

Visual Studio應用程序在調試時運行速度極慢

[英]Visual Studio application running extremely slow with debug

我有一個本機C ++程序,它在啟動DebugF5 )時運行速度慢了20多倍,但在使用start而不調試時運行正常( Ctrl + F5 )。

無論我是使用調試還是發布版本都沒關系。 此外,如果我使用WinDbg,程序的速度會慢一些。

是否有一些設置我選擇了錯誤或什么?

將_NO_DEBUG_HEAP環境變量設置為1(如http://preshing.com/20110717/the-windows-heap-is-slow-when-launched-from-the-debugger所示 )。

這也可以在Visual Studio內部完成。

現在這只是一個解決方法,我很想知道如何重構一個遭受這類問題的程序。 你有很多std :: map's,shared_ptr或任何其他大的間接嗎?

這當然不是由於在調試配置中定義了_DEBUG符號或編譯代碼引起的。 無論調試器是否附加到程序,都會運行添加的調試代碼。

調試器通常不會影響代碼執行,它通過調用WaitForDebugEvent來保持不變。 阻止它,直到操作系統告訴它發生了一些值得注意的事情。 這可能會在調試器中觸發一堆代碼,從而降低程序速度。 您可以看到DEBUG_EVENT結構文檔中列出的事件。

在文檔之外注釋它們:調試器介入並在以下情況下減慢程序速度:

  • 程序加載或卸載DLL。 在加載過程中會發生很多事情,調試器會尋找調試符號文件(.pdb)。 它可能會聯系符號服務器下載它。 DLL源代碼中設置的任何斷點都將被激活。 這可能非常慢,但效果是暫時的,通常只會減慢啟動速度。 您可以在“輸出”窗口中看到加載/卸載通知。

  • 該計划提出了一個例外。 這會在引發異常時激活調試器,即“第一次機會通知”。 這可能非常有用,您可以使用Debug + Exception,Thrown復選框使調試器在引發異常時停止。 您可以在“輸出”窗口中看到通知消息。 確實會減慢代碼,這會極大地提升和捕獲異常,很可能是您減速的源頭。 切勿使用異常進行流量控制。

  • 線程開始運行或終止。 同樣,通知消息將打印到“輸出”窗口。 你必須創建很多線程才能使你的程序變慢。

  • 當您的程序使用OutputDebugString()進行跟蹤時。 在“輸出”窗口中可見。 如果沒有附加調試器,那么減速的另一個好選擇是輸出落在位桶中。 你應該沒有任何問題將其診斷為原因,明顯的副作用是在“輸出”窗口中看到很多消息。

  • 當程序遇到斷點時。 沒有太多理由被那個難倒。 但是你可以設置斷點來減慢程序的速度但不會導致調試器中斷。 特別是條件斷點,命中計數器,過濾器和命中時操作都會很慢。 使用Debug + Windows + Breakpoints查看定義的斷點。

如果在IDE外部運行調試版本,則有幾個不同的東西。 一個是IDE需要一段時間來加載符號,如果你依賴很多庫,那么啟動時間可能很大。

如果您使用的是符號服務器(包括Microsoft公共符號服務器),那么這可能會增加啟動時間,因此如果是這種情況,請確保在_NT_SYMBOL_PATH變量中有本地符號緩存。

此外,IDE在啟用調試堆的情況下運行,但如果您在IDE外部運行,我認為不會發生這種情況。

在調試器下創建進程時,默認情況下操作系統使用調試堆。 調試堆會對內存進行更多驗證,尤其是在解除分配時。

有幾種可能的選項可以禁用Debug Heap:

  1. 啟動后不久將附加到該過程。 這將使您能夠有意識地加速調試模式下的性能,並充分了解您運行的模式。

  2. 添加環境變量設置_NO_DEBUG_HEAP = 1。
    這可以為機器或Visual Studio的特定實例全局設置。

    一個。 在全局范圍內,您可以通過控制面板→系統→高級系統設置→環境變量設置環境變量,然后添加變量_NO_DEBUG_HEAP = 1。
    注意:這將對您調試的每個應用程序產生影響。

    對於Visual Studio的實例,您可以打開命令提示符,設置環境變量_NO_DEBUG_HEAP = 1,然后從該命令提示符中打開visual studio。 這將僅影響從該Visual Studio實例創建的進程將繼承環境變量。

  3. 附加調試器的行為 ,這對於VS2015是可能的。 有兩種方法可以覆蓋它:

    一個。 要修改特定項目,請轉到項目屬性Configuration Properties→Debugging並將Environment屬性_NO_DEBUG_HEAP更改為1

    要修改Visual Studio中的每個項目,請轉到工具→選項→調試,然后選中選項:“啟用Windows調試堆分配器(僅限本機)”。
    注意:如果'a'中提到的_NO_DEBUG_HEAP環境變量在項目級別設置,它將覆蓋此全局設置。

對我來說,調試模式和發布模式之間的性能差異大約是40倍。 經過一些挖掘,看起來有幾個因素導致性能上的差異,但有一個編譯器選項幾乎可以免費使我的調試性能翻兩番

即,將/ZI改為/Zi 有關說明,請參閱MSDN頁面

我還是不使用編輯和繼續功能。

沒人提到關閉未使用的源窗口。

關閉20多個未使用的窗口后,調試源步進從~5s回到〜.2s。 這個異常緩慢的項目動態加載DLL,並且DLL也是正在逐步執行的(並且源窗口打開),因此它似乎可能相關。 然而,這是C#(標題和標簽是非特定的)。

調試Visual C ++會帶來大量的開銷,特別是在STL中。 嘗試不定義_DEBUG ,並定義NDEBUG

暫無
暫無

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

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