我是靠谱客的博主 聪明墨镜,最近开发中收集的这篇文章主要介绍压测工具运行一段时间之后报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,工具终于没有在这个地方挂了!

最后

以上就是聪明墨镜为你收集整理的压测工具运行一段时间之后报Illegal instructio的全部内容,希望文章能够帮你解决压测工具运行一段时间之后报Illegal instructio所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(30)

评论列表共有 0 条评论

立即
投稿
返回
顶部