我在第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。
这怎么可能发生?
答案 0 :(得分:1)
从函数返回时崩溃通常是由堆栈损坏引起的。
在代码中的某处可能存在未初始化的指针,超出对数据结构的访问范围等。我没有看到足够的程序知道下面发生了什么;你必须调试它。
您可以使用某种边界检查程序(如valgrind)或代码部分,来磨练导致问题的代码区域。 (对于这类问题,这不是一个完美的方法,因为当您更改代码时,内存切换可能发生在不同的地方,显示不同(或没有)的症状。
如果此函数中运行的代码(通过函数调用等)不大,则检查代码是否存在可能的内存中断可能足以解决问题。
或者,正如Basile Starynkevitch在评论中指出的那样,C ++中的函数返回比它看起来更复杂。崩溃可能在析构函数中,在函数返回期间调用,因为局部变量超出了范围。