(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调用就可以避免这个问题了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 名称 libev - 一个 C 编写的功能全面的高性能事件循环。 概要 示例程序 关于 libev Libev 是...
    hanpfei阅读 15,493评论 0 5
  • 观察者类型 This section describes each watcher in detail, but ...
    hanpfei阅读 4,793评论 0 1
  • 教程一:视频截图(Tutorial 01: Making Screencaps) 首先我们需要了解视频文件的一些基...
    90后的思维阅读 10,273评论 0 3
  • 第243章回顾 皇宫的午后也是清净无比,只能听到院子里一些鸟叫,之前那些喧闹的宫女们似乎也都察觉到宫中气氛的压抑,...
    陈瀛Neptune阅读 3,237评论 30 28
  • 毕业工作后,特别是结婚以后才确切的明白,每个人因其性格及成长环境背景不一样,对同一件事有其自己不同的态度和处理方式...
    Lily英文屋阅读 1,553评论 0 1