2008-10-16 42 views
5

在處理某些代碼時,我添加了某種類型的額外調試日誌記錄,以便更輕鬆地跟蹤我關心此特定修補程序的狀態和值。如何保持你自己的調試行而不檢查它們?

但是,如果我將這個檢查到源代碼庫中,我的同事們會因爲污染Log輸出和污染代碼而生氣。

那麼我如何在本地保留這些對我來說很重要的代碼行,而不必檢查它們呢?

澄清: 許多答案都與日誌輸出相關,並且您使用日誌級別可以將其過濾掉。我同意這一點。

但是。我還提到了污染實際代碼的問題。如果有人在每一行代碼之間放置一條日誌語句,則始終打印所有變量的值。它確實使代碼難以閱讀。所以我也很想避免這種情況。基本上不檢查日誌代碼。所以問題是:如何保留自己的特殊用途日誌行。因此,您可以將它們用於調試版本,而不會混淆簽入的代碼。

+0

這將有助於瞭解您使用的是什麼源代碼控制系統。 – 2008-10-17 22:04:44

回答

4

如果您遇到問題的唯一調試代碼的目標是跟蹤某些變量的值,我認爲您真正需要的是調試器。使用調試器,您可以隨時觀察任何變量的狀態。

如果您不能使用調試器,那麼您可以添加一些代碼來在某些調試輸出中打印值。但是,這個代碼應該只有幾行,其目標必須是使您正在執行的修復更容易。一旦它被提交到trunk,它就被修復了,然後你不需要更多的調試行,所以你必須刪除它們。不刪除所有的調試代碼,很好的調試代碼非常有用,只刪除你的「個人」跟蹤調試代碼。

如果修復很長,所以要保存你的進步commiting到存儲庫,那麼你需要的是一個分支,在這個分支,你可以添加這麼多的調試代碼,只要你想,但無論如何,你應該在樹幹中合併時將其刪除。

1

您使用的是什麼源碼控制系統? Git允許你保留本地分支機構。如果情況變得更糟,您可以在存儲庫中創建自己的'Andreas'分支,但分支管理可能會變得非常痛苦。

3

但是,如果我會檢查這個在進入 源代碼庫,我的同事們 會生氣的我對污染 日誌輸出和污染的代碼。

我希望你的Log框架有一個日誌級別的概念,以便你的調試很容易被關閉。就我個人而言,我不明白爲什麼人們會在更多的調試日誌中生氣 - 因爲他們可以關閉它!

2

爲什麼不將它們包裝在預處理器指令中(假設構造以您選擇的語言存在)?

#if DEBUG 
    logger.debug("stuff I care about"); 
#endif 

此外,您可以使用跟蹤或調試等日誌級別,該級別不應在生產中打開。

if(logger.isTraceEnabled()) { 
    logger.log("My expensive logging operation"); 
} 

這樣,如果事情在這方面做作物的一天,你可以把在該水平重新登錄,實際上得到一些(希望)有幫助的反饋。


請注意,這兩種解決方案仍然可以檢查日誌記錄,但我沒有看到有充分理由 而不是將它們簽入。我正在提供解決方案以使其不在生產日誌中。

+0

我相信這會將代碼保留在編譯後的代碼之外,但它仍然存在於簽入源代碼控制庫的代碼中。 – DOK 2008-10-16 15:58:24

+0

它會在檢入到存儲庫的代碼中,但它會使日誌指令完全脫離生產版本。 – 2008-10-16 16:15:17

1

類似

#if DEBUG #endif.... 

但是,這仍然意味着任何人與「調試」配置下運行會打擊那些線。

如果你真的希望他們跳過,那麼使用其他人不用的日誌級別,或....

創建一個名爲MYDEBUGCONFIG 不同的運行配置,然後把你的調試代碼塊之間是這樣的:

#if MYDEBUGCONFIG 
...your debugging code 
#endif; 
2

如果這確實是一個長期存在的問題,我想我會認爲中央存儲庫主版本,我最終將使用補丁文件來包含正式版本(我工作的最後一個版本)和我的版本與調試代碼之間的差異。然後,當我需要恢復我的調試時,我會查看正式版本,應用我的補丁(使用patch命令),修復問題,並在登記之前,用​​3210(反向修補程序)刪除修補程序。

但是,應該沒有必要這樣做。您應該能夠就保留官方代碼行中的信息的方法達成一致,並使用一些機制來控制所產生的調試量。無論您的語言是否具有C或C++所做的條件編譯,都應該可以使用C預處理器。

0

恕我直言,你應該避免#if解決方案。這是執行條件調試例程的C/C++方式。而是將所有日誌記錄/調試功能歸入ConditionalAttribute。該屬性的構造函數接受一個字符串。只有在定義了與屬性字符串同名的特定預處理器定義時纔會調用此方法。這與#if /#endif解決方案具有完全相同的運行時影響,但它在代碼中看起來好多了。

1

如果你真的正在做的事情,如:

把日誌聲明 代碼每隔線之間,以 打印所有變量都 時間的價值。它確實使代碼 難以閱讀。

這就是問題所在。請考慮使用測試框架,並在其中寫入調試代碼。另一方面,如果你只寫了一些調試行,那麼你可以設法避免這些行(例如,在提交之前使用編輯器去除相關行並在完成之後撤銷更改) - 但是當然它是非常罕見的!

2

我知道我會得到這個消極的票...
但是,如果我是你,我只是建立自己的工具。

它會帶你一個週末,是的,但你會保持你的編碼風格,你的存儲庫乾淨,每個人都會很高興。

不確定您使用的是什麼源代碼管理。在我的情況下,您可以輕鬆地獲取「待檢入」事物的列表。您可以通過API觸發提交。

如果我有同樣的需求,我會提交一個程序來提交,而不是使用源代碼管理GUI中的內置命令。你的程序將通過待處理事件列表,獲取所有你添加/更改的文件,製作它們的副本,刪除所有日誌行,提交,然後用你的版本替換它們。

根據您的日誌行的樣子,您可能需要在它們的最後添加特殊註釋,以便程序識別它們。

再一次,不應該花費太多的工作,並且稍後使用並不是很痛苦。
我不指望你會發現這樣做,你已經完成了(和你的源代碼控制),這是非常具體的,我想。

0

接下來的這個建議是瘋狂不這樣做,但你能...

有這樣的議論

// ##LOG-START## 
logger.print("OOh A log statment"); 
// ##END-LOG## 

環繞您的​​個人日誌代碼,並在提交之前,你的代碼運行shell腳本去掉你的日誌。

我真的不會推薦這個,因爲這是一個垃圾的想法,但永遠不會阻止任何人。

替代你也可以不每個日誌行的末尾添加註釋,有一個腳本,刪除它們......

logger.print("My Innane log message"); //##LOG 

我個人認爲,使用適當的日誌框架與調試日誌記錄級別等應該足夠好。在提交代碼之前刪除任何多餘的日誌。

相關問題