亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 6931 | 回復(fù): 12
打印 上一主題 下一主題

linux 多線程溢出問(wèn)題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-05-15 16:48 |只看該作者 |倒序?yàn)g覽
本帖最后由 weifeng270 于 2012-05-15 16:59 編輯

linux 多線程溢出問(wèn)題

附件是
valgrind  --leak-check=full -v --show-reachable=yes --log-file=/opt/oracle/new/DeviceServer/log/DeviceRegistServer.log  ./DeviceRegistServer

的日志

現(xiàn)象是隔一段時(shí)間。內(nèi)存就漲132K


int main(int argc, char* argv[])
{

        if(argc < 3)
        {
                printf("Usage: DeviceRegistServer -p Port(Default port 40005)\n");
                printf("   eg: DeviceRegistServer -p 30000\n");
               
        }
   

               

       
                int port = 50005;    //服務(wù)器監(jiān)聽(tīng)端口號(hào)
            int arginc = 1;      //指針?biāo)饕?br />
                if(argc >= 3)
                {
                        if(argv[arginc][0]=='-' && (argv[arginc][1]=='p'))
                        {
                                ++arginc;
                                port = atoi(argv[arginc++]);
                        }
               
                }





        // 創(chuàng)建一個(gè)Server socket
            int sock = socket(AF_INET, SOCK_STREAM, 0);
                if(sock == SOCKET_ERROR)
                {
                        printf("create sock error.%s \n",strerror(errno));
                        return 1;
                }
                sockaddr_in my_addr;
                my_addr.sin_family = AF_INET;         
                my_addr.sin_port = htons((u_short)port);      
                my_addr.sin_addr.s_addr = INADDR_ANY;

                if (bind(sock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
                {
                        printf("bind sock error\n");
                        return 1;
                }
                if (listen(sock, BACKLOG_SIZE) == SOCKET_ERROR)
                {
                        printf("listen sock error\n");
                        return 1;
                }

       
                sockaddr_in their_addr;
                int sin_size = 0;
                sin_size = sizeof(struct sockaddr_in);
            // 等待客戶端連接

                int loopcount=1;
                //while(loopcount<10000)
                while(TRUE)

                {
                        loopcount++;
                        printf("loopcount==%d\n",loopcount);
#if defined(WIN32)
                        int newsock = accept(sock, (struct sockaddr *)&their_addr,&sin_size);
                        HANDLE handle = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(AnswerClientThread), (LPVOID)newsock, 0, NULL);
                        CloseHandle(handle);
#elif defined(__linux__)
                        int newsock = accept(sock, (struct sockaddr *)&their_addr,(socklen_t*)&sin_size);
                        pthread_t ntid;
                        //void* ntidstatus;
                        int err;
                        if((err = pthread_create(&ntid, NULL, AnswerClientThread, (void*)newsock)) != 0)
                                {
                                        printf("AnswerClientThread線程創(chuàng)建失敗!\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程被創(chuàng)建\n");
                                }
                       
                        if(ntid !=0)
                                {                       
                                        pthread_join(ntid,NULL);
                                        printf("AnswerClientThread線程已經(jīng)結(jié)束\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程未結(jié)束\n");               
                                }

                                pthread_detach(ntid);
#endif

                }




        OCI_Cleanup();
        return 0;
       
}

調(diào)用的函數(shù)如下






void* AnswerClientThread(void* pParam)
{
        int psock = *(int*)&pParam;
        int nrecvlen = 0;
        char* recvbuf = new char[6400];
        char* recvbufpt = recvbuf;
        //printf("****** sum= %d ,%d******* \n",dw_k_run,dw_x_run);
       
        while(TRUE)
        {
                recvbuf = recvbufpt;
                memset(recvbuf, 0, 6400);
                nrecvlen = ::recv(psock, recvbuf, 6400, 0);
                if(nrecvlen == SOCKET_ERROR || nrecvlen > 6400)
                {
                        delete [] recvbuf;
                        ReleasePortInManage(psock);
                        close(psock);
                        return ((void*)1);
                }

                int ncmd = UNKNOWN_CMD;
                bool bcmd = false;
                int  ndatalen = 0;
                while(bcmd = get_cmd(recvbuf, nrecvlen, ncmd, ndatalen))
                {
                        printf("ncmd==%d\n",ncmd);
                        switch(ncmd)
                        {
                        case REGIST_CMD:                   // 注冊(cè)命令
                                {
                                        RegistDevInfo(recvbuf, nrecvlen, psock);                               
                                        break;
                                }
                        case KEEPALIVE_CMD:               // 心跳命令
                                {
                                        KeepAlive(recvbuf, nrecvlen, psock);
                                        break;
                                }

                        case XML_CMD:                    // xml
                                {
                                       
                                        xml_deco(recvbuf, nrecvlen, psock);                                       
                                                                                       
                                        break;
                                }
                        default:                          // 未知命令
                                {
                                        break;
                                }
                        }
                        if(ncmd == REGIST_CMD || ncmd == KEEPALIVE_CMD || ncmd==XML_CMD) // 和設(shè)備的心跳維持短連接
                                goto end;
                        nrecvlen = nrecvlen-ndatalen+2;
                        recvbuf = recvbuf+ndatalen-2;
                }
                //usleep(10);
        }
end:
        {
                // 除非客戶端告知要關(guān)閉鏈接,否則服務(wù)器是不會(huì)主動(dòng)關(guān)閉鏈接的
                delete [] recvbufpt;
                ReleasePortInManage(psock);
                close(psock);
                pthread_exit(NULL);
        }

        return ((void*)0);

DeviceRegistServer.rar

10.49 KB, 下載次數(shù): 36

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-05-15 17:01 |只看該作者
本帖最后由 weifeng270 于 2012-05-15 16:59 編輯


linux 多線程溢出問(wèn)題

附件是
valgrind  --leak-check=full -v --show-reachable=yes --log-file=/opt/oracle/new/DeviceServer/log/DeviceRegistServer.log  ./DeviceRegistServer

的日志

現(xiàn)象是隔一段時(shí)間。內(nèi)存就漲132K


int main(int argc, char* argv[])
{

        if(argc < 3)
        {
                printf("Usage: DeviceRegistServer -p Port(Default port 40005)\n");
                printf("   eg: DeviceRegistServer -p 30000\n");
               
        }
   
                 int port = 50005;    //服務(wù)器監(jiān)聽(tīng)端口號(hào)
            int arginc = 1;      //指針?biāo)饕?br />
                if(argc >= 3)
                {
                        if(argv[arginc][0]=='-' && (argv[arginc][1]=='p'))
                        {
                                ++arginc;
                                port = atoi(argv[arginc++]);
                        }
               
                }

        // 創(chuàng)建一個(gè)Server socket
            int sock = socket(AF_INET, SOCK_STREAM, 0);
                if(sock == SOCKET_ERROR)
                {
                        printf("create sock error.%s \n",strerror(errno));
                        return 1;
                }
                sockaddr_in my_addr;
                my_addr.sin_family = AF_INET;         
                my_addr.sin_port = htons((u_short)port);      
                my_addr.sin_addr.s_addr = INADDR_ANY;

                if (bind(sock, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
                {
                        printf("bind sock error\n");
                        return 1;
                }
                if (listen(sock, BACKLOG_SIZE) == SOCKET_ERROR)
                {
                        printf("listen sock error\n");
                        return 1;
                }

        
                sockaddr_in their_addr;
                int sin_size = 0;
                sin_size = sizeof(struct sockaddr_in);
                // 等待客戶端連接

            int loopcount=1;
                //while(loopcount<10000)
                while(TRUE)

                {
                        loopcount++;
                        printf("loopcount==%d\n",loopcount);
#if defined(WIN32)
                        int newsock = accept(sock, (struct sockaddr *)&their_addr,&sin_size);
                        HANDLE handle = CreateThread(NULL, 0, LPTHREAD_START_ROUTINE(AnswerClientThread), (LPVOID)newsock, 0, NULL);
                        CloseHandle(handle);
#elif defined(__linux__)
                        int newsock = accept(sock, (struct sockaddr *)&their_addr,(socklen_t*)&sin_size);
                        pthread_t ntid;
                        //void* ntidstatus;
                        int err;
                        if((err = pthread_create(&ntid, NULL, AnswerClientThread, (void*)newsock)) != 0)
                                {
                                        printf("AnswerClientThread線程創(chuàng)建失敗!\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程被創(chuàng)建\n");
                                }
                        
                        if(ntid !=0)
                                {                        
                                        pthread_join(ntid,NULL);
                                        printf("AnswerClientThread線程已經(jīng)結(jié)束\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程未結(jié)束\n");               
                                }

                                pthread_detach(ntid);
#endif

                }
        return 0;
        
}

調(diào)用的函數(shù)如下






void* AnswerClientThread(void* pParam)
{
        int psock = *(int*)&pParam;
        int nrecvlen = 0;
        char* recvbuf = new char[6400];
        char* recvbufpt = recvbuf;
        //printf("****** sum= %d ,%d******* \n",dw_k_run,dw_x_run);
        
        while(TRUE)
        {
                recvbuf = recvbufpt;
                memset(recvbuf, 0, 6400);
                nrecvlen = ::recv(psock, recvbuf, 6400, 0);
                if(nrecvlen == SOCKET_ERROR || nrecvlen > 6400)
                {
                        delete [] recvbuf;
                        ReleasePortInManage(psock);
                        close(psock);
                        return ((void*)1);
                }

                int ncmd = UNKNOWN_CMD;
                bool bcmd = false;
                int  ndatalen = 0;
                while(bcmd = get_cmd(recvbuf, nrecvlen, ncmd, ndatalen))
                {
                        printf("ncmd==%d\n",ncmd);
                        switch(ncmd)
                        {
                        case REGIST_CMD:                   // 注冊(cè)命令
                                {
                                        RegistDevInfo(recvbuf, nrecvlen, psock);                                
                                        break;
                                }
                        case KEEPALIVE_CMD:               // 心跳命令
                                {
                                        KeepAlive(recvbuf, nrecvlen, psock);
                                        break;
                                }

                        case XML_CMD:                    // xml
                                {
                                       
                                        xml_deco(recvbuf, nrecvlen, psock);                                       
                                                                                       
                                        break;
                                }
                        default:                          // 未知命令
                                {
                                        break;
                                }
                        }
                        if(ncmd == REGIST_CMD || ncmd == KEEPALIVE_CMD || ncmd==XML_CMD) // 和設(shè)備的心跳維持短連接
                                goto end;
                        nrecvlen = nrecvlen-ndatalen+2;
                        recvbuf = recvbuf+ndatalen-2;
                }
                //usleep(10);
        }
end:
        {
                // 除非客戶端告知要關(guān)閉鏈接,否則服務(wù)器是不會(huì)主動(dòng)關(guān)閉鏈接的
                delete [] recvbufpt;
                ReleasePortInManage(psock);
                close(psock);
                pthread_exit(NULL);
        }

        return ((void*)0);

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2012-05-15 17:08 |只看該作者
附件是程序運(yùn)行一段時(shí)間的。。內(nèi)存增加8K

以后這個(gè)地址段的內(nèi)存一直增加。。到無(wú)限大。

增加的內(nèi)存8K.JPG (231.73 KB, 下載次數(shù): 46)

增加的內(nèi)存8K.JPG

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2012-05-16 09:45 |只看該作者
                        int newsock = accept(sock, (struct sockaddr *)&their_addr,(socklen_t*)&sin_size);
                        pthread_t ntid;
                        //void* ntidstatus;
                        int err;
                        if((err = pthread_create(&ntid, NULL, AnswerClientThread, (void*)newsock)) != 0)
                                {
                                        printf("AnswerClientThread線程創(chuàng)建失敗!\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程被創(chuàng)建\n");
                                }
                       
                        if(ntid !=0)
                                {                       
                                        pthread_join(ntid,NULL);
                                        printf("AnswerClientThread線程已經(jīng)結(jié)束\n");
                                }
                        else
                                {
                                        printf("AnswerClientThread線程未結(jié)束\n");               
                                }

                                pthread_detach(ntid);

這里面有內(nèi)存溢出

有人知道怎么處理嗎?

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2012-05-16 12:44 |只看該作者
問(wèn)題在這幾行


                delete [] recvbufpt;
                //delete [] recvbuf;
                printf("recvbufpt===%s\n",recvbufpt);
                printf("recvbuf===%s\n",recvbuf);               
                print_port();
                ReleasePortInManage(psock);


內(nèi)存.jpg (6.45 KB, 下載次數(shù): 41)

內(nèi)存.jpg

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2012-05-16 14:11 |只看該作者
線程如果退出的話 收回沒(méi)?

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2012-05-16 14:32 |只看該作者
回收了。
但感覺(jué)沒(méi)有回收干凈

                                                pthread_t loghandle1;
                                                void* logstatus;
                                                int err;
                                                if((err = pthread_create(&loghandle1, NULL, InsertLog1, lg)) != 0)
                                                        {
                                                                printf("RegistDevInfoLog線程創(chuàng)建失敗!\n");
                                                        }
                                                else
                                                        {
                                                                printf("RegistDevInfoLog線程被創(chuàng)建\n");
                                                        }
                                                                printf("InsertLog1 err===%d\n",err);
                                                if(loghandle1 !=0)
                                                        {                                       
                                                                pthread_join(loghandle1,NULL);               
                                                                printf("RegistDevInfoLog線程已經(jīng)結(jié)束\n");
                                                        }
                                                else
                                                        {
                                                                printf("RegistDevInfoLog線程未結(jié)束\n");               
                                                        }


                                                        pthread_detach(loghandle1);

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2012-05-17 16:34 |只看該作者
找出問(wèn)題的原因了。是多線程引起的。


論壇徽章:
6
申猴
日期:2013-10-08 17:32:32金牛座
日期:2013-10-18 19:45:53天秤座
日期:2013-10-18 20:17:34處女座
日期:2014-02-11 10:10:29丑牛
日期:2014-02-15 10:44:15巳蛇
日期:2014-02-18 22:05:54
9 [報(bào)告]
發(fā)表于 2012-05-21 10:43 |只看該作者
我想知道問(wèn)題原因在哪,謝謝

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2012-05-23 11:12 |只看該作者
==27312== Memcheck, a memory error detector.
==27312== Copyright (C) 2002-2006, and GNU GPL'd, by Julian Seward et al.
==27312== Using LibVEX rev 1658, a library for dynamic binary translation.
==27312== Copyright (C) 2004-2006, and GNU GPL'd, by OpenWorks LLP.
==27312== Using valgrind-3.2.1, a dynamic binary instrumentation framework.
==27312== Copyright (C) 2000-2006, and GNU GPL'd, by Julian Seward et al.
==27312== For more details, rerun with: -v
==27312==
==27312== My PID = 27312, parent PID = 1876.  Prog and args are:
==27312==    ./DeviceRegistServer
==27312==
==27312== Thread 2:
==27312== Conditional jump or move depends on uninitialised value(s)
==27312==    at 0x4006247: strlen (mc_replace_strmem.c:246)
==27312==    by 0x1C9BCD: vfprintf (in /lib/libc-2.5.so)
==27312==    by 0x1CFE42: printf (in /lib/libc-2.5.so)
==27312==    by 0x8049AB0: AnswerClientThread(void*) (DeviceRegistServer.cpp:1164)
==27312==    by 0x30449A: start_thread (in /lib/libpthread-2.5.so)
==27312==    by 0x25B42D: clone (in /lib/libc-2.5.so)
==27312==
==27312== ERROR SUMMARY: 999 errors from 1 contexts (suppressed: 27 from 1)
==27312== malloc/free: in use at exit: 0 bytes in 0 blocks.
==27312== malloc/free: 1,000 allocs, 1,000 frees, 6,393,744 bytes allocated.
==27312== For counts of detected errors, rerun with: -v
==27312== All heap blocks were freed -- no leaks are possible.



這個(gè)是我抓的多線程沖突的問(wèn)題。

我用單線程,就搞定了。

我現(xiàn)在也在找問(wèn)題。

線程內(nèi)存沒(méi)有釋放干凈。

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP