std::堆栈<T>在 Eclipse 中调试时导致段错误

std::stack<T> causing segfaults while debugging in eclipse

本文关键字:段错误 错误 Eclipse lt 堆栈 gt std 调试      更新时间:2023-10-16

所以我在最后一天左右一直在与 std::stack 库作斗争。我正在尝试调试我的一些代码,而不是用笔和纸做事,我正在使用 eclipse 调试器。

第一个奇怪的事情是,如果我在 eclipse 表达式窗口中有一个与堆栈相关的表达式,程序将在我启动它后立即死亡。

另一件事是,第一次运行时,调试器看到堆栈很好。我可以通过表达式窗口检查其元素。但是一旦我将某些内容推送到堆栈上,stack.top() 方法就开始在表达式窗口中返回错误。然后,如果我尝试步进程序,它就会死。这不是在没有调试器的情况下运行时的行为,所以我在这里真的很不知所措。

这是问题代码:

我需要做的就是点击步进,Eclipse 从 stl_deque.h 文件打开一个窗口,然后我按步返回键,它就死了。

int main() {
    std::stack<Cell> path;
    return 0;
}

你的代码很好(至少,你向我们展示的代码部分)。您所描述的问题只是当您尝试评估 Eclipse 调试器中的stack.top()时崩溃。这是 Eclipse 中的一个错误(特别是它内置的检查C++容器类型的支持),这不是你自己可以轻松修复的。

一种可能的解决方法是将调试函数添加到您自己的代码中;例如

const Cell *stackTop(const std::stack<Cell> *stk)
{ return &stk->top(); }

然后,每当你想要在调试会话中获取stack.top()时,请改为键入*stackTop(&stack)。请注意,stackTop的这个定义避免了处理模板、内联、引用移动语义——所有这些都是我希望普通调试器遇到麻烦的事情——相反,它只是一个非模板化函数,它接受一个指针并返回一个指针。需要一个非常愚蠢的调试器才能被这个简单的函数弄糊涂。

如果Eclipse可以成功地检查std::vector<Cell>而不会崩溃,那么你可以考虑重写代码以使用vector而不是stack;无论如何,这可能会更有效率。