我有第三方源代码,我必须调查.我想知道调用函数的顺序,但我不想浪费时间输入:
printf("Entered into %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)
和
printf("Exited from %s", __FUNCTION__)
Run Code Online (Sandbox Code Playgroud)
对于每个功能,我也不想触摸任何源文件.
你有什么建议吗?是否有一个编译器标志可以自动为我执行此操作?
澄清评论:
编辑:我发现gdb提示符中的'frame'命令在那个时间点打印当前帧(或者,你可以说是函数名).也许,每次调用函数时,都可以(使用gdb脚本)调用'frame'命令.你怎么看?
我正在将Python指标库移植到C++.Python库提供的一个API是一个函数修饰器,可以轻松地在函数上记录时序数据.通过修改函数定义来实现
@timed('timing.foo')
def foo():
...
Run Code Online (Sandbox Code Playgroud)
foo_result = foo() 基本上变成了
start = time.time()
foo_result = foo()
post_metric_to_endpoint('timing.foo', time.time() - start)
Run Code Online (Sandbox Code Playgroud)
在C++中的函数挂钩中,我们发现这个包装实例并将调用定时函数的负担放在调用者身上的答案,这意味着我们不会在代码库中获得性能数据(首先更新很烦人,而且很容易后来被遗忘了).同样,这个答案要定时在C++中一种优雅的方式需要改变调用点. 这个问题的另一个答案提供了一种包装任意代码块的方法,理论上这意味着我们可以缩进我们想要计时的函数的整个主体并将其嵌套在一个范围内.这是我发现的最接近我想要的东西,但是非常难看,相当干扰,而且我不确定性能影响.
由于这是用作库,我们可以修改我们想要的函数的来源; 事实上,这是更可取的,因为我希望每次调用该函数的时间都是定时的.大多数讨论似乎都侧重于开发中的临时分析,而我正在尝试构建一个在生产环境中始终处于活动状态的系统.