GDB 回溯没有显示正确的信息

elk*_*iwy 4 c++ debugging gdb

我正在学习如何在我的 mac 上使用 gdb 进行调试,在发现分段错误后,我想用它来学习。我正在使用自制软件中的 gdb 8.0.1 和 gcc 7.2.0,我正在使用 -ggdb 进行编译并直接从我的 makefile 通过gdb -ex run ./main.

我打开游戏,在里面打开一个菜单,当我尝试关闭它时它崩溃了,因为我在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];
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

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 ?? ()
Run Code Online (Sandbox Code Playgroud)

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

我从 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)
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 5

这是完全错误的

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

因为它导致没有任何有用的东西可以解决这个错误

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

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

有很多方法可以调试类似的问题:debugmallocAddress SanitizerValgrind其中。

Build with在 GCC 中-D_GLIBCXX_DEBUG启用调试模式STL,并且可能还会直接指向错误。