use*_*177 3 c++ gdb segmentation-fault
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
Run Code Online (Sandbox Code Playgroud)
您好,我正在编写一个类的游戏,我遇到了一个段错误.检查器块保持在二维阵列中,因此对于阵列,违规位似乎是无效的x/y.移动作为字符串传递,它们被转换为整数,因此x和y在某种程度上是ASCII NULL.我注意到在函数调用make_move中它表示move = ...
为什么说move = ...?还有,解决段错误的任何其他快速提示?我是GDB的新手.
基本上,回溯是导致崩溃的调用的痕迹.在这种情况下:
game::play调用game::make_computer_move哪个调用Checkers::make_move哪个调用Space::setPosition哪个在文件中的第44行崩溃了space.h.
纵观这回溯,它看起来像你通过-65,并-49以Space::setPosition,而如果他们碰巧是无效的坐标(看起来确实可疑我是消极和所有).然后你应该查看调用函数,看看他们为什么拥有他们所做的值并纠正它们.
我建议assert在代码中自由地使用强制执行合同,几乎任何时候你可以说"这个参数或变量应该只有满足某些条件的值",那么你应该断言它就是这种情况.
一个常见的例子是,如果我有一个函数,它接受一个不允许的指针(或更可能是智能指针)NULL.我将拥有该功能的第一行assert(p);.如果NULL指针通过,我马上知道并且可以调查.
最后,在崩溃时在gdb中运行应用程序.键入up以检查调用堆栈帧并查看变量的外观:(通常可以print x在控制台中编写内容).同样,down如果你需要,也会向下移动调用堆栈.
至于SEGFAULT,我建议在valgrind中运行应用程序.如果使用调试信息进行编译-g,那么它通常可以告诉您导致错误的代码行(甚至可以捕获出于不幸原因不会立即崩溃的错误).