2011-09-03 48 views
1

我目前在我的代碼中的任何地方都使用NSLog來測試它,除了使用標準NSLog之外,還有更好更專業的方法嗎?介意分享其他專業目標-C編碼器在調試時用於記錄日誌的情況嗎?日誌調試目標C代碼時使用哪些日誌記錄解決方案?

+0

呃,一個調試器?像[gdb](http://www.gnu.org/s/gdb/)? –

+0

我認爲他指的是更強大的日誌基礎設施。 Adit,你可能想改變標題,因爲我有相同的初始反應,但是然後閱讀你的最後一行。調試器是顯而易見的,但與NSLog亂碼代碼有問題。有些東西可以在不同的層次上打開和關閉,這是非常有用的。我可以執行某些操作並檢查日誌,但速度比您可以更快一些,但兩者都有明顯的用處。 – bryanmac

+0

對不起,我忘了把它的日誌關鍵字,謝謝指出, – adit

回答

3

這是我的日誌記錄類。它只是NSLog周圍的宏,但它允許你有可切換的級別。我從別人那裏借來修改過這些東西,但不記得在哪裏 - 我希望我能給道具。評論是一個很好的使用指南。希望能幫助到你。

/* 
* There are three levels of logging: debug, info and error, and each can be enabled independently 
* via the ENLOGGING_LEVEL_DEBUG, ENLOGGING_LEVEL_INFO, and ENLOGGING_LEVEL_ERROR switches below, respectively. 
* In addition, ALL logging can be enabled or disabled via the ENLOGGING_ENABLED switch below. 
* 
* To perform logging, use any of the following function calls in your code: 
* 
* ENDebug(fmt, …) – will print if ENLOGGING_LEVEL_DEBUG is set on. 
* ENInfo(fmt, …) – will print if ENLOGGING_LEVEL_INFO is set on. 
* ENHeading(fmt, …) – will print if ENLOGGING_LEVEL_INFO is set on. 
* ENError(fmt, …) – will print if ENLOGGING_LEVEL_ERROR is set on. 
* 
* Each logging entry can optionally automatically include class, method and line information by 
* enabling the ENLOGGING_INCLUDE_CODE_LOCATION switch. 
* 
* Logging functions are implemented here via macros, so disabling logging, either entirely, 
* or at a specific level, removes the corresponding log invocations from the compiled code, 
* thus completely eliminating both the memory and CPU overhead that the logging calls would add. 
*/ 

#define ENLOGGING_ENABLED 1 

// Set any or all of these switches to enable or disable logging at specific levels. 

#define ENLOGGING_LEVEL_DEBUG 1 
#define ENLOGGING_LEVEL_INFO 1 
#define ENLOGGING_LEVEL_ERROR 1 

// Set this switch to set whether or not to include class, method and line information in the log entries. 
#define ENLOGGING_INCLUDE_CODE_LOCATION 0 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
// 
// Implementation 
// 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
#if !(defined(ENLOGGING_ENABLED) && ENLOGGING_ENABLED) 
#undef ENLOGGING_LEVEL_DEBUG 
#undef ENLOGGING_LEVEL_INFO 
#undef ENLOGGING_LEVEL_ERROR 
#endif 

// Logging format 
#define ENLOG_FORMAT_NO_LOCATION(fmt, lvl, ...) NSLog((@"[%@] " fmt), lvl, ##__VA_ARGS__) 
#define ENLOG_FORMAT_WITH_LOCATION(fmt, lvl, ...) NSLog((@"%s [Line %d] [%@] " fmt), __PRETTY_FUNCTION__, __LINE__, lvl, ##__VA_ARGS__) 

#if defined(ENLOGGING_INCLUDE_CODE_LOCATION) && ENLOGGING_INCLUDE_CODE_LOCATION 
#define ENLOG_FORMAT(fmt, lvl, ...) ENLOG_FORMAT_WITH_LOCATION(fmt, lvl, ##__VA_ARGS__) 
#else 
#define ENLOG_FORMAT(fmt, lvl, ...) ENLOG_FORMAT_NO_LOCATION(fmt, lvl, ##__VA_ARGS__) 
#endif 

// Debug level logging 

#if defined(ENLOGGING_LEVEL_DEBUG) && ENLOGGING_LEVEL_DEBUG 
#define ENDebug(fmt, ...) ENLOG_FORMAT(fmt, @"debug", ##__VA_ARGS__) 
#else 
#define ENDebug(...) 
#endif 

// Info level logging 

#if defined(ENLOGGING_LEVEL_INFO) && ENLOGGING_LEVEL_INFO 
#define ENInfo(fmt, ...) ENLOG_FORMAT(fmt, @"info", ##__VA_ARGS__) 
#define ENHeading(fmt, ...) ENLOG_FORMAT(@"#################### " fmt " ####################", @"HD", ##__VA_ARGS__) 
#else 
#define ENInfo(...) 
#define ENHeading(...) 
#endif 

// Error level logging 

#if defined(ENLOGGING_LEVEL_ERROR) && ENLOGGING_LEVEL_ERROR 
#define ENError(fmt, ...) ENLOG_FORMAT(fmt, @"***ERROR***", ##__VA_ARGS__) 
#else 
#define ENError(...) 
#endif 

#if defined(ENLOGGING_LEVEL_ERROR) && ENLOGGING_LEVEL_ERROR 
#define ENResult(result, error) if (result == NO) ENError("%@", error) 
#else 
#define ENResult(...) 
#endif 
+0

看起來比#ifdef K_DEBUG更好! –

3

我正在使用標準工具在Xcode中進行調試,例如,通過向某些行添加斷點並在其停止時查看iVar的值。您還可以使用Instruments來測試性能和內存管理。

+0

這並不總是那麼好。特別是如果你經常執行代碼,即在遊戲中每幀運行一次的方法。有時將所需數據轉儲到控制檯會更方便。在每個NSLog周圍, – JustSid