嵌入式应用程序性能分析

6
我有一个运行在嵌入式处理器(ARM)上的应用程序,希望通过分析来了解它使用系统资源(如CPU、内存、IO等)的情况。由于应用程序是在Linux上运行的,因此我认为有许多可用的分析工具。你们有什么建议吗?
谢谢!
编辑:我还应该补充一下我们使用的Linux版本比较旧(2.6.18)。不幸的是,目前我对这方面没有太多的控制。
4个回答

2
如果你的Linux系统并不是非常有限,那么你可能会发现gprof和valgrind非常有用。请访问gprofvalgrind了解更多信息。

要使用这些,我需要将它们移植到ARM上,是吗? - kidjan
3
据我的经验,Valgrind在嵌入式设备上使用起来很不方便,因为速度太慢了。另一方面,gprof的表现很好。gprof是由GCC本身提供的工具,因此如果你已经成功安装了GCC,就可以使用gprof了。它会生成一个统计文件,稍后可以在带有完整GUI界面的PC上进行分析。 - Gianni

2
正如bobah所说,gprof和valgrind都很有用。您可能还想尝试使用OProfile。如果您的应用程序是用C++编写的(如标签所示),您可能需要考虑禁用异常(如果您的编译器允许)并避免使用动态转换,就像sashang上面提到的那样。另请参阅嵌入式C++

谢谢,OProfile是个好东西。它非常适合嵌入式性能分析。 - kidjan

0

相关的是,C++工作组对各种C++语言特性的性能成本进行了技术报告。例如,他们分析了动态转换一到两个级别的成本。报告在这里http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf,它可能会让您了解嵌入式应用程序中的痛点所在。


0

gprof 可能会让你失望。

假设你正在测试的程序足够大而有用,那么调用树可能需要修剪,因此最好的优化机会是可以删除或避免的函数/方法调用。该链接展示了一种很好的查找方法。

许多人将其视为一种层次化的侦探过程,测量时间。或者你可以直接抓住它的行为,这就是我所做的。


是的,在嵌入式处理器上中断正在运行的程序并不容易。因此,虽然您概述的方法可能适用于连接了完整调试器的桌面,但对于嵌入式开发来说存在问题。而 OProfile 基本上采用了您提出的完全相同的方法,只不过以更一致和有用的方式进行。 - kidjan
@kidjan:我不熟悉OProfile。它是否采用堆栈样本?在挂钟时间(即使被阻塞时)?它是否在代码行级别而不仅仅是函数级别上总结百分比?它是否忽略递归?那么它正在接近(这就是Zoom和LTProf所做的)。我曾经不得不在嵌入式处理器上使用ICE盒来完成这项工作。我承认这可能不容易,但我认为没有什么比实际研究堆栈的个别样本更能找到问题了。 - Mike Dunlavey
它可以完成所有这些事情。在实时程序中暂停嵌入式处理器(我们正在进行实时视频流等实时敏感的事情,因此“海森堡”适用)不仅“不容易”,而且“不可能”。像 OProfile 这样的工具是唯一的选择。 - kidjan
@kidjan: 那听起来你没有问题。这很好。 - Mike Dunlavey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接