私はアプリケーションを持っており、このソフトウェアのメモリクラッシュダンプを解析しています。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");
}
「GPSC」には何が含まれていますか?どんなタイプの構造ですか? – Nick
@ニック:更新; – Svisstack
GPSCの通常のサイズは?この問題は定期的に発生するのですか? –