有没有一种方法可以使用gdb检查分段故障发生在哪里



当我运行对象测试文件时,我遇到了分段错误,所以我使用gdb来查找错误所在。然而,当我做gdb(我的对象文件(时,我使用next遍历了文件,但其中没有任何错误。我有点困惑,有没有一个好的方法可以找到分段错误发生在哪里?提前谢谢。

这就是我在gdb:中所做的

(gdb) n
44        if (argc > 1) {
(gdb) n
45          tctest_testname_to_execute = argv[1];
(gdb) n
48        TEST(testGetWidth);
(gdb) n
49        TEST(testGetHeight);
(gdb) n
50        TEST(testGetTile);
(gdb) n
52        TEST_FINI();
(gdb) n
All tests passed!

这是我运行目标文件时遇到的错误:

segmentation fault
segmentation fault
segmentation fault
3 test(s) failed

(编辑(嗨,很抱歉更新太晚了,我试着在我的一端调试它,但我仍然没有运气。我正在尝试创建一个迷宫类,它可以读取具有迷宫描述的输入流并返回迷宫。然而,当我用这个给定的输入流运行测试时:

20 10
####################
#................<.#
#..................#
#...###............#
#.....#............#
#.....#............#
#...###............#
#..................#
#..................#
####################

它给出了一个分段错误,我在valgrind上运行对象文件来检查发生了什么:

Invalid write of size 8
==2482545==    at 0x4032CD: Maze::setTile(Position const&, Tile*) (maze.cpp:47)
==2482545==    by 0x40347B: Maze::read(std::istream&) (maze.cpp:67)
.....
==2482545==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

我真的不明白为什么在我的代码中存在分段错误或无效写入,我应该在setTile函数中为每个tile分配空间,所以应该有空间供我写入。我还将tile_collection与构造函数堆叠在一起,因此当我调用Maze(20,10(时,tile_collective应该被初始化,并且setTile内部的大小调整应该可以工作。你能指出我遗漏了什么吗?提前谢谢。这是我的头文件,它排除了函数声明:

class Maze {
private:
// TODO: add fields
int Width;
int Height;
std::vector<Tile*> tile_collection;

这是我的cpp文件:

Maze::Maze(int width,int height):
Width(width),Height(height){
tile_collection[(height)*(width-1)];
}

void Maze::setTile(const Position &pos,Tile *tile){
tile_collection.resize(pos.getX()+pos.getY()*Width);
tile_collection[pos.getX()+pos.getY()*(Width)]=tile;
}

Maze *Maze::read(std::istream &in){
int x;int y;char c;
if ((in>>x)&&(in>>y)){
Maze *new_maze=new Maze(x,y);
//loop over the specified maze dimension
for (int i=0;i<y;i++){
for (int j=0;j<x;j++){
if (in>>c){
//using tilefactory to change character into a tile
TileFactory *fac=fac->getInstance();
Tile* temp=fac->createFromChar(c);
//if createFromChar fails, return nullptr, otherwise set tile at position j,i
if (temp==nullptr){
return nullptr;
}
else{
new_maze->setTile(Position(j,i),temp);
}
}
}
}
return new_maze;
}
else{
return nullptr;
}
}

在Linux上,出现分段故障(请参阅信号(7(…(可以产生堆芯转储。参见核心(5(。您可能需要启用它们(例如,在您的终端中内置一些适当的ulimit,请参阅shell完成的setrlimit(2((。

gdb调试器能够分析死后这样的core文件。

当然,使用g++ -Wall -Wextra -g编译您的C++代码

这里有一个使用gdb和可逆调试跟踪Seg故障的好方法

相关内容

  • 没有找到相关文章

最新更新