带有时间线视图的 C 分析器/跟踪器

问题描述 投票:0回答:1

我正在尝试进入 C 语言,并寻找一个支持每个函数调用的时间线视图表示的探查器或跟踪器工具。类似于通过 PHP xDebug 进行跟踪。所有函数调用大约在它们被调用的确切时间放置在堆栈中。

到目前为止我的研究是:

到目前为止,我发现

valgrind --tool=callgrind ./myscript
是我可以使用的最接近的。
然而,可视化是一个对 C 函数调用进行采样的火焰图。
就我而言,这是逆向工程的良好开端,但我希望有详细的时间表和实际调用时间戳。

我还检查了

gprofng
,但是文本可视化并不那么容易阅读,而且它似乎是相同的采样火焰图

我也尝试通过

perf
做一些事情,但看起来
perf
只记录没有时间戳的系统/linux 调用,至少在 speedscope 中可见。
也许我没有正确使用
perf
但这是我在尝试来自 https://www.brendangregg.com/perf.html 的不同命令后得到的结果

我了解一些基础知识,即应用程序必须使用

-g
进行编译,或者跟踪会增加一些开销,并且计时可能不是 100% 准确,但我发现很难找到一个可以将 calltree 可视化为 C 语言时间线的工具。

valgrind trace perf gprof flamegraph
1个回答
1
投票

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
工具兼容。

© www.soinside.com 2019 - 2024. All rights reserved.