История изменений
Исправление 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__ для того чтобы понимать, где произошла ошибка.