我正在为微控制器开发一些软件,我希望能够轻松地看到软件的哪些部分正在使用多少内存。该软件不使用动态内存分配,我只对静态内存分配(bss和数据部分)感兴趣。
所有这些静态内存实际上都是单个结构的一部分,它包含程序使用的(大部分)内存。这是结构的层次结构,对应于程序的组件。 E.g:
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 ++模板元编程,程序肯定无法处理。
如果没有这样的工具,我会对如何检索这些内存使用信息(来自二进制文件或编译器)感兴趣。
答案 0 :(得分:1)
通过使链接器直接输出映射文件,您可以获得相同的信息(可能更多),而不是使用nm。然而,这可能无法解决您的问题 - 结构的内部偏移可以由编译器解决并且丢弃的符号因此无需在最终链接映射中可见 - 仅为了链接而保留外部引用。
但是,实现目标所需的信息必须可供调试器使用(因为它能够扩展结构),因此某些工具可以解析编译器的特定调试信息 - 甚至可能是调试器本身 - 但这是很长一段时间,我想你必须自己编写这样的工具。
GDB debug info parser/description的答案可能有所帮助。
答案 1 :(得分:0)
如果在全局范围而不是whole_program
结构内部声明组件结构的实例,则映射文件应该为您提供每个组件结构的大小。
将所有组件打包到一个单独的结构中自然会导致只有whole_program
列在映射文件中。