Robのコメント、「ios5プログラミング:限界を押し上げる」のアイデア、およびLumberjackフレームワークを使用して、DEBUG
ビルド中のアサーション中にデバッガーを停止して継続できるようにするマクロを次に示します。 RELEASE
(または実際には非-DEBUG
)ビルド。
#ifdef DEBUG
#define MyAssert(condition, desc, ...) \
if (!(condition)) { \
NSLog((desc), ## __VA_ARGS__); \
if (AmIBeingDebugged()) \
kill (getpid(), SIGSTOP); \
else { \
NSLog(@"%@, %d: could not break into debugger.", THIS_FILE, __LINE__); \
} \
}
#define MyCAssert(condition, desc, ...) \
if (!(condition)) { \
NSLog((desc), ## __VA_ARGS__); \
if (AmIBeingDebugged()) \
kill (getpid(), SIGSTOP); \
else \
NSLog(@"%@, %d: could not break into debugger.", THIS_FILE, __LINE__)); \
} \
}
#else //NOT in DEBUG
#define MyAssert(condition, desc, ...) \
if (!(condition)) { \
DDLogError((desc), ## __VA_ARGS__); \ //use NSLog if not using Lumberjack
NSAssert((condition), (desc), ## __VA_ARGS__); \
}
#define MyCAssert(condition, desc, ...) \
if (!(condition)) { \
DDLogError((desc), ## __VA_ARGS__); \ //use NSLog if not using Lumberjack
NSCAssert((condition), (desc), ## __VA_ARGS__); \
}
#endif //end DEBUG
#endif
これらのマクロには関数が必要です。この関数AmIBeingDebugged()
は、Robが提供したリンクでAppleから入手できます。技術的なQ&A QA1631:デバッガーの検出。DEBUG
(ビルド設定でも定義する必要があります。)
致命的なアサーションが発生したメソッド、ファイル、および行番号を吐き出すため、非ビルドでLumberjackを選択したことに注意してくださいDDLogError()
。NSLog()
DEBUG