Как предполагается использовать dispatch_debug?

#iphone #multithreading #debugging #grand-central-dispatch

#iPhone #многопоточность #отладка #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");
  

Комментарии:

1. Глядя на это, я сильно подозреваю, что это часть частного SDK, который мы не должны использовать. В этом случае ответ будет «вы этого не делаете».

Ответ №1:

dispatch_debug

Отладочная информация заносится в журнал консоли. Эта информация может быть полезна в качестве средства отладки для просмотра внутреннего состояния (текущее количество ссылок, количество приостановок и т.д.) объекта отправки во время вызова функции dispatch_debug.

dispatch_debug отправляет сообщения в системный журнал. Итак,

 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. Вы можете посмотреть в /Applications/ Utilities /Console.app system.log в симуляторе iPhone или в Xcode organizer на iPhone, iPod touch и iPad.

Кстати, GCD имеет открытый исходный код. Он распространяется через libdispatch. dispatch_debug включен в src / object.c.

Комментарии:

1. Отлично. Жаль, что я не могу увидеть это в консоли отладки. Но, по крайней мере, теперь я знаю почему.

2. От имени @DoDoDoiT: @»Я запутался с System.log в симуляторе iPhone. Чтобы найти файл system.log в finder, перейдите в / Applications / Utilities /Console.app На панели слева, вы найдете system. войдите в выпадающее меню FILES»

3. Вы можете перенаправить вывод на консоль — смотрите dispatch_debug в этом блоге: jeremywsherman.com/blog/2013/01/08/debugdescription-gcd-xpc

4. Не могли бы вы, пожалуйста, сказать мне, что означает locked = 0?

5. Теперь эта функция устарела: смотрите Ответ от @werediver ниже

Ответ №2:

Начиная с iOS 6.0, dispatch_debug() является устаревшим. В документах не указано, что предполагается использовать вместо этого, но я узнал, что теперь вы можете обрабатывать 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 объектах.