Есть ли способ проверить, где произошла ошибка сегментации с использованием GDB? - PullRequest
0 голосов
/ 28 апреля 2020

Когда я запускаю файл объектного теста, у меня возникает ошибка сегментации, поэтому я использую 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

(edit) Привет, извините за последнее обновление, я попытался отладить его на своем конце, но мне все еще не повезло. Я пытаюсь создать класс лабиринта, который может прочитать входной поток, который имеет описание лабиринта и вернуть лабиринт. Однако, когда я запускаю тест с этим заданным входным потоком:

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_collection с моим конструктором, поэтому tile_collection должен быть инициализирован, когда я вызвал Maze (20,10), и изменение размера внутри 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;
  }
}


Ответы [ 2 ]

0 голосов
/ 01 мая 2020
0 голосов
/ 28 апреля 2020

При Linux, ошибка сегментации (см. сигнал (7) ...) может привести к дампу ядра . См. core (5) . Вам может потребоваться включить их (например, с помощью некоторого соответствующего ulimit встроенного в ваш терминал, см. setrlimit (2) , выполненный вашей оболочкой).

Отладчик gdb способен анализировать такие файлы core после смерти.

Конечно, скомпилируйте ваш код C ++ с помощью g++ -Wall -Wextra -g

...