2013-03-21 290 views
6

我需要一些幫助來解決這個異常,我正在實現一個NPAPI插件,以便能夠使用來自瀏覽器擴展的本地套接字,要做到這一點,我正在使用Firebreath框架。boost :: exception_detail :: clone_impl <boost :: exception_detail :: error_info_injector <boost :: thread_resource_error>>

對於套接字和連接我使用異步調用Boost asio和5個工作線程的線程池。 另外我有一個每個線程的最後期限來實現傳輸超時。

我用插件擴展的工作流程是這樣的:

  1. 打開插座1(此啓動async_receive並限期 async_wait)
  2. 寫在插座1
  3. 獲取響應1

  4. 打開另一個插座2

  5. Wri TE在插座2

  6. 寫插座1

  7. 關閉插座1 (socket.cancel(),deadline.cancel(),socket.shutdown(),插座 釋放)。

  8. 獲取響應2

  9. 寫插座2
  10. 關閉插座2

由於一切是跨語言和異步真的很難調試,但全部打開,寫入或接近被從JavaScript叫並從套接字1中讀取,按照該順序調用打開2,寫入2,寫入1並關閉1。

也許evrything我告訴無關當發生異常時不顯示我的任何功能,只是表明它是一個malloc調用_heap_alloc_dbg_impl

由於這是它通常無法在內部調用堆棧第二或第三個完整週期,似乎發生在第5步和第7步之間。

但是,我認爲它必須是asio相關的,因爲使用單個工作線程執行所有操作只會在第一個週期出現異常。

我打開發布更多的信息代碼,如果你需要它。

更新1:

VS when breaking

更新2:

有10個線程與被推出:

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)); 
} 

第11 _threadstartex我不知道誰推出它

在另一個線程上(不是VS聲稱導致崩潰的線程),有一個join_all()正在處理中,因爲我的類正在被銷燬,但我認爲它不應該,所以也許這次崩潰是由於另一個異常和Firebreath進程在崩潰時關閉所有內容。

+0

拋出異常在哪裏?發佈一些代碼。 – 2013-03-21 17:44:42

+0

有多少個工作線程?它看起來像你開始的線程永遠不會完成。 – 2013-03-21 18:07:16

+0

添加了帶有代碼,調用堆棧和線程的圖像。我無法看到異常,我只是得到有關異常的消息,並打破或繼續選項,當我斷開狀態時,請注意,調用堆棧中沒有框架(我的類是SocketInfo ,SocketsApi,Base64),在另一個線程中,很明顯npapi對象已經被銷燬,並且它正在執行{m_threadGroup.join_all();}但它不應該在那個時候被銷燬,所以VS可能會破壞另一個異常導致插件開始銷燬,我不知道FB是如何工作的 – frisco 2013-03-21 18:15:40

回答

10

我發現了錯誤,繼續檢查其他線程。我發現Firebreath所調用的主要階級正在被摧毀。多檢查一下我發現這完全是我的錯我有一個類來存儲需要在主類中使用函數的套接字信息(我不喜歡它,但它是我發現使用它的唯一方法)所以我給校長增加了一個shared_ptr。因此,如果它在摧毀了那些SocketInfo對象之後沒有其他對象,那麼ptr ref count就會達到0,並且主類將被銷燬。

有趣的是,套接字通常在使用後通常會關閉,所以我沒有理由爲什麼在沒有套接字打開的情況下沒有觸發這個套接字,並且只有當兩個套接字在連續打開和關閉時纔會觸發。

無論如何,我也有一個shared_from_this與截止日期處理程序錯誤,但似乎無關。

現在看來它可以像任何線程一樣按預期工作。

+3

我編輯這個以刪除道歉的語氣,所以SO鼓勵回答你自己的問題。所以+1可以幫助別人。 – 2013-03-21 21:01:55

相關問題