1. 程式人生 > >(libev) cannot allocate xxx bytes, aborting 問題的一種觸發條件

(libev) cannot allocate xxx bytes, aborting 問題的一種觸發條件

最近在專案中使用了libev,遇到一個很奇怪的crash,伺服器執行隨機時間後有一定的概率奔潰,輸出的最後一行log是:
(libev) cannot allocate xxx bytes, aborting。
因為捕捉了SIGINT訊號,所以可以確定崩潰就是由於libev的這個abort。開始是以為記憶體越界之類,排查了strncpy, memset,memcpy等使用的地方,並且使用valgrind工具檢查,並沒有發現記憶體操作異常的地方。在網上搜索了很久也沒找到相關的內容。後來通過客戶端的行為找到了規律,最終定位到問題的原因是:

  • ev_timer_start呼叫之後再次呼叫ev_timer_init,就會百分百出現此錯誤。

雖然正常的呼叫流程是先Init再start,但是如果該ev_timer被複用,並且通過再次Init設定了不同的callback時,就可能發生start之後再init的情況。當然這種情況,只要在init之前執行一次ev_timer_stop呼叫就可以避免這個問題了。