2012-04-11 2 views
2

У меня есть приложение, и я анализирую свалки памяти этого программного обеспечения.Странный сбой, анализируя в 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.


После г ++ расширяет этот код, который приводит:

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

Что содержит 'GPSC'? Что это за структура? – Nick

+0

@Nick: обновлено; – Svisstack

+1

Каков обычный размер GPSC? Является ли эта проблема повторяющейся или разовой? –

ответ

0

Код будет разбиваться из-за многопоточности, что я не буду рассматривать раньше, я думаю, что работает только в одном потоке, моя ошибка.

1

С небольшой фрагмент кода, общий, это трудно сказать, что проблема на самом деле.

Я могу только подозревать, что результат GPSC.size() больше, чем какая int может хранить, поэтому вызывает переполнение на i после некоторых итераций.

+0

В этом векторе размещено одно соединение, для отладки это вектор, потому что при отладке может появиться некоторое второе соединение. – Svisstack

+0

@Svisstack «Может появиться некоторое второе соединение» --- это указывает на потоки. Если другой поток может изменить «GPSC», вам придется защищать все обращения к нему. –

+0

@JamesKanze: Это один цикл потока, я думаю об этом, но только один поток, который работает, является основным процессом, весь код связи сокета помещается в этот поток, используя select с неблокирующим использованием, когда было показано следующее соединение при выборе соединения был создан и помещен на этот вектор. Это невозможно сделать с тем же потоком в одно и то же время. – Svisstack