簡體   English   中英

單獨的“調試”和“發布”版本?

[英]Separate 'debug' and 'release' builds?

我認為最好發布開發人員實際測試過的軟件版本。 因此,我傾向於從項目/ makefile中刪除“調試”目標,因此只能構建(測試,調試和發布)一個版本。

由於類似的原因,我不使用“斷言”(另請參見斷言是否總是不好? ...)。

那里的一個人認為,“調試”版本的原因是調試起來更容易:但是,我反駁說,您最終可能希望支持和​​調試所發布的內容,因此您需要構建一個發布版本,您可以在必要時進行調試...這可能意味着啟用調試符號並禁用某些優化,即使在“發行版”版本中也是如此。

有人說“這真是個壞主意”。 這是我幾年前制定的政策,但遭到了以下方面的追捧:

  • 一些開發人員正在測試其調試版本,但沒有發布版本
  • 一些開發人員的寫作錯誤,僅在發行版中顯示
  • 該公司在測試不足后發布了發行版本( 是否完全足夠?)
  • 被調用以調試發行版

從那時起,我已經看到其他多家開發商店都遵循這種做法(即沒有單獨的調試和發布版本)。

你有什么政策?

擁有單獨的調試和發行版本是一個好主意,因為它確實使開發更容易。

但是調試版本應該僅用於開發,而不是用於測試。 您僅測試發布版本。 而且您不使用開發人員來測試那些構建,而是使用測試人員。

這是一項簡單的政策,兼顧了兩者的優點。

編輯:針對評論,我認為很明顯,調試和發布版本(可以)生成不同的代碼。 考慮“ -DDEBUG”與“ -DNDEBUG”以及“ #if defined(DEBUG)”等。

因此,測試最終交付的代碼至關重要。 如果您確實在調試和發行版本中生成了不同的代碼,則意味着要進行兩次測試-不管是否由同一個人測試過。

但是,調試符號並不是一個大問題。 始終使用調試符號進行構建,保留未剝離的二進制文件的副本,但釋放剝離的二進制文件。 只要您以某種方式用構建號標記每個二進制文件,您就應該始終能夠確定哪個未剝離的二進制文件與您必須調試的剝離的二進制文件相對應。

如何從外部源中剝離二進制文件並在調試器中加載符號取決於平台。

這可能很小,但這加起來了其他人在這里所說的話。 建立QA測試版本的優點之一是,隨着時間的推移,軟件開發人員的內置調試和日志記錄功能將隨着開發人員的需求而發展,這些開發人員需要弄清楚為什么QA中出現問題。

開發人員越需要調試發布版本,則當客戶開始遇到問題時,您將擁有更好的工具。 當然,作為開發周期的一部分,開發人員沒有理由進行發行版本的工作。

另外,我不知道有哪個軟件公司具有足夠長的周期來承擔將QA從調試切換到發布的開銷,而該公司在版本的測試期中途才完成。 必須執行完整的質量檢查周期通常很少發生。

我們的政策是讓開發人員從事Debug構建,但其他所有人(質量保證,BA,銷售等)都運行發行版。 昨天我不得不修復一個僅出現在發行版中的錯誤,構建該程序是顯而易見的,因為它只出現在發行版中

這是這家商店的第一個,我來這里已有18個月左右。

令人毛骨悚然的地方是Release版本與調試版本做不同的事情-是的,我去過地獄,並在一些非常古老,非常笨拙的生產代碼中看到了這一點。

如果配置之間的唯一區別是調試符號和優化,我認為沒有理由不同時擁有兩者。

因此,您需要構建一個發行版,必要時可以進行調試...這可能意味着即使在“發行版”構建中,也要啟用調試符號並禁用某些優化。

嗯...聽起來您正在對我進行調試...對吧?

您出錯的部分是以下語句:

我認為最好發布開發人員實際測試過的軟件版本

開發人員不測試代碼。 測試測試代碼。

您的單元測試應該測試所有構建配置。 不要讓開發人員只用一只手綁在背后,而是讓他們使用那里可用的所有調試工具。 調試版本就是其中之一。

關於斷言:斷言的使用很大程度上取決於您是否按合同進行編程。 如果這樣做,則斷言僅在調試版本中檢查合同。

根據我在鏈接線程中的回答,出於非常相似的原因,我們還使用相同的構建進行調試和發布。 與算法級別的手動優化相比,從優化器獲得的10%-20%的性能提升往往很小。 單個版本可以消除許多潛在的錯誤。 特別;

  • 未初始化的變量和較小的緩沖區溢出可能最終導致調試和優化發行版的結果截然不同。

  • 即使有可用的符號信息,由於對象與源不匹配,調試優化發行版也可能很困難,例如,變量可能已被優化,代碼可能已重新排列。 因此,在經過測試的發行版中報告的錯誤可能更難追蹤,因此非常耗時。

在自動回歸測試下比較了未優化和優化的構建之后,在我的案例中,優化提供的性能提升沒有提供足夠的額外價值來擁有兩個構建。 可能值得注意的是,我開發的軟件非常占用CPU(例如,創建和處理大型曲面模型)。

使用Java開發時,我討厭非調試版本。 引發異常時,您不會獲得任何行信息,這使得很難甚至根本無法跟蹤錯誤。 而且,在Java 5或更高版本中,調試和非調試之間的運行時差異約為5%,因此這實際上沒有問題,對於當今的硬盤,大小不再重要。

使用調試版本的好處是:

  • 堆棧跟蹤包含您需要的所有信息
  • 可以檢查變量
  • 如果您在生產中遇到問題,則可以簡單地附加到正在運行的進程,而不必先停止服務器來安裝調試版本。
  • 您不會被聰明的優化錯誤所困擾
  • 構建更簡單(僅一個工件)

開發人員使用調試版本,QA進行工作,其他所有人都使用發行版,我們將其稱為“生產”。 這樣做的主要優點是,在調試版本中,我們可以添加許多額外的代碼和斷言。 有些對象包含多余的信息,除非在調試器中查看代碼,否則這些信息無用。 一些對象會定期驗證自己,以確保所有狀態信息都是一致的。 這些事情使調試版本變慢了很多,但它們幫助我們找到了在生產環境中無法發現的所有錯誤。

就像我說的,我們所有的質量保證和性能測試都使用生產版本,並且偶爾會遇到在生產中出現但在調試中沒有出現的問題。 但是它們相對較少,並且作為開發人員,調試調試版本而不是生產版本的優勢遠遠超過了這個問題。

我認為這取決於項目規模以及所使用的構建系統和測試的類型。

如果您擁有一個自動構建系統,並且在給定構建上運行單元和功能測試很簡單,那么對於多種構建類型,您永遠都不會有任何問題。

出於您在問題中列出的所有原因,我一直訂閱“運送您要調試的東西,以便您可以調試所運送的東西”的方法。

我認為該討論缺少非常重要的一點:

這實際上取決於它是哪種項目!

如果您創建本機(C / C ++)項目,則實際上將被迫創建調試版本,這僅僅是因為編譯器優化可能使調試在某些情況下幾乎變得不可能。

如果創建Web應用程序,您可能希望僅擁有一個可以在運行時啟用日志記錄功能的構建(盡管“ build”對於某些Web應用程序具有誤導性)。

盡管本機C ++項目和PHP Web應用程序顯然不是存在的所有項目,但我希望我能理解我的觀點。

PS:在為C#開發時,您會遇到麻煩,因為盡管使用調試版本會禁用編譯器優化,但根據我的經驗,您不會遇到與C ++差不多的差異

在這里,我們以調試模式進行開發,並以發布模式進行所有單元測試。 我們是一家小商店,只有幾個(不到12個)應用程序,可以支持Classic ASP,ASP.Net,VB.Net和C#。 我們還有專職人員來處理所有測試,將調試后的問題交還給開發人員。

我們總是建立兩者,甚至從未考慮過不這樣做。 啟用調試選項會增加代碼大小並降低性能,這可能不是測試時軟件類型的問題,但是如果客戶正在運行您的代碼以及其他5個應用程序該怎么辦...

可以使用自動化測試來解決測試問題,以便在您准備發布時可以輕松地測試發布版本。 開發人員或公司未能正確測試發布版本的失敗並不是發布和調試版本的思想失敗,而是開發人員和/或公司的失敗。

關於您的最后一點,我從未被要求調試發布版本,只是為了修復它...

這是一個權衡。 鑒於CPU周期便宜並且越來越便宜,而人工周期卻很昂貴,因此僅維護大型復雜程序的單個版本(調試(山牆)版本)在很大程度上是有意義的。

始終使用斷言總是比不使用斷言更安全的策略。 如果生成單獨的調試和發行版本,請重新啟用所需的任何#define d符號,以確保在發行版本中也啟用了斷言。

我認為折衷很簡單:是的,只有發行版本,您才能真正測試實際交付的產品。 另一方面,您確實要為開發人員的調試和/或用戶的性能降低付出代價,因此您需要檢查這兩種情況。

在大多數中型到大型項目中,易於調試將最終確保為用戶提供更好的產品。

看到這里您最有爭議的編程觀點是什么?

引用:

意見:“調試”和“發布”版本之間永遠不會有不同的代碼

主要原因是發布代碼幾乎從未經過測試。 最好在野外運行相同的代碼以進行測試。

通過刪除“調試目標”,您將迫使開發人員在軟件的發行版本上進行調試。 實際上,這可能意味着兩件事:

1)“發布版本”將禁用優化功能(否則,開發人員無法使用調試器)

2)沒有任何構建將具有特殊的PREPROCESSOR宏來更改其執行。

因此,您真正要做的是合並發行和調試配置,而不是僅消除“調試”模式。

我個人是通過iOS開發完成此操作的,沒有任何不良影響。 在我們編寫的代碼中花費的時間少於實際發生的時間的1%,因此優化並不是重要的貢獻者。 在這種情況下,它們確實確實導致了bug的增加,但是即使不是,它們也是如此,以一種方法進行測試,然后使用不同的代碼進行質量檢查的想法,僅引入了一個考慮問題的因素。

另一方面,在某些情況下,優化是必要的,它們是有用的,甚至有足夠的時間來測試這兩者。 通常,調試和發布之間的更改很小,以至於根本不會引起任何問題。

如果您有一個真正的QA小組可以指望它進行全面的測試,那么我會說制作調試版本,直到您接近發行版為止,然后確保在相同的版本上完成完整的QA周期。走出去。

盡管在至少一種情況下,我們發布了仍然包含一些調試代碼的東西。 唯一的結果是運行速度稍慢並且日志文件非常大。

在我的公司中,我們同時具有Debug和Release。 -開發人員使用調試版本正確查找和修復錯誤。 -我們正在使用TDD,因此我們在服務器上運行了一個大型測試套件,用於測試調試和發布版本配置以及我們擁有的64/32版本。

因此,如果使用“調試”配置有助於開發人員更快地發現錯誤,則沒有理由不使用它-當代碼進入服務器(待進一步測試)或檢查代碼時,我們將使用“發布”。

很久以前,我學會了使用.PDB文件構建發行版本,以便可以調試發行版本。 許多程序員往往會忘記的是,當您運行調試版本時,如果關閉了所有優化功能,則您將完全調試另一個程序。 它的行為可能與發行版本相似(大部分情況下),但它仍然是與發行版本不同的程序。

此外,調試發布版本並不困難。 而且,如果您有故障轉儲,則無論如何都必須能夠做到。

暫無
暫無

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

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