2013-10-19 37 views
0

當玩家走動時,我的sevrer有時會崩潰。 我試圖用調試器運行它,服務器出現錯誤:程序收到信號SIGILL,非法指令。C++ Server有時會崩潰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 LogicHandler ::運行0x0040624d(此= 0x3e9be0)在F:\ EternalHeroes \服務器\ SRC \遊戲\ SRC \處理程序\ LogicHandler.cpp:59

F:\ EternalHeroes \服務器的\ src \遊戲\ SRC \處理器\ LogicHandler.cpp:59:1387:求:0x40624d 在F:\ EternalHeroes \服務器的\ src \遊戲\ SRC \處理器\ LogicHandler.cpp:59

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

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

1 LogicHandler ::運行0x0040624d(此= 0x3e9be0)在F:\ EternalHeroes \服務器\ SRC \遊戲\ SRC \處理程序\ LogicHandler.cpp:59

F:\ EternalHeroes \服務器的\ src \遊戲\ SRC \處理器\ LogicHandler.cpp:59:1387:求:0x40624d 在F:\ EternalHeroes \服務器的\ src \遊戲\ SRC \處理器\ LogicHandler.cpp:59

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

F:\ EternalHeroes \ server \ src \ game \ src \ handler \ LogicHandler .cpp:59:1387:beg:0x40624d 繼續... [劣質1(29040進程)退出,代碼爲 030000000035]調試完成了狀態0

回答

0

好像你的問題完全是在其他地方。如果您正在使用具有虛擬功能的類,則可能是您沒有正確處理內存並覆蓋類「vtable」,因此調用未定義的指令。使用像valgrind這樣的工具來清理你的內存寫入。

0

Sigill通過在函數handleMove()的地址處用數據覆蓋內存中的內存來調用內存,從而破壞內存。尋找緩衝區溢出。因此,不是執行handlemove(),而是嘗試執行與代碼無關的數據,因此SIGILL。

在您的環境中是否正在用電圍欄編譯一個選項?如果不是的話,你會想用調試器仔細地進行。並且只要寫入了函數handlemove的地址處的內存就會中斷。