繁体   English   中英

奇怪的崩溃,在gdb中进行分析

[英]Strange crash, analyzing in gdb

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

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故障转储说软件崩溃了:

443                 if (GPSC[i].sendbuf.empty())

当我分析变量时,我看到了:

(gdb) print i
$1 = -1214807923

我不明白该值是如何被覆盖的? 我在这里没有看到任何堆栈溢出问题,有人可以解释此崩溃的原因吗?

该问题似乎反复出现-每2天一次,这台服务器工作24/7/365。


在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");
 }

从您共享的小代码片段中,很难说出问题的实质。

我只能怀疑GPSC.size()的结果大于int可以存储的结果,因此在某些迭代后会导致i溢出。

由于我之前不会考虑的多线程,代码将崩溃,我认为这仅在一个线程中起作用,这是我的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM