【问题标题】:Hierarchical overview of static memory usage静态内存使用的分层概述
【发布时间】:2014-10-05 08:28:59
【问题描述】:

我正在为微控制器开发一些软件,我希望能够轻松查看软件的哪些部分正在使用多少内存。该软件不使用动态内存分配,我只对静态内存分配(bss 和 data 部分)感兴趣。

所有这些静态内存实际上是单个结构的一部分,其中包含程序使用的(大部分)内存。这是结构的层次结构,对应于程序的组件。例如:

struct WholeProgram { int x; struct ComponentA a; struct ComponentB b; }; struct ComponentA { int y; struct ComponentC c; struct ComponentD d; }; ... struct WholeProgram whole_program;

理想情况下,我希望看到用多级饼图表示的内存使用情况。

我找不到任何可以归结为这样的结构的东西,只有打印全局变量 (nm) 大小的程序。这对我来说不是太有用,因为它只会告诉我WholeProgram 结构的大小,而没有关于其部分的任何详细信息。

请注意,解决方案一定不能采用解析代码的程序的形式。这对我来说是不可接受的,因为我使用了大量的 C++ 模板元编程,而程序肯定无法处理。

如果这样的工具不可用,我会对检索此内存使用信息的方法(从二进制文件或编译器)感兴趣。

【问题讨论】:

  • 您的示例结构不使用任何内存,除非它们被显式实例化,然后这取决于您创建的实例数量。
  • @Clifford 我有一个根 WholeProgram 结构的实例。
  • 您可以简单地检查/查看程序链接产生的 .map 文件,以确定程序每个段的大小。
  • @user3629249 :在大多数链接器中,这只会告诉您whole_program 的大小 - 这不是被要求的。

标签: c++ c gcc memory embedded


【解决方案1】:

您可以通过让链接器直接输出映射文件来获得相同的信息(甚至可能更多),而不是使用 nm。但是,这可能无法解决您的问题 - 结构的内部偏移量可以由编译器解决,并且符号被丢弃,因此不需要在最终链接映射中可见 - 仅保留外部引用以进行链接。

但是,实现目标所需的信息必须对调试器可用(因为它能够扩展结构),所以一些可以解析编译器特定调试信息的工具 - 甚至可能是调试器本身 - 但那就是长镜头,我想你必须自己编写这样的工具。

GDB debug info parser/description 的答案可能会有所帮助。

【讨论】:

    【解决方案2】:

    如果您在全局范围内而不是在 whole_program 结构内声明组件结构的实例,您的映射文件应该为您提供每个组件结构的大小。 将所有组件打包到一个单一结构中自然会导致映射文件中仅列出 whole_program

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 2011-05-30
      • 2012-12-23
      • 2016-07-27
      • 2016-10-21
      • 2017-11-11
      • 2012-01-13
      • 2014-10-12
      相关资源
      最近更新 更多