C++ GDB回溯跟踪未显示正确信息

C++ GDB回溯跟踪未显示正确信息,c++,debugging,gdb,C++,Debugging,Gdb,我正在学习如何在我的mac上调试gdb,在找到一个分段错误后,我想用它来学习。 我使用的gdb 8.0.1和gcc 7.2.0都是自制的,我使用-ggdb编译,并通过gdb-ex run./main从我的makefile直接运行gdb 我打开游戏,打开里面的菜单,当我试图关闭它时,它崩溃了,因为我在WindowsObject.cpp: WindowObject_CraftingGrid::~WindowObject_CraftingGrid(){ for (unsigned i = 0;

我正在学习如何在我的mac上调试gdb,在找到一个分段错误后,我想用它来学习。 我使用的gdb 8.0.1和gcc 7.2.0都是自制的,我使用-ggdb编译,并通过
gdb-ex run./main从我的makefile直接运行gdb

我打开游戏,打开里面的菜单,当我试图关闭它时,它崩溃了,因为我在
WindowsObject.cpp

WindowObject_CraftingGrid::~WindowObject_CraftingGrid(){
   for (unsigned i = 0; i < gridSlots_.size(); i++) {
      for (unsigned j = 0; j < gridSlots_[0].size(); i++) { //i++ instead of j++, this leads to the crash
         delete gridSlots_[i][j];
      }
   }
}
这是完全错误的,因为它没有指向正确的对象和线,所以解决错误没有任何用处

我在windows计算机上的visual studio中发现了此错误,因为那里的调用堆栈非常清楚:

project.exe!std::vector<std::vector>WindowObjects_Slot * //Other stuff
project.exe!WindowObject_CraftingGrid::~WindowObject_CraftingGrid() Line 348
project.exe!WindowMain::~WindowMain() Line 234
project.exe!KeyPressed(int KeyCode) Line 566
project.exe!gameloop() Line 181
project.exe!main(int argc, char ** argv) Line 321)
project.exe!std::vectorWindowObjects\u Slot*//其他内容
project.exe!WindowObject_CraftingGrid::~WindowObject_CraftingGrid()第348行
project.exe!WindowMain::~WindowMain()行234
project.exe!按键(int KeyCode)第566行
project.exe!gameloop()第181行
project.exe!主(内部argc,字符**argv)行321)
这是完全错误的

不,它不是:这是您的应用程序在这个平台上实际崩溃的地方

因为这对解决bug没有任何帮助

您有一个堆损坏错误。堆损坏bug是这样的:您的应用程序可能会在堆损坏后的任意位置崩溃

此外,堆栈跟踪并非无用:它告诉您
this==0x3000000000
,这不是
this
的合理值,因此您看到的是某种堆损坏

调试类似问题的方法有很多:,其中包括


使用
-D_GLIBCXX_DEBUG构建
在GCC
STL
中启用,并且可能会直接指向错误。

我怀疑MSVC为调试构建插入了
std::vector
,因此它通过抛出异常而提前失败。也许使用gdb调试的实例没有使用相同的陷阱编译?请共享构建第一个实例时使用的命令行。segfaults通常比实际导致它们的任何问题都要晚很多。为指针指定无效值不会使程序崩溃,即使它是实际的bug;取消对指针的引用会导致崩溃,但它可以在以后任意发生。对不起,我不知道“相同的陷阱”是什么意思。。。无论如何,这两台机器之间的代码是完全相同的,但在windows上我使用visualstudio,在mac上我使用terminal+makefile+gcc+gdb来构建,所以我猜这两个版本的可执行文件之间有些不同,但主要的问题是为什么gdb backtrace会吐出如此奇怪的信息……我怀疑@rex意味着调试模式下的Windows
vector
代码会检查是否发生了无效的事情。GCC版本显然没有,因为您使用了编译标志,所以它们稍后会发现这个问题。makefile中调用GCC的行是什么?这是mac
GCC-7-Wall-ggdb-std=c++11-D_GLIBCXX_USE_CXX11_ABI=0-c-o obj/Block.o src/Block.cpp | |***其他.cpp文件编译***GCC-7-o main***所有.o文件***pkg config--cflags--libs***所有allegro libs***-I/usr/local/Boost/Builded/include//usr/local/Boost/Builded/lib/libboost_serialization-libstdc++.a/usr/local/Boost/Builded/libboost_filesystem-libstdc++.a/usr/local/Boost/Builded/libboost_system-libstdc++.a/usr/local/ceral/gcc/7.0/libstdc++.a
project.exe!std::vector<std::vector>WindowObjects_Slot * //Other stuff
project.exe!WindowObject_CraftingGrid::~WindowObject_CraftingGrid() Line 348
project.exe!WindowMain::~WindowMain() Line 234
project.exe!KeyPressed(int KeyCode) Line 566
project.exe!gameloop() Line 181
project.exe!main(int argc, char ** argv) Line 321)