[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Продавленный стек



Здравствуйте, сообщество. Я понимаю, что это, возможно, не самое
правильное место для вопроса по программированию, но мне достоверно
известно, что здесь сидят более-менее грамотные люди, которые мне
действительно могут помочь. И других таких мест мне, увы, знать не
довелось.

Я пишу программу на C++ (использую только подмножество синтаксиса языка
С99 плюс перегрузку операторов - никаких классов/объектов/потоков).

Суть программы сводится к следующему: она берёт "сетку", модифицирует
все её значения (шагает), после чего проделывает с полученной сеткой
аналогичные операции. И так до тех пор, пока не достигнет какого-нибудь
результата.

Так вот, я обнаружил, что умудряюсь, похоже, продавить стек.
После примерно 20 тысяч шагов программа выдаёт SegFault и
завершается. Я посмотрел в gdb бэктрейс и увидел там over20000 фреймов.

Собственно, хочется, чтобы кто-то посмотрел и по возможности помог
советом: вот отсюда[1] можно скачать архив с последней версией.

Собирать надо одним из следующих образов:
1) make test-shock1
2) make test-shock2a
3) make test-shock2b

В чём суть:

В бэктрейсе множественные вызовы функции make_step, которая вызывается
из маршевой функции на каждой итерации.

Вот так это примерно происходит:
----------------------------------------
void
march (Grid1D grid)
{
  <...>
  Grid1D newgrid = make_step(grid, tau);
  march(newgrid);
};
----------------------------------------

А вот как определена сама функция:
----------------------------------------
Grid1D
make_step(Grid1D grid, double tau)
{
  Grid1D newgrid = grid_skel(grid);
  newgrid.iter += 1;
  newgrid.time += tau;

  double h = grid.h;
  double N = grid.N;

  ConservVars lf;
  ConservVars rf = count_left_flux(grid,0,tau);
  for (unsigned int i=0; i<N; i++)
    {
      lf = rf;
      if (i != N-1)
	rf = count_left_flux(grid,i+1,tau);
      newgrid.cells[i].vars = grid.cells[i].vars - tau*(rf-lf)/h;
    };
  free(grid.cells);
  return newgrid;
 };
----------------------------------------

Никак не пойму, что ж с ней не так-то: функция была вызвана, отработала,
вернула результат. Значит кадр в стеке ей вроде бы уже не нужен. Но он
остаётся. Почему?

[1] http://git.freehck.ru/cfrolov.git/

Attachment: pgp5KIGhnqRaG.pgp
Description: PGP signature


Reply to: