我正在学习如何在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];
      }
   }
}

Gdb说:
(gdb) bt
#0  0x0000000100023a80 in WindowObject_Image::Draw (this=0x300000000) at src/WindowObjects.cpp:620
#1  0x0000000100023ae2 in WindowObject_Image::setImage (this=0x100a9e980, img=0x0) at src/WindowObjects.cpp:629
#2  0x000000010001d5f7 in WindowMain::AddSection (this=0x100a04ce0, n=28672) at src/Window.cpp:263
#3  0x0000000100033765 in LoadLibrary () at src/main.cpp:781
#4  0x0000000100030b25 in DrawGUI () at src/main.cpp:465
#5  0x0000000100031534 in DrawGUI () at src/main.cpp:501
#6  0x00000001006eae27 in ?? ()
#7  0x0000700001875ef0 in ?? ()
#8  0x00007fff40b796d8 in ?? ()
#9  0x0000000000000000 in ?? ()

这是完全错误的,因为它没有指向正确的对象和线条,因此对解决该错误没有任何帮助。

我在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)

最佳答案



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



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

另外,堆栈跟踪不是没有用的:它告诉您this == 0x300000000,对于this来说不是一个合理的值,因此您正在查看某种堆损坏。

有很多方法可以调试类似的问题:debug malloc Address SanitizerValgrind

使用-D_GLIBCXX_DEBUG进行构建会在GCC的STL中启用debugging mode,并且很可能会直接指出该错误。

07-24 09:46
查看更多