Ho bisogno di aiuto con questa eccezione, sto implementando un plugin NPAPI per poter usare i socket locali dalle estensioni del browser, per farlo uso la struttura di Firebreath.boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector <boost :: thread_resource_error>>
Per socket e connettività Sto usando Boost asio con chiamate asincrone e un pool di thread di 5 thread di lavoro. Inoltre ho una scadenza per thread per implementare un timeout di trasmissione.
mio flusso di lavoro interno con il plugin è come questo:
- aperta presa 1 (questo avvia un'async_receive e l'async_wait termine )
- scrittura nella presa 1
Get risposta 1
Aprire un'altra presa 2
Wri te nella presa 2
Write presa 1
Chiudi presa 1 (socket.cancel(), deadline.cancel(), socket.shutdown(), presa rilascio).
risposta Get 2
- Scrivi presa 2
- Chiudi presa 2
Come tutto è linguaggio croce e asincrone è davvero difficile eseguire il debug, ma tutti aperti, scrivere o chiudere sono chiamati da JavaScript e la lettura dal socket 1 che chiama open 2, scrive 2, scrive 1 e chiude 1 in questo ordine.
Forse tutto ciò di cui sto dicendo è indipendente, in quanto lo stack di chiamate quando viene generata l'eccezione non mostra nessuna delle mie funzioni e mostrare solo che è all'interno di un malloc
che chiama _heap_alloc_dbg_impl
Come è di solito non riesce a il 2 ° o 3 ° ciclo completo e sembra che avvenga tra i passaggi 5 e 7.
Ma, penso che debba essere collegato asio come fare tutto con un singolo thread di lavoro appena si blocca con l'eccezione nel primo ciclo.
Sono aperto a pubblicare ulteriori informazioni codice se ne avete bisogno.
Update 1:
Aggiornamento 2:
Ci sono 10 thread sono lanciati con:
workPtr.reset(new boost::asio::io_service::work(io_service));
for (int i = 0; i < 10; ++i) {
m_threadGroup.create_thread(boost::bind(&boost::asio::io_service::run, &io_service));
}
Il _threadstartex 11 ° non so chi l'ha lanciato
Su un altro thread (non quello che VS sostiene come causa dello schianto) c'è un join_all()
in corso perché la mia classe viene distrutta ma penso che non dovrebbe, quindi forse questo crash è dovuto ad un'altra eccezione e al Firebreath processo per chiudere tutto quando si blocca.
Dove viene generata l'eccezione? Pubblica un po 'di codice. –
Quanti thread di lavoro ci sono? Sembra che i thread che stai iniziando non raggiungano mai il completamento. –
Aggiunta immagine con codice, stack di chiamate e thread. Non riesco a vedere l'eccezione, ho appena ricevuto il messaggio su un'eccezione con le opzioni da interrompere o continuare e quando interrompo è lo stato, nota che non c'è nessun frame con il mio codice nello stack di chiamate (le mie classi sono SocketInfo , SocketsApi, Base64), su un altro thread è chiaro che l'oggetto npapi è stato distrutto e sta facendo un {m_threadGroup.join_all();} ma non dovrebbe essere distrutto in quel punto, quindi forse VS si sta rompendo dopo un altro eccezione ha causato il plugin per iniziare la distruzione, non ho idea di come funziona FB – frisco