2016-05-24 45 views
7

Ho un crash report da un'applicazione dal vivo:iOS Crash in utente-avviato-qos.overcommit. Cosa potrebbe creare questa coda?

Crashed: com.apple.root.user-initiated-qos.overcommit 
0 libobjc.A.dylib    0x21d486c8 objc_release + 7 
1 libobjc.A.dylib    0x21d493a9 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 388 
2 libdispatch.dylib    0x22110739 _dispatch_root_queue_drain + 1896 
3 libdispatch.dylib    0x2210ffcd _dispatch_worker_thread3 + 96 
4 libsystem_pthread.dylib  0x222c5b29 _pthread_wqthread + 1024 
5 libsystem_pthread.dylib  0x222c5718 start_wqthread + 8 

Il pezzo più utile di informazioni sembra essere il nome della coda che l'incidente si è verificato: com.apple.root.user-initiated-qos.overcommit. Ho controllato tutto il mio codice e uso la coda principale, una coda di background del sistema (cioè non qo avviata dall'utente), o code nominate che io stesso creo.

Ho altri SDK inclusi con la mia app, quindi c'è una buona possibilità che quegli SDK stiano lavorando in questa coda. Ma prima di presupporre che questo sia il caso, mi chiedevo se ci sono dei motivi comuni per cui iOS stesso invierà il lavoro su questa coda, il che potrebbe aiutarmi a isolare le aree della mia base di codici per un'osservazione più approfondita.

ho capito dalla ricerca (WWDC 2015 - Session 718) che la user-initiated-qos qualità di impostazione del servizio può essere applicato automaticamente a una coda in cui il lavoro è dispatch_async su una coda che non ha una specifica 'Quality of Service' impostazione, dal thread principale (utente interattivo qos). Ma come descritto sopra, non penso di farlo mentre chiamo tutte le mie code.

Quindi qualcuno sa se o quando iOS utilizza la coda com.apple.root.user-initiated-qos.overcommit?

+0

Mi piacerebbe sapere di più su questa coda overcommit pure. Abbiamo molti incidenti una tantum che sembrano avere questo, ma non riesco ancora a trovare lo scenario che lo sta causando. –

risposta

2

Questa è una coda predefinita creata dal sistema. Vari componenti dell'interfaccia utente e componenti di sistema inviano blocchi a questa coda.

Quando si verifica un arresto anomalo con _dispatch_root_queue_drain nella traccia dello stack, significa che alcuni blocchi sono già stati eseguiti su quella coda e il pool di autorelease viene scaricato. Solitamente l'arresto è causato dal rilascio di un oggetto già rilasciato, ma il rilascio "extra" viene attribuito al pool di autorelease perché viene eseguito per ultimo.

Le probabilità sono che tu abbia trasmesso un oggetto a un sistema in qualche parte, ma è stato sovrascritto accidentalmente.

edit: Here are instructions per l'utilizzo di NSZombie per rintracciare questi giù