2012-04-11 8 views
2

Ich habe eine Anwendung und ich analysiere Speicherabsturzdumps dieser Software.Seltsamer Absturz, Analyse 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 Crash-Dump sagt Software in Zeile abgestürzt ist:

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

Wenn ich die Variablen analysierte ich das sah:

(gdb) print i 
$1 = -1214807923 

Ich verstehe nicht, wie dieser Wert war überschrieben? Ich sehe hier keinen Stapelüberlauf, kann jemand den Grund für diesen Absturz erklären?

Dieses Problem scheint wiederkehrend - einmal in 2 Tagen ist dies ein Server, der 24/7/365 arbeitet.


Nach g ++ diesen Code erweitert, die sich ergibt:

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

Was beinhaltet 'GPSC'? Welche Art von Struktur ist das? – Nick

+0

@Nick: aktualisiert; – Svisstack

+1

Was ist die übliche Größe von GPSC? Tritt dieses Problem wiederholt oder nur einmal auf? –

Antwort

0

Code wird wegen Multithreading abstürzen, die ich vorher nicht in Betracht ziehen werde, ich denke, das funktioniert nur in einem Thread, mein Fehler.

1

Vom kleinen Code-Schnipsel Ihnen geteilt, ist es schwer zu sagen, was das Problem wirklich ist.

Ich kann nur vermuten, dass das Ergebnis der GPSC.size() ist größer als das, was ein int speichern kann, also einen Überlauf auf i nach einiger Iterationen zu verursachen.

+0

In diesem Vektor sind eine Verbindung platziert, für Debug debuggt dies sind Vektor, da beim Debuggen einige zweite Verbindung auftreten kann. – Svisstack

+0

@Svisstack "Eine zweite Verbindung kann erscheinen" - das deutet auf Threads hin. Wenn ein anderer Thread "GPSC" ändern kann, müssen Sie alle Zugriffe darauf schützen. –

+0

@JamesKanze: Dies ist eine Thread-Schleife, ich denke darüber, aber nur ein Thread arbeitet dies ist ein Hauptprozess, alle Socket-Kommunikationscode wird in diesem Thread mit Auswahl mit nicht blockierende Verwendung, wenn die nächste Verbindung erschien dann auf ausgewählte Verbindung platziert wurde erstellt und auf diesen Vektor gesetzt. Dies ist nicht möglich, um diesen Code mit demselben Thread gleichzeitig auszuführen. – Svisstack