如何在程序中记录函数的运行信息?

时间:2013-09-13 07:44:31

标签: debugging function-calls

我最近参加了编码面试,我被问到一个我不知道答案的问题。在网上搜索了几天后,我来这里打电话求助。

问题描述如下:您应该提出一种方法来记录程序中函数的运行信息,例如,调用函数的时间等等。

顺便说一句,您不能修改这些功能。也许你想在这些函数中定义一个全局变量来记录运行函数,但这是不允许的。

确定!这就是我在编码面试中遇到的问题。

1 个答案:

答案 0 :(得分:0)

这是我使用 C ++宏提出的最佳效果。我不知道它是否符合要求。

一个非常基本的版本,只记录计数。宏用宏的内容替换对函数的所有现有调用,宏记录统计信息并调用函数。可以轻松扩展以记录更多细节。假设只有一个具有该名称的函数,或者您想要对所有这些函数进行一次计数。每个函数都需要一个宏。

// here's our function
void func()
{ /* some stuff */ }

// this was added
int funcCount = 0;
#define func(...) do { funcCount++; func(__VA_ARGS__); } while(0)

int main()
{
    // call the function
    func();

    // print stats
    cout << funcCount << endl;

    return 0;
}

打印1

更通用的版本。需要更改函数的调用方式。

// here are our functions
void someFunc()
{ /* some stuff */ }
void someOtherFunc()
{ /* some stuff */ }

// this was added
map<string, int> funcCounts;
#define call(func, ...) do { funcCounts[ #func ]++; func(##__VA_ARGS__); } while(0)

int main()
{
    // call the functions
    // needed to change these from 'someFunc();' format
    call(someFunc);
    call(someOtherFunc);
    call(someFunc);

    // print stats
    for (map<string, int>::iterator i = funcCounts.begin(); i != funcCounts.end(); i++)
      cout << i->first << " - " << i->second << endl;

    return 0;
}

打印:

someFunc - 2
someOtherFunc - 1