2011-10-17 78 views
3

我的應用程序需要釋放一個非常大的散列表,它在調試模式下非常慢,非常慢,我不能實際地使用它...但在釋放模式下,我有沒有調試符號.. 我需要調試的可執行文件,並明白我應該能夠得到它與發行版的crt庫鏈接。 我已經通過改變我的「代碼生成」選項來使用「多線程DLL」而不是「多線程調試DLL」,但是當我在我的哈希表免費例程中放置一個斷點,然後通過實際的免費調用,在調試DLL中使用一個函數。如何停止使用免調試的視覺工作室

其他我可以試試嗎?使用發佈配置是否更好的選擇,並試着讓它爲我實際需要調試的東西生成符號?

(VS 2010的BTW)

回答

1

儘管使用了發佈CRT並開啓了所有優化,但您仍可以擁有調試符號。事實上,這是Visual C++在發佈配置中的默認設置(請參閱項目屬性/配置屬性/ C/C++ /常規/調試信息格式;以及鏈接器/調試/生成調試信息)。請注意,優化的代碼可能難以調試 - 指令順序可以改變和一些碎片可能被優化,走完全,逐步執行代碼時導致一些意外的行爲。

順便提一下,要關閉調試CRT,只是將「多線程調試DLL(/ MDd)」更改爲「多線程DLL(/ MD)」是不夠的,您還需要刪除_DEBUG來自預處理器定義。也就是說,你所遇到的緩慢可能不是你的程序的結果 - 這可能是一個調試器工件(即爲了在調試器UI中顯示它們而讀取大數據結構的緩慢)。請嘗試運行您的程序(調試或釋放結構 - 它沒有多大意義)外面調試,看看這個有差別。

如果是這樣,你不能讓你的哈希表只用於調試的目的時,你就必須要麼訴諸的「printf調試」(即手動插入診斷)或可能嘗試遠程調試。

+0

標準可悲的是後者是真實的;即使調試器外部的調試版本也很好。我可能就附着在可執行一次哈希表被釋放。 – mike

1

在stdafx.h中開始加入這個或將它定義爲您的調試版本預處理器宏:

#define _SECURE_SCL 0 

這將導致以下情況發生,使您的代碼在調試模式下運行得更快:

所有標準迭代器都未選中(迭代器可以超出容器邊界,導致未定義的行爲)。 將使用未經檢查的函數形式,用於具有已檢查表單的標準函數(請參見下面的列表)。

如果輸出迭代器是一個迭代器檢查:對調用標準功能(標準::複製,例如)

  • 您將得到檢查的行爲。
  • 您將在對調用函數的調用(例如stdext :: checked_copy)中檢查行爲。
  • 您將在未經檢查的函數(例如,stdext :: unchecked_copy)調用時檢查行爲。

如果輸出迭代器是一個迭代器選中:

  • 您將獲得調用標準功能未檢查的行爲(標準::複製,例如)。
  • 調用一個選中的函數(例如stdext :: checked_copy)會導致編譯器警告。
  • 您將對未經檢查的函數(例如,stdext :: unchecked_copy)進行未經檢查的行爲。

你可以閱讀更多有關此問題在MSDN的Checked Iterators部分。通常情況下,您希望爲Debug版本啓用檢查迭代器,但是某些應用程序會在很短的時間內執行大量操作,從而造成麻煩。

+0

感謝,但我不認爲這也適用於我的哈希免費這是循環 – mike