如何打印函数调用时间线



我想在运行期间打印每个函数的位置和函数名。

当多个函数在不同的地方具有相同的名称时,在调试过程中识别调用哪个函数将有所帮助。

手动添加消息是可能的,但时间成本高昂,例如:

println!("(function_name) file = {}, line = {}",file!(),line!());

你知道这样的解决方案吗?你有没有建议可以很容易地确定调用了哪个函数以及由谁调用它?

最简单的选择可能是使用类似dtrace或ebpf的东西:挂接到"函数条目";探测(不确定它在linux/ebpf-land中的名称,但我认为它存在(,然后打印相关信息。不过,您可能希望添加基于堆栈的缩进,当然,由于编译器的优化,您可能会丢失函数。你可能会得到混乱的名字,这并不好,但去混乱是一件事。

您可以通过在gdb中运行程序并创建某种程序断点来执行类似的操作,这些断点可以打印并立即继续?

或者,模块级属性过程宏也可以工作:如果您获得整个模块的令牌流,则可能会自动将日志记录数据注入每个函数头。

最新更新