Simpleperf不会展开堆栈

时间:2017-03-28 02:46:50

标签: performance android-ndk profiling

我尝试使用Google的simpleperf抽样分析器来分析基于Android NDK 14b clang的应用程序。记录的callstack样本实际上没有被解开 - 只是记录了callstack的顶部框架,因此分析报告并不是非常有用。我在大多数代码中都指定了-fno-omit-frame-pointer,但这似乎没什么区别。

我错过了什么?我应该使用的Android NDK项目是否有更新的分析器?

2 个答案:

答案 0 :(得分:2)

如果您正在进行基于帧指针的展开(使用--call-graph fp选项),请使用aarch64架构,因为arm已经组合了arm / thumb代码,即使使用-fno-omit也无法展开-frame-pointer无处不在。

如果你正在进行基于dwarf的展开(使用-g或--call-graph dwarf选项),-fno-omit-frame-pointer不起作用,你最好使用包含调试信息的共享库。 APK。

也可能在java代码处停止展开。要解开java代码,您需要将其完全编译为本机代码并使用基于dwarf的展开。

毕竟,您可以使用ndk r14b中包含的app_profiler.py。它试图为您处理细节,完全编译Java代码,并将带有调试信息的库下载到设备。如果它在您的环境中无法正常工作,也很容易检查和更改。

答案 1 :(得分:1)

我发现我需要指定(或不指定)一些简单的选项,这似乎使我更有可能得到预期的调用图。 如果我指定' -a --cpu 1'例如,然后二进制我的分析甚至不会出现在调用图中。 例如,如果我这样做(其中perf_text.x主要在cpu 1上旋转1秒):

simpleperf record -g -a -e cpu-cycles --cpu 1 ./perf_test.x -C 1 -w bw -t 1
simpleperf report -g caller 

然后perf_test.x在输出中不会出现(对我来说)。 因此,如果您正在使用它,请删除--cpu x选项。 此外,高采样率会增加开销。下面以(当前)默认采样率4000次采样/秒运行。

simpleperf record -g -a -e cpu-cycles -F 4000 ./perf_test.x -C 1 -w bw -t 1
simpleperf report -g caller

上图显示simpleperf作为使用40-70%样品的顶级工艺。 降低采样率:

simpleperf record -g -a -e cpu-cycles -F 1000 ./perf_test.x -C 1 -w bw -t 1
simpleperf report -g caller

将perf_test.x提升到总样本的最高百分比,第一个simpleperf条目占总样本的24%。 希望这有用。