概述
背景:问题出在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,工具终于没有在这个地方挂了!
最后
以上就是聪明墨镜为你收集整理的压测工具运行一段时间之后报Illegal instructio的全部内容,希望文章能够帮你解决压测工具运行一段时间之后报Illegal instructio所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复