【问题标题】:Profiling embedded application分析嵌入式应用程序
【发布时间】:2010-07-19 21:58:42
【问题描述】:

我有一个在嵌入式处理器 (ARM) 上运行的应用程序,我想分析该应用程序以了解它在何处使用系统资源,如 CPU、内存、IO 等。该应用程序正在运行在 Linux 之上,所以我假设有许多分析应用程序可用。有人有什么建议吗?

谢谢!

编辑:我还应该添加我们正在使用的 Linux 版本有点旧(2.6.18)。不幸的是,我现在对此没有太多控制权。

【问题讨论】:

    标签: c++ linux embedded profiling


    【解决方案1】:

    正如 bobah 所说,gprof 和 valgrind 很有用。您可能还想尝试OProfile。如果您的应用程序使用 C++(如标记所示),您可能需要考虑禁用异常(如果您的编译器允许)并避免动态转换,如 sashan 上面提到的。另见Embedded C++

    【讨论】:

    • 谢谢,OProfile 是票。它非常适合嵌入式分析。
    【解决方案2】:

    如果您的 Linux 不是很有限,那么您可能会发现 gprofvalgrind 很有用

    【讨论】:

    • 要使用这些,我必须将它们移植到 ARM 上,不是吗?
    • 根据我的经验,Valgrind 在嵌入式设备中无法使用,它太慢了。另一方面,grpof 效果很好。 gprof 是 GCC 本身提供的一个工具,所以如果你让 GCC 工作,你就有了 gprof。它将生成一个统计文件,您可以稍后在具有完整 GUI 的 PC 中对其进行分析。
    【解决方案3】:

    在相关说明中,C++ 工作组针对各种 C++ 语言特性的性能成本做了一份技术报告。例如,他们分析了 dynamic_casting 一层或两层深度的成本。 http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf 此处的报告可能会让您深入了解嵌入式应用程序中的痛点可能在哪里。

    【讨论】:

      【解决方案4】:

      gprof may disappoint you.

      假设您正在测试的程序大到可以使用,那么调用树可能会被修剪,因此优化的最佳机会是您可以删除或避免的函数/方法调用。该链接显示了找到它们的好方法。

      许多人将此视为一种测量时间的分层侦查过程。 或者你可以简单地在行动中抓住它,这就是我所做的。

      【讨论】:

      • 是的,中断在嵌入式处理器上运行的程序......并不容易。因此,虽然您概述的方法可能适用于带有完整调试器的桌面,但它对于嵌入式开发来说是有问题的。 OProfile 基本上采用了与您提议的方法完全相同的方法,只是采用了更加一致和有用的方式。
      • @kidjan:我不熟悉 OProfile。它需要堆栈样本吗?在挂钟时间(即即使被阻塞)?它是否总结了代码行级别的百分比,而不仅仅是函数?它忽略递归吗?然后它到达那里。 (这就是 Zoom 和 LTProf 所做的。)我不得不在嵌入式处理器上使用 ICE 盒来执行此操作。我承认这可能并不容易,但我认为没有什么比实际研究堆栈的单个样本更能解决问题了。
      • 它可以做所有这些事情。在实时程序中暂停嵌入式处理器(我们正在做实时视频流,以及其他实时敏感的事情,所以“海森堡”适用)不仅“不容易”,而且“不可能”。像 OProfile 这样的工具是唯一的选择。
      • @kidjan:那么听起来你没有问题。这很好。
      猜你喜欢
      • 1970-01-01
      • 2011-01-24
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2023-03-17
      • 2010-12-07
      相关资源
      最近更新 更多