我的服务器有一个问题,它在调试器上运行。
我在调用 delete [] 指针时收到 SIGTRAP 消息。
程序收到信号 SIGTRAP,跟踪/断点陷阱。在ntdll!DbgUiConnectToDbg () (C:\WINDOWS\system32\ntdll.dll)
10 0x00402247 在 CharacterCreateHandler::run (this=0x3e8170) 在 F:\EternalHeroes\server\src\game\handler\CharacterCreateHandler.cpp:44
F:\EternalHeroes\server\src\game\handler\CharacterCreateHandler.cpp:44:1211:beg:0x402247 在 F:\EternalHeroes\server\src\game\handler\CharacterCreateHandler.cpp:44
这是它发生的功能:
void CharacterCreateHandler::run()
{
try
{
unsigned short lenWOH = _packet[0] - 8;
Decryptor dec;
_packet = dec.decrypt(_packet + 8, lenWOH);
std::string characterName(_packet, 16);
Application & app = Application::instance();
app.logger().information(characterName);
unsigned short len = 20;
char * reply = new char[len]();
///build packet header
//set len (it's short)
reply[0] = len & 0xff;
reply[1] = (len >> 8) & 0xff;
reply[4] = 3; //group
reply[6] = 6; //type
///body - static
reply[8] = 1; //indicator
reply[9] = 1; //indicator
reply[10] = 0x12;
reply[11] = 0x2b;
reply[13] = 0xc0;
reply[14] = 0xb7;
reply[15] = 0xc4;
reply[17] = 0xe0;
reply[18] = 0x21;
reply[19] = 0x45;
_con->sendBlocking(reply, len);
delete [] _packet; //line 44
delete [] reply;
delete this;
}
catch(...)
{
}
}
这是给出指针(_pBuffer)的类形式:
class CSConnection
{
public:
CSConnection(StreamSocket& socket, SocketReactor& reactor);
~CSConnection();
void sendBlocking(char * buffer, unsigned short len);
void sendNonblocking(char * buffer, unsigned short len);
void onReadable(const AutoPtr<ReadableNotification>& pNf);
void onSocketTimeout(const AutoPtr<TimeoutNotification>& pNf);
void onShutdown(const AutoPtr<ShutdownNotification>& pNf);
void onError(const AutoPtr<ErrorNotification>& pNf);
private:
enum
{
BUFFER_SIZE = 1024
};
StreamSocket _socket;
SocketReactor& _reactor;
char* _pBuffer;
};
以及接收数据包的功能(_pBuffer)
void CSConnection::onReadable(const AutoPtr<ReadableNotification>& pNf)
{
try
{
int n = _socket.receiveBytes(_pBuffer, BUFFER_SIZE);
if (n > 0)
{
//app.logger().information("Packet s " + nb.format(nBytes) + ", group : " + nb.format(_pBuffer[4]) + ", type : " + nb.format(_pBuffer[6]));
unsigned short packetID;
packetID = (_pBuffer[4] * 666) + _pBuffer[6];
switch(packetID)
{
case 666:
WorkerThreadPool::getInstance().tp->start(*new QuitHandler(this));
break;
case 672:
WorkerThreadPool::getInstance().tp->start(*new CharacterCreateHandler(this, _pBuffer));
break;
...