2012-04-11 19 views
2

私はアプリケーションを持っており、このソフトウェアのメモリクラッシュダンプを解析しています。gdbで異常なクラッシュが発生する

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

私はこれを見た変数を分析した:この値がいかに

(gdb) print i 
$1 = -1214807923 

私は理解していない

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のクラッシュダンプは、ソフトウェアがラインに墜落していると言います上書きされますか?私はスタックオーバーフローの問題はここに表示されない、誰もこのクラッシュの理由を説明することはできますか?

この問題は、2日に1回、24時間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

@ニック:更新; – Svisstack

+1

GPSCの通常のサイズは?この問題は定期的に発生するのですか? –

答えて

0

マルチスレッドのためにコードがクラッシュする可能性があります。これは以前は考えていなかったことですが、1つのスレッドでしか動作していないと思います。

1

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

私だけGPSC.size()の結果は、inti後にいくつかのの反復にオーバーフローを引き起こし、したがって、保存することができるものよりも大きいことを疑うことができます。

+0

このベクトルでは、1つの接続がデバッグ用に配置されています。これは、デバッグ中にいくつかの2番目の接続が表示される可能性があるためです。 – Svisstack

+0

@Svisstack「2番目の接続が表示されることがあります」---これはスレッドを示唆しています。別のスレッドが 'GPSC 'を変更できる場合は、そのスレッドへのすべてのアクセスを保護する必要があります。 –

+0

@JamesKanze:これは1つのスレッドループですが、私はそれについて考えていますが、これを処理するスレッドはメインプロセスであり、すべてのソケット通信コードはselectブロックを使用してこのスレッドに配置されます。このベクター上に作成され配置された。同じ時間に同じスレッドでこのコードを実行することはできません。 – Svisstack

関連する問題