LINUX.ORG.RU

История изменений

Исправление Kroz, (текущая версия) :

Это интересно - расскажи.

Рассказываю логику. К коду не придирайся.

Объект-локальная переменная в функции уничтожается при выходе из функции. Соответственно, первое действие функции - создание объекта:

void function1()
{
CDebug log("function1");
...
}

В классе CDebug в конструктора пишем что-то типа:

class CDebug{
public:
  static ??? container;
  string function;

  CDebug(string fn){
    CDebug::container << string("Entering ") + fn;
    function=fn;
  }
  ~CDebug(){
    CDebug::container << string("Exiting ") + function;
  }
  ...
}

Что имеем: при входе в каждую функцию делается запись, что мы в нее вошли, при выходе - что вышли.

Какой контейнер - придумай сам. Это может быть лог-файл (у меня так было, потом писал тулзовину, которая показывала ход программы), просто буфер в памяти, который потом будет выводить стек функций, как в твоем примере. Контейнер - статический, чтобы все объекты класса имели один контейнер.

Далее используем силу макросов. Например, так: #define DEBUG(f) CDebug log(f);

Так: #define RETURN(s) log.Error(s);return;

Можно задействовать __LINE__ , __FILE__ для того чтобы понимать, где произошла ошибка.

Исправление Kroz, :

Это интересно - расскажи.

Рассказываю логику. К коду не придирайся.

Объект-локальная переменная в функции уничтожается при выходе из функции. Соответственно, первое действие функции - создание объекта:

void function1()
{
CDebug log("function1");
...
}

В классе CDebug в конструктора пишем что-то типа:

class CDebug{
public:
  static ??? container;
  string function;

  CDebug(string fn){
    container << string("Entering ") + fn;
    function=fn;
  }
  ~CDebug(){
    container << string("Exiting ") + function;
  }
  ...
}

Что имеем: при входе в каждую функцию делается запись, что мы в нее вошли, при выходе - что вышли.

Какой контейнер - придумай сам. Это может быть лог-файл (у меня так было, потом писал тулзовину, которая показывала ход программы), просто буфер в памяти, который потом будет выводить стек функций, как в твоем примере. Контейнер - статический, чтобы все объекты класса имели один контейнер.

Далее используем силу макросов. Например, так: #define DEBUG(f) CDebug log(f);

Так: #define RETURN(s) log.Error(s);return;

Можно задействовать __LINE__ , __FILE__ для того чтобы понимать, где произошла ошибка.

Исправление Kroz, :

Это интересно - расскажи.

Рассказываю логику. К коду не придирайся.

Объект-локальная переменная в функции уничтожается при выходе из функции. Соответственно, первое действие функции - создание объекта:

void function1()
{
CDebug log("function1");
...
}

В классе CDebug в конструктора пишем что-то типа:

class CDebug{
public:
  static ??? container;
  string function;

  CDebug(string fn){
    container << string("Entering ") + fn;
    function=fn;
  }
  ~CDebug(){
    container << string("Exiting ") + function;
  }
  ...
}

Что имеем: при входе в каждую функцию делается запись, что мы в нее вошли, при выходе - что вышли.

Какой контейнер - придумай сам. Это может быть лог-файл (у меня так было, потом писал тулзовину, которая показывала ход программы), просто буфер в памяти, который потом будет выводить стек функций, как в твоем примере. Контейнер - статический, чтобы все объекты класса имели один контейнер.

Далее используем силу макросов. Например, так: #define DEBUG(f) CDebug log(f);

Так: #define RETURN(s) log.Error(s);return;

Можно задействовать __LINE__ , __FILE__ для того чтобы понимать, где произошла ошибка.

Исходная версия Kroz, :

Это интересно - расскажи.

Рассказываю логику. К коду сильно не придирайся.

Объект-локальная переменная в функции уничтожается при выходе. Соответственно, первое действие функции - создание объекта:

void function1()
{
CDebug log("function1");
...
}

В классе CDebug в конструктора пишем что-то типа:

class CDebug{
public:
  static ??? container;
  string function;

  CDebug(string fn){
    container << string("Entering ") + fn;
    function=fn;
  }
  ~CDebug(){
    container << string("Exiting ") + function;
  }
  ...
}

Что имеем: при входе в каждую функцию делается запись, что мы в нее вошли, при выходе - что вышли.

Какой контейнер - придумай сам. Это может быть лог-файл (у меня так было, потом писал тулзовину, которая показывала ход программы), просто буфер в памяти, который потом будет выводить стек функций, как в твоем примере. Контейнер - статический, чтобы все объекты класса имели один контейнер.

Далее используем силу макросов. Например, так: #define DEBUG(f) CDebug log(f);

Так: #define RETURN(s) log.Error(s);return;

Можно задействовать __LINE__ , __FILE__ для того чтобы понимать, где произошла ошибка.