返回时意外的coredump

时间:2017-09-28 06:33:12

标签: c++ gdb

我在第157行获得了一个coredump:

123 template <typename T>
124 int X_Queue<T>::pop(T &item, unsigned int timeout)
125 {
126     int nRet = 0;
127 
128     Thread_Mutex_Guard guard(_mutex);
129 
130     if(_lst_item.empty())
131     {
132         nRet = _cond.timed_wait(timeout);
133         if(nRet == ETIMEDOUT)
134         {
135             //printf("cond timed_wait timeout!\n");
136             return nRet;
137         }
138 
139         if(nRet != 0)
140         {
141             //printf("cond timed_wait failed.\n");
142             return nRet;
143         }
144     }
145 
146     if(!_lst_item.empty())
147     {
148         item = _lst_item.front();
149         _lst_item.pop_front();
150     }
151     else
152     {
153         nRet = -1;
154         //printf("no item is pop.\n");
155     }
156 
157     return nRet;
158 
159 }

当我使用gdb查看详细信息时,我发现nRet为110(ETIMEDOUT)。

如果第一个if进入并且nRet不为零,则该函数应该返回。否则,nRet只能是0或-1。

这怎么可能发生?

1 个答案:

答案 0 :(得分:1)

从函数返回时崩溃通常是由堆栈损坏引起的。

在代码中的某处可能存在未初始化的指针,超出对数据结构的访问范围等。我没有看到足够的程序知道下面发生了什么;你必须调试它。

您可以使用某种边界检查程序(如valgrind)或代码部分,来磨练导致问题的代码区域。 (对于这类问题,这不是一个完美的方法,因为当您更改代码时,内存切换可能发生在不同的地方,显示不同(或没有)的症状。

如果此函数中运行的代码(通过函数调用等)不大,则检查代码是否存在可能的内存中断可能足以解决问题。

或者,正如Basile Starynkevitch在评论中指出的那样,C ++中的函数返回比它看起来更复杂。崩溃可能在析构函数中,在函数返回期间调用,因为局部变量超出了范围。