C ++服务器有时会崩溃SIGILL

时间:2013-10-19 18:17:21

标签: c++ debugging crash

当玩家四处走动时,我的sevrer有时会崩溃。 我试图用调试器运行它,服务器出错:程序收到信号SIGILL,非法指令。

它显示了LogicHandler中的第59行。 这是功能运行。 这是函数:

void LogicHandler::run()
{
    try
    {
        unsigned short packetID = (packet->getGroup() * 666) + packet->getType();

        switch (packetID)
        {
        case 666:
            handleQuit();
            break;
        case 670:
            handleLogin();
            break;
        case 672:
            handleCreateCharacter();
            break;
        case 673:
            handleDeleteActor();
            break;
        case 675:
            handleSelectCharacter();
            break;
        case 1345:
            handleMove(); <- HERE OCCURS SIGILL
            break;
        case 11332:
            if(!connection.isLogged())
            {
                throw Poco::Exception("Unlogged access.");
            }
            connection.sendPing();
        default:
            if(!connection.isLogged())
            {
                throw Poco::Exception("Unlogged access.");
            }
            connection.sendPing();
            break;
        }
    }
    catch(...)
    {
        connection.shutdownConnection();
    }
    delete this;
}

这是调试器输出:

  

编程接收信号SIGILL,非法指令。在??? ()()

     Logic中的

1 0x0040624d ::运行(此= 0x3e9be0)F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     

F:\ EternalHeroes \服务器\ SRC \游戏\ SRC \处理程序\ LogicHandler.cpp:59:1387:BEG:0x40624d   在F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     Logic中的

1 0x0040624d ::运行(此= 0x3e9be0)F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     

F:\ EternalHeroes \服务器\ SRC \游戏\ SRC \处理程序\ LogicHandler.cpp:59:1387:BEG:0x40624d   继续...程序收到信号SIGILL,非法指令。在   ?? ()()

     Logic中的

1 0x0040624d ::运行(此= 0x3e9be0)F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     

F:\ EternalHeroes \服务器\ SRC \游戏\ SRC \处理程序\ LogicHandler.cpp:59:1387:BEG:0x40624d   在F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     Logic中的

1 0x0040624d ::运行(此= 0x3e9be0)F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler.cpp:59

     

F:\ EternalHeroes \服务器\ SRC \游戏\ SRC \处理程序\ LogicHandler.cpp:59:1387:BEG:0x40624d   继续... [Inferior 1(过程29040)退出代码   030000000035]调试器已完成,状态为0

2 个答案:

答案 0 :(得分:0)

好像你的问题完全在别的地方。如果您正在使用具有虚函数的类,则可能是您没有正确处理内存并覆盖类vtable,因此调用未定义的指令。使用像valgrind这样的工具来清理你的记忆写入。

答案 1 :(得分:0)

Sigill通过在调用之前的某个时刻用数据覆盖函数handleMove()的地址来表示您正在破坏内存。寻找缓冲区溢出。因此,不是执行handlemove()而是尝试执行代码无关的数据,因此SIGILL。

在您的环境中使用电围栏进行编译是一种选择吗?如果不是,您将需要仔细使用调试器。只要写入函数handlemove地址的内存,就会中断。