我正在学习如何在我的 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)
这是完全错误的
不,它不是:这是您的应用程序在此平台上实际崩溃的地方。
因为它导致没有任何有用的东西可以解决这个错误
你有一个堆损坏错误。堆损坏错误是这样的:您的应用程序可能会在堆损坏后的某个时间在任意位置崩溃。
此外,堆栈跟踪并非无用:它告诉您this == 0x300000000,这不是 的合理值this,因此您正在查看某种堆损坏。
有很多方法可以调试类似的问题:debugmalloc,Address Sanitizer和Valgrind其中。
Build with在 GCC 中-D_GLIBCXX_DEBUG启用调试模式STL,并且可能还会直接指向错误。
| 归档时间: |
|
| 查看次数: |
1269 次 |
| 最近记录: |