C++ 奇怪的崩溃,在gdb中分析

C++ 奇怪的崩溃,在gdb中分析,c++,crash,crash-reports,crash-dumps,C++,Crash,Crash Reports,Crash Dumps,我有一个应用程序,我正在分析这个软件的内存崩溃转储 struct GPS_CONNECTION { int sockfd; std::string sendbuf, recvbuf; struct sockaddr_in remoteaddr; }; vector <GPS_CONNECTION> GPSC; -------------------------------- (cut) -------------------------------- fd

我有一个应用程序,我正在分析这个软件的内存崩溃转储

struct GPS_CONNECTION
{
    int sockfd;
    std::string sendbuf, recvbuf;
    struct sockaddr_in remoteaddr;
};
vector <GPS_CONNECTION> GPSC;

--------------------------------
(cut)
--------------------------------

fd_set master, gps_master, read_fds, gps_read_fds, write_fds, gps_write_fds;

for (;;)
{
    /* Clear */
    FD_ZERO(&gps_read_fds);
    FD_ZERO(&gps_write_fds);

    /* read_fds */
    gps_read_fds = gps_master;

    /* write_fds */
    for (int i=0; i < GPSC.size(); i++)
    {
        if (GPSC[i].sendbuf.empty())
        {
            continue;
        }
        FD_SET(GPSC[i].sockfd, &gps_write_fds);
    }

    /* Timeout struct */
    tv.tv_sec = 0;
    tv.tv_usec = 0;

    /* selectuj write */
    if (select(gps_fdmax+1, &gps_read_fds, &gps_write_fds, NULL, &tv) == -1)
    {
        perror("select");
        return 7;
    }

    --------------------------------
    (cut)
    --------------------------------
}
当我分析变量时,我看到:

(gdb) print i
$1 = -1214807923
我不明白这个值是怎么被覆盖的?我在这里没有看到任何堆栈溢出问题,有人能解释这次崩溃的原因吗

此问题似乎反复出现-这是一台服务器,每两天工作一次,可全天候工作


在g++扩展此代码后,结果如下:

 for (int i=0; i < GPSC.size(); i++)
 {
     if (GPSC[i].sendbuf.empty())
     {
         continue;
     }
     __asm__ __volatile__ ("btsl %1,%0" : "=m" (((&gps_write_fds)->fds_bits)[((GPSC[i].sockfd) / (8 * sizeof (__fd_mask)))]) : "r" (((int) (GPSC[i].sockfd)) % (8 * sizeof (__fd_mask))) : "cc","memory");
 }
for(int i=0;ifds_位)[(GPSC[i].sockfd)/(8*sizeof(uuu fd_掩码))]:“r”((int)(GPSC[i].sockfd))%(8*sizeof(u fd掩码)):“cc”,“memory”);
}

从您共享的小代码片段中,很难说到底是什么问题


<> >我只能怀疑,<代码> gpSC.siz()>代码>的结果要比< <代码> int >代码>大,因此在多次迭代后会导致<代码> i>代码>溢出。

代码会因为多线程而崩溃,这是我以前不会考虑的,我认为它只在一个线程中工作。我的错误。

GPSC包含什么?它是什么类型的结构?GPSC的通常大小是多少?这个问题是反复出现还是只出现一次?可能是溢出?vector.size()在使用有符号整数时返回一个无符号整数。一种随机的可能性是
gps\U write\U fds
的大小不正确,因此
i
FD\u集
击杀?好主意-Svisstack,你能在
循环之前显示更多的代码吗?正如Ernest所建议的,
gps\u write\u fds
变量。在此向量中放置一个连接,在for debug中建议使用此向量,因为在调试时可能会出现第二个连接。@Svisstack“可能会出现第二个连接”-这建议使用线程。如果另一个线程可以修改
GPSC
,那么您必须保护对它的所有访问。@JamesKanze:这是一个线程循环,我想,但只有一个线程在工作这是一个主进程,所有套接字通信代码都使用select和非阻塞用法放置在该线程中,当下一个连接出现时,选择连接被创建并放置在此向量上。这不可能在同一时间使用同一线程执行此代码。
 for (int i=0; i < GPSC.size(); i++)
 {
     if (GPSC[i].sendbuf.empty())
     {
         continue;
     }
     __asm__ __volatile__ ("btsl %1,%0" : "=m" (((&gps_write_fds)->fds_bits)[((GPSC[i].sockfd) / (8 * sizeof (__fd_mask)))]) : "r" (((int) (GPSC[i].sockfd)) % (8 * sizeof (__fd_mask))) : "cc","memory");
 }