12

Stiamo eseguendo il porting di un'app da 10.6 a 10.8. Sto guardando dylib che carichiamo in app. Sto affrontando un crash molto insolito nella coda di lavoro della raccolta di dati obsoleti con il seguente messaggio.Coda di lavoro Crash of Garbage Coda di lavoro se dylib è caricato

malloc: Thread::suspend(): unable to suspend a thread: err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening on, 0 local blocks 

Per l'applicazione GCC_ENABLE_OBJC_GC = required è impostato. Se ho GCC_ENABLE_OBJC_GC = required in dylib, si bloccherà ancora. Non riesco a disattivare Garbage Collector nell'applicazione. Devo gestirlo in modo anomalo dal mio dylib.

La causa del crash risulta essere che il garbage collector non è in grado di sospendere il thread. (come dice nel registro). Questo thread è stato creato utilizzando thread_create(). Se metto un ciclo indefinito while (con sleep) nel costruttore di dylib, non mi faccio crash. Ottengo crash quando il costruttore ha terminato la sua esecuzione.

È un modo per dire a Garbage Collector di non provare a sospendere il thread? O per aumentare il conteggio dei riferimenti del thread? o tutto ciò che posso fare per impedire a Garbage Collector di interferire con il mio codice dylib.

+0

Può chiarire: cosa si intende per il progetto di utilizzare GC? o no? La mia prima ipotesi è che il dylib che si sta caricando sia stato creato per usare GC, ma la tua applicazione principale no. – ipmcc

+0

Sto semplicemente scrivendo dylib e caricando il dylib causa crash. L'applicazione è stata creata per utilizzare GC (GCC_ENABLE_OBJC_CC = richiesto). Se abilito o disballo il flag su dylib, non importa. Crolla ancora. – MacGeek

+0

quale compilatore usi per i due? versione gcc? Inoltre: quali sono gli obiettivi di distribuzione, gli sdks di base? –

risposta

-1

Stiamo eseguendo il porting di un'app da 10.6 a 10.8. Il motivo per il crash risulta essere che il garbage collector non è in grado di sospendere il thread.

È previsto.
A partire da OSX 10.8, la raccolta dati obsoleti è obsoleta. Quindi CG non è in grado di sospendere i thread per svolgere il proprio dovere. Di conseguenza ottieni tutti i problemi che stai affrontando.

Se si desidera sviluppare per 10.8, è necessario convertire in ARC (migliore) o tornare al conteggio dei riferimenti manuale. Se si desidera spostare per arco, vedere Transitioning to ARC Release Notes


Dalla documentazione di Apple circa 10.8:

Importante: A partire dal OS X v10.8, raccolta dei rifiuti è deprecato. Utilizzare invece ARC (Conteggio di riferimento automatico). Per ulteriori informazioni su ARC, vedere Transizione alle note di rilascio ARC.

Fonte: What's new in OS X v10.8 Mountain Lion:

Risposte:

  • È loro un modo per dire garbage collector non provare e sospendere il filo?

No. Ecco come funziona.

  • O per aumentare il numero di riferimento di filo? O tutto ciò che posso fare per impedire a Garbage Collector di interferire con il mio codice dylib.

No. Dato che GC è dichiarato obsoleto inferiore a 10.8, è necessario liberarsene se si desidera supportare 10.8.

GC è stata una tecnologia davvero di breve durata sulla piattaforma MAC. E sostituito da ARC per vari motivi.

+0

Solo perché qualcosa è deprecato non significa che non funzioni più. Significa solo che non dovrebbe più essere usato per il nuovo codice e che alla fine andrà via. Sarebbe un po 'inutile marcare le cose come deprecate se smettessero di funzionare immediatamente - quindi potrebbero essere rimosse immediatamente. – Sven

+0

Sì, ma ci sono un sacco di problemi che GC è spuntato all'improvviso sotto il 10.8, come quello che sta vivendo l'OP. * Potresti ** seriamente ** consigliare a MacGeek di continuare a utilizzare tecnologie obsolete e passare il tempo a cercare di riparare lungo la strada? * – Jean

3
It is expected. 
Starting with OSX 10.8, Garbage collection is deprecated. So CG is unable to suspend the threads to perform its duty. As a result you get all the issues you are facing. 

If you want to develop for 10.8, you need to convert to ARC (best) or move back to manual reference counting. If you wish to move to arc, see Transitioning to ARC Release Notes 

Dalla documentazione di Apple circa 10.8:

Importante: Inizio in OS X v10.8, raccolta dei rifiuti è deprecato. Utilizzare invece ARC (conteggio di riferimento automatico). Per ulteriori informazioni su ARC, vedere Transizione alle note di rilascio ARC.

https://books.google.co.in/books?id=8nzwsciij20C&pg=PT431&lpg=PT431&dq=Crash+of+Garbage+Collection+Work+in+objective+c&source=bl&ots=xTjLETFMsO&sig=b33rLeXJVh1WtnAvcVJykfNtvOU&hl=en&sa=X&ved=0ahUKEwiyqZrC2rvNAhVKNI8KHZRdC7AQ6AEIKDAC#v=onepage&q=Crash%20of%20Garbage%20Collection%20Work%20in%20objective%20c&f=false

Problemi correlati