我正在尝试进入 C 语言,并寻找一个支持每个函数调用的时间线视图表示的探查器或跟踪器工具。类似于通过 PHP xDebug 进行跟踪。所有函数调用大约在它们被调用的确切时间放置在堆栈中。
到目前为止我的研究是:
到目前为止,我发现
valgrind --tool=callgrind ./myscript
是我可以使用的最接近的。我还检查了
gprofng
,但是文本可视化并不那么容易阅读,而且它似乎是相同的采样火焰图我也尝试通过
perf
做一些事情,但看起来 perf
只记录没有时间戳的系统/linux 调用,至少在 speedscope 中可见。perf
但这是我在尝试来自 https://www.brendangregg.com/perf.html 的不同命令后得到的结果
我了解一些基础知识,即应用程序必须使用
-g
进行编译,或者跟踪会增加一些开销,并且计时可能不是 100% 准确,但我发现很难找到一个可以将 calltree 可视化为 C 语言时间线的工具。
Callgrind 并没有真正提供任何有意义的计时信息。它的主要优点是,由于指令准确,因此结果精确且接近可重复。
perf
,在此模式下,正在对调用堆栈进行采样。它全速运行您的应用程序,每秒 100 次(可配置)停止它,捕获调用堆栈并重新启动它。这是相当低的开销——根据我的经验,只有几个百分点。 perf 有 3 种获取调用堆栈的方法,我对第三种不太了解,所以我将保留它。第一个是遍历堆栈基指针。这是 perf 的默认值(并且可以使用 --call-graph=fp
显式指定)。为了使其发挥作用,您需要在不进行优化的情况下或使用 -fno-omit-frame-pointer
来构建 exe。它也可能适用于低级优化-O1
。第二种方法是使用 DWARF debuginfo。这意味着使用 -g
构建您的 exe 并使用 perf record
运行 --call-graph=dwarf
。
我还没有使用过
gprofng
,但我对它最近的发布感到相当兴奋。我以前用它的前身Sun/Solaris Studio收集了很多。我认为有计划发布 GUI,这应该会使查看结果变得更加容易。我不知道新工具是否与旧的analyzer
工具兼容。