dispatch_debug应该如何使用?

时间:2011-05-12 20:03:54

标签: iphone multithreading debugging grand-central-dispatch

我正在努力解决我的GCD代码中的死锁问题。然后我在标题文件dispatch_debug中看到了这个函数<dispatch/object.h>

/*!
 * @function dispatch_debug
 *
 * @abstract
 * Programmatically log debug information about a dispatch object.
 *
 * @param object
 * The object to introspect.
 *
 * @param message
 * The message to log above and beyond the introspection.
 */
__OSX_AVAILABLE_STARTING(__MAC_10_6,__IPHONE_4_0)
DISPATCH_EXPORT DISPATCH_NONNULL2 DISPATCH_NOTHROW __attribute__((__format__(printf,2,3)))
void
dispatch_debug(dispatch_object_t object, const char *message, ...);

但我无法做任何事情。我希望它会打印出状态并锁定或类似的东西。

以下是我如何使用它:

grabber_queue = dispatch_queue_create("com.unpaq.tvguideplus.grabber", NULL);
dispatch_debug(grabber_queue, "grabber queue");

2 个答案:

答案 0 :(得分:6)

  

dispatch_debug

     

调试信息记录到控制台日志中。此信息可用作调试工具,以在调用dispatch_debug函数时查看调度对象的内部状态(当前引用计数,暂停计数等)。

dispatch_debug将消息发送到syslog。所以,

grabber_queue = dispatch_queue_create("com.unpaq.tvguideplus.grabber", NULL);
dispatch_debug(grabber_queue, "grabber queue");

此代码将在system.log中打印如下。

May 13 08:50:17 hostname exefile[53164]: com.unpaq.tvguideplus.grabber[0x6200e10] = {
 xrefcnt = 0x1, refcnt = 0x1, suspend_cnt = 0x0, locked = 0, target =
 com.apple.root.default-overcommit-priority[0x1af0700], width = 0x0, running = 0x0,
 barrier = 0 }: grabber queueMay

它不会出现在Xcode调试控制台中。您可以在iPhone模拟器上的/Applications/Utilities/Console.app system.log中找到,或者在iPhone,iPod touch和iPad上的Xcode组织器中看到。

顺便说一句,GCD是开源的。它通过libdispatch分发。 dispatch_debug包含在src / object.c中。

答案 1 :(得分:0)

自iOS 6.0起,dispatch_debug()deprecated。文档并未说明要使用的内容,但我发现现在您可以处理dispatch_object_tNSObject个对象:

(lldb) po _connectScanTimer
<OS_dispatch_source: kevent-source[0x15d47440] = { xrefcnt = 0x1, refcnt = 0x2, suspend_cnt = 0x7fffffff, locked = 0, target = [0x15d7ca50], ident = 0x4, pending_data = 0x1, pending_data_mask = 0x0, timer = { target = 0x48841e442a, deadline = 0x488479d1aa, last_fire = 0x48808ac1cc, interval = 0x3938700, flags = 0x0 }, filter = DISPATCH_EVFILT_TIMER }>

这意味着您可以使用descriptiondebugDescription方法获取有关dispatch_object_t个对象的一些信息。