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 in LogicHandler::run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

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 in LogicHandler::run (this=0x3e9be0) at F:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59

F:\EternalHeroes\server\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:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d 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:\EternalHeroes\server\src\game\src\handler\LogicHandler.cpp:59:1387:beg:0x40624d Continueing... [Inferior 1 (プロセス 29040) がコード 030000000035 で終了しました] デバッガーがステータス 0 で終了しました

4

2 に答える 2

0

あなたの問題は完全に別の場所にあるようです。仮想関数を持つクラスを使用している場合、メモリを適切に処理しておらず、クラスのvtableを上書きしているため、未定義の命令が呼び出されている可能性があります。のようなツールを使用valgrindして、メモリ書き込みをサニタイズします。

于 2013-10-20T08:59:30.103 に答える
0

Sigill は、関数 handleMove() のアドレスにあるメモリを呼び出し前のある時点でデータで上書きすることにより、メモリが破損していることを示します。バッファ オーバーランを探します。したがって、handlemove() を実行する代わりに、コードとして意味をなさないデータを実行しようとしているため、SIGILL が発生します。

あなたの環境では、電気柵でコンパイルするオプションはありますか? そうでない場合は、デバッガーを使用して慎重にステップ実行する必要があります。関数 handlemove のアドレスにあるメモリが書き込まれるたびにブレークします。

于 2015-10-13T01:48:10.317 に答える