C++服务器有时会崩溃

C++ Server crashes sometimes SIGILL

本文关键字:崩溃 服务器 C++      更新时间:2023-10-16

当玩家四处走动时,我的 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,非法指令。在??() ()

1 0x0040624d in LogicHandler::

run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

F:\永恒英雄\服务器\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624dat F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

1 0x0040624d in LogicHandler::

run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

F:\永恒英雄\服务器\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d继续。。。程序收到信号SIGILL,非法指令。在??() ()

1 0x0040624d in LogicHandler::

run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

F:\永恒英雄\服务器\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624dat F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

1 0x0040624d in LogicHandler::

run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

F:\永恒英雄\服务器\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d继续。。。[下级 1(进程 29040)使用代码退出030000000035] 调试器已完成,状态为 0

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

Sigill表示通过在调用前的某个时间点用数据覆盖函数handleMove()地址处的内存来破坏内存。查找缓冲区溢出。因此,您不是执行handlemove(),而是尝试执行没有代码意义的数据,因此SIGILL。

在您的环境中使用电子围栏进行编译是一种选择吗?如果没有,则需要使用调试器仔细执行。并在写入函数 handleMove 地址处的内存时中断。