压测工具运行一段时间之后报Illegal instructio

背景:问题出在http压测框架核心与外围的信息交流的deque上。本意是外部往deque的尾端插入信息,核心在dequ的头部拉取信息。每次运行一段时间之后就挂掉了,gdb监测收到Illegal instruction。每次的堆栈信息还不一样,直到看到如下堆栈信息。

堆栈信息如下:

Program received signal SIGILL, Illegal instruction.

[Switching to Thread 0x7f8e60402700 (LWP 4751)]
0x000000003f8d5aa2 in ?? ()
(gdb) bt
#0  0x000000003f8d5aa2 in ?? ()
#1  0x00007f8e603f3cc0 in ?? ()
#2  0x0000000001d201d3 in std::deque<MMTerminal::EpollManager::HandlerInfo, std::allocator<MMTerminal::EpollManager::HandlerInfo> >::begin (this=0x0) at /usr/local/include/c++/4.8.2/bits/stl_deque.h:1038
#3  0x0000000001d1f46c in MMTerminal::EpollManager::RegisterHandler (this=0x2a223800)
    at proxymanager.cpp:46
#4  0x0000000001d1f5e0 in MMTerminal::EpollManager::run (this=0x2a223800)
    at proxymanager.cpp:69
#5  0x0000000002912e4b in mmThreadRun (p=0x2a223800) at mmcomm/mmutil/MmConcurrent.cpp:22
#6  0x00007f8e6a20ddc5 in start_thread () from /lib64/libpthread.so.0

#7  0x00007f8e69c3974d in clone () from /lib64/libc.so.6


堆栈信息表明此时this=0x0,白思不得其解,这个对象是随proxymanager生成的,保存的不是指针。什么情况下会出现0x0,非法访问?联想到deque的内存布局,有可能是消耗内存过大,在重新插入的时候需要重新分配, 插入进程把deque的内存移动到其他地方,而拉取消息的进程拿到的begin()就变成非法地址了。为了验证我的这个想法,我把deque换成list,工具终于没有在这个地方挂了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值