2011-06-15 124 views
25

我很想將調試信息包含在發佈給客戶的發佈版本中。據我所見,唯一不利的方面是二進制文件大小增加25%。優點是我可以立即獲得可用的故障轉儲,更容易分析。 我願意接受25%的增長。我還有其他缺點嗎?Visual Studio:在發佈版本中調試信息

這是一個C項目和所有我想要做的就是鏈接/調試/生成調試信息

回答

35

可執行文件的大小應該增加遠遠少於25%。

我其實有點驚訝,它增加了很多,但一些快速測試表明,至少有一個大型示例項目(ScummVM)將.exe從10,205,184字節增加到10,996,224字節,只需將/DEBUG選項添加到鏈接步驟(大約增加8%)。 /DEBUG是使用IDE中的"Linker | Debugging | Generate Debug Info"選項指定的。請注意,此設置應該對編譯器生成的優化沒有影響。

我知道指向.pdb文件的指針放在可執行文件中,但沒有太多。我嘗試了一下,發現啓用/OPT:NOREF鏈接器選項將大小差異更改爲10,205,184與10,205,696。所以非/DEBUG構建保持相同的大小,但/DEBUG構建下降到只有512個字節更大(這可以由指針指向.pdb - 可能鏈接器輪到512的幾倍)。遠遠低於1%的增長。顯然,加入/DEBUG會導致鏈接器保留未引用的對象,除非您還指定/OPT:NOREF。 (IDE中的"Linker | Optimization | References"選項)。

程序運行正常,沒有.pdb文件 - 如果您想在客戶站點提供更好的調試體驗,您可以選擇將其發送給客戶。如果您只想獲得體面的堆棧跟蹤,則不需要在客戶機器上具有.pdb文件 - 它們(或您提供的某些工具/功能)可以發送轉儲文件,該文件可以加載到調試器在您的站點提供.pdb文件並獲取相同的堆棧跟蹤信息port-mortem。

當然要注意的一件事是,您需要將.pdb文件與您的發行版一起歸檔。 「用於Windows的調試工具」包(現在分發在Windows SDK中)提供了一個符號服務器工具,因此您可以將.pdbs歸檔並輕鬆檢索它們以進行調試。

我可以考慮分發.pdb文件的唯一缺點是它可以使您的應用程序更容易逆向工程,如果這是您的擔憂。請注意,Microsoft爲Windows分發符號(使用公共符號服務器 - 以及某些特定版本的完整符號集的包)。但是,他們分發的符號會通過消毒步驟進行,消除他們認爲敏感的某些項目。您可以使用鏈接器的/PDBSTRIPPED選項(IDE中的"Linker | Debugging | Strip Private Symbols")執行相同的操作(或類似操作)。有關選項刪除的詳細信息,請參閱the MSDN docs。如果您要分發符號,則可能適合使用該選項。

+0

顯然,SCUMVM有很少的未引用代碼:)在啓用剝離未引用符號後,可執行文件大小恢復正常。非常感謝你! – 2011-06-16 01:15:43

+0

感謝您指出鏈接器參考 – Gob00st 2012-12-15 17:08:01

-7

我總是發出調試版本,從未發佈版本。我想不出有什麼不利之處,其優點就像你提到的那樣。

+4

優化是有益的事情 – SLaks 2011-06-15 20:40:25

+2

@SLAks是啊,同意。我沒有進行調試構建,而是使用調試信息進行版本構建......我的理解是,它仍然具有所有優化,只包括一些調試符號。那麼,這就是我想要解決這個問題。 – 2011-06-15 20:41:42

+0

想象一下,一個汽車經銷商說:「我總是賣實驗室原型,而不是真正的汽車從廠裏出來」......哦,你可能不允許向客戶分發調試運行時間(IANAL,但看看許可證你的編譯器)。 – Tibo 2013-09-09 08:27:13

1

你沒有提到你在用什麼語言,C++和C#可能有不同的答案。

我不是100%確定你正在考慮做什麼改變。你打算告訴Visual Studio進行標準的Debug編譯,併發布它,還是要在Release編輯中編輯幾個設置?在發佈版本中仔細修改一些設置可以讓我成爲最好的方法。無論結果如何,我都會確保開啓優化功能,因爲這可以使編譯代碼的性能發生顯着變化。

+0

我已經用請求的說明更新了這個問題。 – 2011-06-15 21:06:45

+0

但其他問題是...我如何確保優化仍在?我的意思是,它們已啓用,但如果「生成調試信息」會覆蓋設置並禁用它們,該怎麼辦? – 2011-06-15 21:07:42

+0

如果您使用的是C單元,則此設置位於Configuration Properties :: C/C++ :: Optimization下的項目的Property Pages中。我相信這些默認值是針對調試版本的優化禁用(/ Od),以及用於版本構建的最大化速度(/ O2)。 – 2011-06-15 21:15:28