我在vc2008中構建我的應用程序並在機器網絡上測試它。在非開發機器上運行vc2008調試版本
有什麼辦法,比安裝Visual Studio 2008,運行另一臺機器上C++程序的調試版本等? (即在沒有安裝VC2008)
安裝REDIST包只安裝釋放模式支持DLL對VC2008方案。目前它抱怨說「這個應用程序由於應用程序配置不正確而無法啓動,重新安裝應用程序可能會解決這個問題。」,我假設它是「我缺少DLL's」的代碼。
我在vc2008中構建我的應用程序並在機器網絡上測試它。在非開發機器上運行vc2008調試版本
有什麼辦法,比安裝Visual Studio 2008,運行另一臺機器上C++程序的調試版本等? (即在沒有安裝VC2008)
安裝REDIST包只安裝釋放模式支持DLL對VC2008方案。目前它抱怨說「這個應用程序由於應用程序配置不正確而無法啓動,重新安裝應用程序可能會解決這個問題。」,我假設它是「我缺少DLL's」的代碼。
你不能,因爲沒有爲調試運行時沒有安裝REDIST(事實上該軟件許可證禁止分發,所以你會打破EULA即使你沒有得到的東西放在一起)。但是,「調試版本」通常包含4個獨立的選項,其他3個不影響分發應用程序。
生成一個.pdb文件(cl/Zi和link/DEBUG),它允許符號調試。您可能想要添加/ OPT:ref鏈接器選項;鏈接器在不生成.pdb文件時會丟棄未引用的函數,但在/ DEBUG模式下,它將它們全部保留(因爲調試符號引用了它們),除非您明確地添加該文件。
我通常會對我的所有版本,甚至是生產版本都這樣做。只要您使用/ OPT重新打開鏈接器優化:ref它並不真正花費任何東西,並且如果您最終希望讀取崩潰轉儲,則可以使用這些符號。
使用C運行時庫的調試版本(可能MSVCR * D.dll,但是這取決於你所使用的運行時)。這可歸結爲/ MT或/ MTd(或者其他的東西,如果不使用dll運行時)。
這是一個意味着你不能再分配的東西了。它對一些libraty函數的性能,特別是內存分配的性能也有很大的影響。調試運行時版本非常注意通過值來「毒化」它們所接觸的內存,以使未初始化的數據錯誤清晰明瞭,釋放的版本通常會保留舊數據以節省觸摸它的時間。我相信在MSVCP * STL實現中,調試版本也會省略通常完成的所有分配池,因此泄漏檢查器可以準確地顯示您想要的塊,而不是它已經分配的大塊內存,但這意味着它會讓更多的malloc在它們之上的調用更慢。如果你有指針或迭代器處理錯誤,這可能會影響你得到什麼樣的錯誤行爲。
關閉編譯器優化(/ Od)。
這一個做很多事情(this question有一些關於這個問題的很好的討論),但基本上它傷害了表現。很多。不幸的是,如果您希望單步執行順利進行,則需要這樣做。
設置預處理器#defines DEBUG或NDEBUG。
這會以各種方式影響很多庫,但最值得注意的是它編譯或消除assert()和朋友。
所以你可能會考慮使用這些選擇的一些較小組合來構建一個構建。我使用了很多使用符號(/ Zi和link/DEBUG)和斷言(/ DDEBUG)的構建,但仍然進行了優化(/ O1或/ O2或任何您使用的標記),但保留了堆棧幀指針清除回溯(/ Oy-)並使用正常運行時庫(/ MT)。這接近我的發佈版本,並且是半可調試的(回溯很好,單步在源代碼級別上有點古怪;彙編級別當然工作正常)。你可以有任何你想要的配置;只需克隆你的發行版,並打開調試的任何部分看起來很有用。
應該影響試圖重新分配應用程序的只有一個是2
如果你想在另一臺機器上進行調試,你可能也有興趣在msvsmon。
閱讀this blog post您需要在哪些文件上運行應用程序的調試風格以及從哪裏獲取它們。但是,您無法正式將其重新分配給第三方。
如果您有應用程序的安裝程序,那麼還有一個合併模塊,您可以使用該模塊在沒有Visual Studio的計算機上部署調試運行時。當然,這僅用於測試目的。合併模塊位於C:\Program Files\Common Files\Merge Modules
。
當然,您始終可以將程序配置爲靜態鏈接到CRT中,而不是使用DLL。
這樣可以避免必須確保正確安裝調試DLL的麻煩(無論是在設置和無重新分配許可證方面)。
只需將「運行時庫」的代碼生成設置更改爲「多線程調試(/ MTd)」或在命令行上使用「/ MTd」選項即可。
除了當您使用MFC時需要動態鏈接CRT時... – avakar 2012-05-15 07:57:26
謝謝。即使微軟的博客信息對於VS 2008來說也是不完整和不準確的。 – 2013-04-11 12:37:30