c++ - 静态内存使用的层次概述

标签 c++ c gcc memory embedded

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

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

结构整个程序{ 诠释 x; 结构组件A; 结构组件 B; }; 结构组件A { 诠释y; 结构组件C; 结构 ComponentD d; }; ... 结构 WholeProgram whole_program;

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

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

注意解决方案一定不能是解析代码的程序形式。这对我来说是 Not Acceptable ,因为我使用了很多 C++ 模板元编程,程序肯定无法处理。

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

最佳答案

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

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

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

关于c++ - 静态内存使用的层次概述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26200947/

相关文章:

c++ - 如何获取 std::string 中的字符数?

c++ - 更改调用约定

c++ - 有据可查、开源且快速的 C/C++ 图像处理库。比如 'resize' ,旋转,变色,裁剪

c++ - libxml2 是否维护文档顺序?

c - "|="运算符在 C 中是什么意思?

c - 没有完整路径的 gcc : error trying to exec 'cc1' : execvp: No such file or directory

c++ - ')' token 之前的预期主表达式

c# - C# 中的字符串到字典或数组

linux - 如何增加 Linux 核心转储匹配符号的概率?

c++ - 计算由于在 C 中打包而产生的开销 (gcc/g++)