找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 6454|回复: 3

服务器出现段错误

[复制链接]
发表于 2012-10-11 16:10:27 | 显示全部楼层 |阅读模式
情况这样:当客户端连接数达到1152个时,服务器此时崩溃,出现段错误提示,后来用core来调试,有以下信息,不知是何原导致程序出现段错误。
Reading symbols from /lib/tls/librt.so.1...done.
Loaded symbols for /lib/tls/librt.so.1
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0  0x004ab618 in ACE::record_and_set_non_blocking_mode ()
   from /opt/project/dcc/ACE_wrappers/lib/libACE.so.5.5.0
(gdb) where
#0  0x004ab618 in ACE::record_and_set_non_blocking_mode ()
   from /opt/project/dcc/ACE_wrappers/lib/libACE.so.5.5.0
#1  0x004cb38a in ACE::enter_recv_timedwait (handle=1153, timeout=0xb7f23c50, val=@0xb7f23bd8)
    at ACE.cpp:2317
#2  0x004cc289 in ACE::recv (handle=1153, buf=0xb7f23c60, len=19, flags=16384, timeout=0x2)
    at ACE.cpp:476
#3  0x0804f9ba in ACE_SOCK_IO::recv ()
#4  0x0804f04e in Server::handle_input ()
#5  0x004f197f in ACE_Dev_Poll_Reactor::dispatch_io_event (this=0xb7f24230, guard=@0xb7f24150)
    at /opt/project/dcc/ACE_wrappers/ace/Dev_Poll_Reactor.inl:180
#6  0x004f3b06 in ACE_Dev_Poll_Reactor::dispatch (this=0xb7f24230, guard=@0xb7f24150)
    at Dev_Poll_Reactor.cpp:1237
#7  0x004f3bf4 in ACE_Dev_Poll_Reactor::handle_events_i (this=0xb7f24230, max_wait_time=0x0,
    guard=@0xb7f24150) at Dev_Poll_Reactor.cpp:1211
#8  0x004f3c8a in ACE_Dev_Poll_Reactor::handle_events (this=0xb7f24230, max_wait_time=0x0)
    at Dev_Poll_Reactor.cpp:1166
#9  0x0052bc6c in ACE_Reactor::run_reactor_event_loop (this=0xb7f24220, eh=0) at Reactor.cpp:233
#10 0x0804f5f9 in server_worker ()
#11 0x0053e89e in ACE_Thread_Adapter::invoke_i (this=0x9c27688) at Thread_Adapter.cpp:151
#12 0x0053e805 in ACE_Thread_Adapter::invoke (this=0x9c27688) at Thread_Adapter.cpp:95
#13 0x004dee1b in ace_thread_adapter (args=0xffffffff) at Base_Thread_Adapter.cpp:137
#14 0x003e53cc in start_thread () from /lib/tls/libpthread.so.0
#15 0x0025ef0e in clone () from /lib/tls/libc.so.6
发表于 2012-10-11 16:43:50 | 显示全部楼层
能贴一些代码吗?
 楼主| 发表于 2012-10-11 23:27:58 | 显示全部楼层
本帖最后由 manlianmu 于 2012-10-12 08:55 编辑
winston 发表于 2012-10-11 16:43
能贴一些代码吗?
可以,
int Server::handle_input(ACE_HANDLE)
{
        char buffer[1024];    // Insure a trailing nul

        ssize_t bytes_read = 0;
        bytes_read = this->peer ().recv (buffer,20);
        ACE_DEBUG ((LM_DEBUG,
                    ACE_TEXT ("Received Message bytes_read = %d\n"),
                    bytes_read));
        /*新增非阻塞处理新情况*/
        if(bytes_read == -1)//出错
        {
                if(errno == EWOULDBLOCK)//非阻塞只需判断EWOULDBLOCK
                {
                        return 0;
                }
                else
                        ACE_ERROR_RETURN ((LM_ERROR,
                                           ACE_TEXT ("(%t) %p\n"),
                                           ACE_TEXT ("Server::handle_input")),
                                          -1);
        }
        else if (bytes_read == 0)//连接关闭,停止接收
                return -1;

        return 0;
}

int Server::handle_close(ACE_HANDLE handle,
                         ACE_Reactor_Mask mask)
{
        ACE_DEBUG ((LM_INFO,
                    ACE_TEXT ("(%t) Server Svc_Handler closing ")
                    ACE_TEXT ("handle <%d,%d> with reactor mask <0x%x>.\n"),
                    handle,
                    this->get_handle (),
                    mask));

        this->peer ().close ();


        return 0;

}

int DemoAcceptor::accept_svc_handler (Server *handler)
{
        int result = this->MyAcceptor::accept_svc_handler (handler);

        if (result != 0)
        {
                if (errno != EWOULDBLOCK)
                        ACE_ERROR ((LM_ERROR,
                                    ACE_TEXT ("(%t) %p\n"),
                                    ACE_TEXT ("Unable to accept connection")));

                return result;
        }

        ACE_DEBUG ((LM_DEBUG,
                    ACE_TEXT ("(%t) Accepted connection.  ")
                    ACE_TEXT ("Stream handle: <%d>\n"),
                    handler->get_handle ()));

        return result;
}

/*开个服务器+接收器线程工作*/
ACE_THR_FUNC_RETURN server_worker(void *p)
{
        const unsigned short port = *(static_cast<unsigned short *> (p));
        ACE_INET_Addr addr;
        if(addr.set(port,INADDR_LOOPBACK)!=0)
        {
                ACE_ERROR ((LM_ERROR,
                            ACE_TEXT ("(%t) %p\n"),
                            ACE_TEXT ("server_worker - ACE_INET_Addr::set")));

                return (void *) -1;
        }
        DemoPollReactor dp_reactor(10010);//EPOLL ,此时ET模式,//最大允许的连接数,可调整
        dp_reactor.restart(1);
        ACE_Reactor reactor(&dp_reactor);

        DemoAcceptor server;
        int flags = 0;
        ACE_SET_BITS(flags,ACE_NONBLOCK);//非阻塞
        if(server.open(addr,&reactor,flags)!=0)//监听
        {
                ACE_ERROR ((LM_ERROR,
                            ACE_TEXT ("(%t) %p\n"),
                            ACE_TEXT ("Unable to open server service handler")));

                return (void *) -1;

        }
        if (reactor.run_reactor_event_loop () != 0)
        {
                ACE_ERROR ((LM_ERROR,
                            ACE_TEXT ("(%t) %p\n"),
                            ACE_TEXT ("Error when running server ")
                            ACE_TEXT ("reactor event loop")));

                return (void *) -1;
        }
        ACE_DEBUG ((LM_INFO,
                    ACE_TEXT ("(%t) Reactor event loop finished ")
                    ACE_TEXT ("successfully.\n")));
        return 0;
}
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
        unsigned short port = 23234;

//        Server server;
        //      server.open(0);
        ACE_DEBUG((LM_DEBUG,"open after!\n"));
        if(ACE_Thread_Manager::instance()->spawn(server_worker,&port)==-1)
                ACE_ERROR_RETURN ((LM_ERROR,
                                   ACE_TEXT ("(%t) %p\n"),
                                   ACE_TEXT ("Unable to spawn server thread")),
                                  -1);
        if (ACE_Thread_Manager::instance ()->wait () != 0)
                ACE_ERROR_RETURN ((LM_ERROR,
                                   ACE_TEXT ("(%t) %p\n"),
                                   ACE_TEXT ("Error waiting for threads to complete")),
                                  -1);
        return 0;
}
发表于 2012-11-13 12:24:59 | 显示全部楼层
问题解决了没?

recv中没有超时信息,为什么会有超时时间?

#1  0x004cb38a in ACE::enter_recv_timedwait (handle=1153, timeout=0xb7f23c50, val=@0xb7f23bd8)
    at ACE.cpp:2317
#2  0x004cc289 in ACE::recv (handle=1153, buf=0xb7f23c60, len=19, flags=16384, timeout=0x2)
    at ACE.cpp:476

而且timeout值还不同?
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-4-30 00:34 , Processed in 0.013939 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表