C++ 如何解释GDB回溯?

C++ 如何解释GDB回溯?,c++,gdb,segmentation-fault,C++,Gdb,Segmentation Fault,您好,我正在为一个类编写一个游戏,我遇到了一个错误。棋盘格块保存在二维数组中,因此有问题的位对于数组来说似乎是无效的x/y。移动作为字符串传递,字符串被转换为整数,因此对于x和y,不知何故为ASCII NULL。我注意到在函数调用make_move中,它表示move= 为什么说move=。。。?另外,还有其他解决segfault的快速技巧吗?我对GDB有点陌生。基本上,回溯是对导致崩溃的调用的跟踪。在这种情况下: game::play调用game::make_computer\u move哪个调

您好,我正在为一个类编写一个游戏,我遇到了一个错误。棋盘格块保存在二维数组中,因此有问题的位对于数组来说似乎是无效的x/y。移动作为字符串传递,字符串被转换为整数,因此对于x和y,不知何故为ASCII NULL。我注意到在函数调用make_move中,它表示move=


为什么说move=。。。?另外,还有其他解决segfault的快速技巧吗?我对GDB有点陌生。

基本上,回溯是对导致崩溃的调用的跟踪。在这种情况下:

game::play
调用
game::make_computer\u move
哪个调用了
Checkers::make_move
哪个调用了
Space::setPosition
哪个崩溃在文件
Space.h
的第44行

看看这个回溯,看起来您将
-65
-49
传递给了
Space::setPosition
,如果它们恰好是无效的坐标(我肯定怀疑它们是负数)。然后,您应该查看调用函数,了解它们为什么具有它们所做的值,并更正它们

我建议在代码中自由地使用
assert
来强制执行契约,几乎任何时候都可以说“这个参数或变量应该只有满足特定标准的值”,然后你应该断言情况就是这样

一个常见的例子是,如果我有一个函数,它接受一个不允许为
NULL
的指针(或者更可能是智能指针)。我将得到函数的第一行
assert(p)。如果传递了
NULL
指针,我会立即知道,并可以进行调查

最后,当应用程序崩溃时,在gdb中运行该应用程序。键入
up
检查调用堆栈帧并查看变量的外观:(通常可以在控制台中编写
print x
之类的内容)。同样地,
down
也将在需要时向下移动调用堆栈


至于
SEGFAULT
,我建议在中运行应用程序。如果您使用调试信息编译
-g
,那么它通常可以告诉您导致错误的代码行(甚至可以捕获由于不幸原因不会立即崩溃的错误)。

我不允许评论,但是,我只是想回答最近在这个问题上寻找变量(-65,-49)的人。如果你得到一个SEGFULT,你可以得到一个堆芯转储。是确保您可以设置gdb以获得核心转储的非常好的源代码。然后,您可以使用gdb打开您的核心文件:

0x004069f1 in Space::setPosition (this=0x77733cee, x=-65, y=-49) at space.h:44    
0x00402679 in Checkers::make_move (this=0x28cbb8, move=...) at checkers.cc:351
0x00403fd2 in main_savitch_14::game::make_computer_move (this=0x28cbb8) at game.cc:153
0x00403b70 in main_savitch_14::game::play (this=0x28cbb8) at game.cc:33
0x004015fb in _fu0___ZSt4cout () at checkers.cc:96
0x004042a7 in main () at main.cc:34
然后,在您想要单步执行的函数调用上设置断点:

gdb -c myCoreFile
然后通过下一步或下一步操作代码行:

b MyClass::myFunctionCall

当您在代码中的某个位置想要计算变量时,可以打印该变量:

next
也可以打印所有参数:

p myVariable 

我希望这有助于其他人寻找调试

对于初学者,您应该使用类似于
std::vector
的东西,当超出边界时(如果您使用
at()
),它将抛出一个容易看到的异常(否则将使您无法管理内存)。其次,你应该能够在x和y上设置一个变量表,看看它们是如何变化的,如果真的是这样的话,那么你可以查看它们何时变为无效。现在唯一的问题是发现它们何时变为(-65,-49)。这就是可变表的好处。是的,这似乎是问题所在。我不知道他们在哪里或者如何变成-65,-49,但我想我能做的就是继续寻找。
p myVariable 
info args