Как показать все выполненные функции с++

212
07 апреля 2018, 22:16

Есть код с функциями. Есть ли какой-либо способ узнать очередность выполнения этих функций? Т.е. я хочу увидеть что-то вроде такого:

main -> func1 star -> func2 start -> func2 end -> funс1 end -> func3 start -> func3 end

Можно конечно в начале и конце писать puts("star/end\n"). Возможно есть что-то более удобное, или по каким словам это гуглить?

Answer 1

Я когда-то воспользовался (С++ only) классом типа

class CallInfo
{
public:
    CallInfo(const char * name):name(name) { cout << name << " start\n"; }
    ~CallInfo() { cout << name << " end\n"; }
private:
    const char * name;
};
#define  Callinfo CallInfo ci__(__func__);
void test()
{
    Callinfo
}

int main(int argc, const char * argv[])
{
    Callinfo
    test();
}
Answer 2

Я предполагаю, что список ВСЕХ вызовов Вам не нужен. А, на самом деле, Вам нужен стек вызовов функций в некоей точке, в которой (скорее всего) произошла ошибка и Вы пытаетесь понять, откуда пришло управление.

Для этой цели в с/с++ есть функция backtrace:

backtrace() returns a backtrace for the calling program, in the array pointed to by buffer. A backtrace is the series of currently active function calls for the program. Each item in the array pointed to by buffer is of type void *, and is the return address from the corresponding stack frame. The size argument specifies the maximum number of addresses that can be stored in buffer. If the backtrace is larger than size, then the addresses corresponding to the size most recent function calls are returned; to obtain the complete backtrace, make sure that buffer and size are large enough.

man 3 backtrace

READ ALSO
Проблема с #define

Проблема с #define

Почему неработоспособен вот этот код:

235
Как получить элемент константной мапы?

Как получить элемент константной мапы?

Создаю глобальную константную мапу и пытаюсь взят её элемент через опертаор [ ] в константную переменную, но компилятор говорит, что так нельзяКакие...

218
Задание C++. d=2*c;

Задание C++. d=2*c;

Здравствуйте! Мне задали создать переменную со значением 2*сИ дать ей имя d

314