0

当玩家四处走动时,我的服务器有时会崩溃。我尝试使用调试器运行它,但服务器出现错误:程序收到信号 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 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59 的 LogicHandler::run (this=0x3e9be0)

F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

1 0x0040624d 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59 的 LogicHandler::run (this=0x3e9be0)

F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d 继续... 程序收到信号 SIGILL,非法指令。在 ??() ()

1 0x0040624d 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59 的 LogicHandler::run (this=0x3e9be0)

F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

1 0x0040624d 在 F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59 的 LogicHandler::run (this=0x3e9be0)

F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d 继续... [Inferior 1 (process 29040) exited with code 030000000035] 调试器以状态 0 完成

4

2 回答 2

0

似乎您的问题完全出在其他地方。如果您使用具有虚函数的类,则可能是您没有正确处理内存并覆盖了类的vtable,因此调用了未定义的指令。使用诸如valgrind清理内存写入之类的工具。

于 2013-10-20T08:59:30.103 回答
0

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

在您的环境中是否可以选择使用电围栏进行编译?如果不是,您将需要使用调试器仔细检查。并在函数句柄移动地址处的内存被写入时中断。

于 2015-10-13T01:48:10.317 回答