【发布时间】:2012-04-11 13:31:12
【问题描述】:
我有一个应用程序,我正在分析这个软件的内存故障转储。
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
我不明白这个值是如何被覆盖的?我在这里没有看到任何堆栈溢出问题,谁能解释这次崩溃的原因?
此问题反复出现 - 两天一次,这是一个 24/7/365 工作的服务器。
在 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");
}
【问题讨论】:
-
GPSC包含什么?它是什么类型的结构? -
GPSC 的通常尺寸是多少?这个问题是重复出现的,还是一次性的?
-
可能溢出? vector.size() 在您使用有符号整数时返回一个无符号数。
-
一种随机的可能性是
gps_write_fds的大小错误,结果i被FD_SET破坏了? -
好主意 - Svisstack,你能在
for循环之前显示更多代码吗?具体而言,正如欧内斯特所建议的那样,gps_write_fds变量。
标签: c++ crash crash-reports crash-dumps