免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 13681 | 回复: 2
打印 上一主题 下一主题

[C++] malloc_consolidate 错误,是内存分配问题嘛? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-08 11:54 |只看该作者 |倒序浏览
本帖最后由 jd808 于 2015-01-08 14:36 编辑

  1. ============关闭了一个句柄==============
  2. freesocket OK

  3. Program received signal SIGSEGV, Segmentation fault.
  4. malloc_consolidate (av=av@entry=0x7ffff6af5760 <main_arena>) at malloc.c:4113
  5. 4113                  size = p->size & ~(PREV_INUSE|NON_MAIN_ARENA);
  6. (gdb) bt
  7. #0  malloc_consolidate (av=av@entry=0x7ffff6af5760 <main_arena>) at malloc.c:4113
  8. #1  0x00007ffff67b9059 in _int_malloc (av=0x7ffff6af5760 <main_arena>, bytes=1024) at malloc.c:3400
  9. #2  0x00007ffff67bb11c in __GI___libc_malloc (bytes=1024) at malloc.c:2869
  10. #3  0x00007ffff798c578 in evbuffer_chain_new (size=71, size@entry=23) at buffer.c:168
  11. #4  0x00007ffff798f9c0 in _evbuffer_expand_fast (buf=buf@entry=0x956410, datlen=datlen@entry=23,
  12.     n=n@entry=4) at buffer.c:1843
  13. #5  0x00007ffff799011a in evbuffer_read (buf=buf@entry=0x956410, fd=fd@entry=1133, howmuch=23,
  14.     howmuch@entry=16384) at buffer.c:2087
  15. #6  0x00007ffff79932d5 in bufferevent_readcb (fd=1133, event=<optimized out>, arg=0x956210)
  16.     at bufferevent_sock.c:165
  17. #7  0x00007ffff7988a14 in event_process_active_single_queue (activeq=0x6309a0, base=0x67fe60)
  18.     at event.c:1350
  19. #8  event_process_active (base=<optimized out>) at event.c:1420
  20. #9  event_base_loop (base=0x67fe60, flags=0) at event.c:1621
  21. #10 0x000000000040e708 in MultiServer::StartRun (this=0x6347e0) at src/MultiServer.cpp:225
  22. #11 0x000000000041a950 in TControl::Run (this=0x7fffffffe4af) at src/TControl.cpp:26
  23. #12 0x0000000000407834 in main (argc=1, argv=0x7fffffffe5a8) at src/node_gateway.cpp:24
复制代码
最近在搞libevent库,同时开启2个压测工具,一个已经正常登陆1000个用户,并开始发测试数据,另一个工具开始建立1000个用户,这个时候会出现用户断开情况(应该是压测工具出问题了),导致服务端,在断开其中一个socket的同时继续建立一个新的socket,导致上面的错误,(后端接收socket是单线程,处理接收指令是多线程),但我已经开启了libevent锁.不知道啥原因,有知道的大侠么?

论坛徽章:
3
射手座
日期:2014-08-18 12:15:53戌狗
日期:2014-08-22 09:53:36寅虎
日期:2014-08-22 14:15:29
2 [报告]
发表于 2015-01-08 17:40 |只看该作者
应该是内存越界了, 把glibc arena 内部的数据结构mchunkptr写坏了, 导致glibc在访问内核数据结构p->size的时候Crash了,
把MALLOC_CHECK_打开, 让glibc内部自检大部分情况下能提前检测到越界的地方。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2015-01-08 18:15 |只看该作者
gaojl0728 发表于 2015-01-08 17:40
应该是内存越界了, 把glibc arena 内部的数据结构mchunkptr写坏了, 导致glibc在访问内核数据结构p->size的 ...

这个问题找到了在枷锁之前调用了bufferevent_free,把他拷贝到锁里就没问题了,但又出现了死锁问题,流程如下
  1. 读aa===1147  //这个下面就是evbuffer_get_length(m_ReadBuf);这个,有libevent提供,读取缓存长度.卡在这个函数了
  2. close event. fd:1147, Bev:0x96bb10, conn:0x96d910 ==140737354020672
  3. ============准备关闭句柄==============1===fd:1147
复制代码
这里有个奇怪的地方是,读线程在准备读取长度的时候卡主了(libevent里应该有吧锁),但这个时候主线程抛出了这个fd断开了,就调用关闭程序取关闭fd和缓存.由于读线程加了conn->UserCMDLock锁(保证每个句柄只能一个线程在读),为了保证在读取过程中,不关闭FD,我就在关闭函数里又加了conn->UserCMDLock锁,结果就卡主了.(关闭函数只会在主线程调用,不会和读线程冲突,这里卡主主要是读线程被卡在了evbuffer_get_length处,导致读线程不能释放锁.),请问这种情况是BUG?还是我用的不对啊.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP