2

私はアプリケーションを持っていて、このソフトウェアのメモリクラッシュダンプを分析しています。

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日に1回、これは24時間年中無休で稼働しているサーバーです。


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

2 に答える 2

1

あなたが共有した小さなコードスニペットから、問題が実際に何であるかを言うのは難しいです。

の結果がcanが格納できるGPSC.size()ものよりも大きいため、何度繰り返した後にオーバーフローが発生するのではないかと疑うことしかできません。inti

于 2012-04-11T13:36:48.367 に答える
0

以前は考慮しなかったマルチスレッドが原因でコードがクラッシュします。これは1つのスレッドでのみ機能していると思いますが、私の間違いです。

于 2012-06-14T22:48:00.907 に答える