我正在努力解决我的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");
答案 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_t
个NSObject
个对象:
(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 }>
这意味着您可以使用description
和debugDescription
方法获取有关dispatch_object_t
个对象的一些信息。