#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
объектах.