如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?

Posted

技术标签:

【中文标题】如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?【英文标题】:How to get call graph profiling working with gcc compiled code and ARM Cortex A8 target? 【发布时间】:2011-11-30 17:22:57 【问题描述】:

我对这个咬牙切齿......

我需要在 ARM 板上进行分析并且需要查看调用图。我尝试使用 OProfile、Kernel perf 和 Google 性能工具。一切正常,但不输出任何调用图信息。

这使我得出结论,我没有正确编译我的代码。

我在编译 C++ 代码时使用以下标志:

特定于架构:

-march=armv7-a -mtune=cortex-a8 -mfloat-abi=hard -mfpu=vfpv3

一般:

-fexceptions -fno-strict-aliasing -D_REENTRANT -Wall -Wextra

调试(带优化):

-O2 -g -fno-omit-frame-pointer

我做了很多谷歌搜索,发现了一些相关的主题:

libunwind ? 矮人 (异步)展开表 -mapcs-frame

但是我不完全理解这些是如何联系在一起的。有关如何使调用图正常工作的任何提示?

注意(由于 Rian 的回答):我有兴趣找出 ARM 上的某些方法是否以及为什么比 x86-64 需要更长的时间(相对于其他方法)。在不同的平台上执行此操作无济于事(即使我的代码在两者上都编译并且我可以在 x86-64 上执行调用图)。

【问题讨论】:

您确定要使用 -mfloat-abi=hard 进行编译吗?据我了解,mfloat-abi=softfp 仍然使用 NEON,但与现有二进制文件更兼容,尽管它的性能不如 mfloat-abi=hard wiki.linaro.org/Linaro-arm-hardfloat hard 应该可以提高性能,我们使用 hard 构建整个发行版。 oprofile 依赖于内核。您是否重新配置了内核以促进分析? 你终于设法让它工作了吗?我遇到了完全相同的问题。 不——当时我们放弃了尝试和错误:( 【参考方案1】:

我知道您想在 ARM cortex-A8 上进行分析,但如果您对调用图感兴趣,为什么不为 x86 编译并运行 valgrind 的 callgrind 工具并使用 kcachegrind 检查结果?

两种架构之间的调用图应该相同,即使它们编译的函数略有不同,函数之间的关系也不应该改变。

不需要特殊标志:

valgrind --tool=callgrind -v --dump-every-bb=10000000 ./some-app
kcachegrind &

【讨论】:

我对每个函数(包括子调用)的累积时间特别感兴趣,因此我可以看到某些使用模式如何影响特定于平台的性能。这很难从一个平台转移到另一个平台,因为“每个调用链”的关系会有所不同。但是对于那些只想获取调用图而不对时间感兴趣的人来说,你的回答是一个很好的建议。 +1

以上是关于如何使用 gcc 编译代码和 ARM Cortex A8 目标进行调用图分析?的主要内容,如果未能解决你的问题,请参考以下文章

ARM编译器如何执行编译和链接操作

为啥 GCC 会为 ARM Cortex-A9 产生非法未对齐访问

如何为 ARM Cortex M7 编译和调试 ASM 代码?

如何将 GCC LTO 与不同优化的目标文件一起使用?

arm各种交叉编译工具的区别

protues 8.0下安装gcc for arm编译器