内存布局分析工具pahole的安装和使用

paw5zx Lv4

本文相关测试的机器环境:

1
Linux user-GA-IMB410TN 5.15.0-122-generic #132~20.04.1-Ubuntu SMP Fri Aug 30 15:50:07 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

gcc版本:

1
gcc (Ubuntu 11.4.0-2ubuntu1~20.04) 11.4.0

简介

pahole可以用来查看C/C++编译后的程序中数据结构的内存布局。这个工具属于dwarves软件包中的一部分,它通过分析DWARF调试信息来显示每个数据结构的大小、对齐、和字段间的填充(padding)。这对于优化数据结构的内存使用和访问性能非常有帮助。

安装

方法一:包管理器

pahole工具是dwarves软件包的一部分,若对版本无特殊需求,直接使用包管理器安装即可:

1
apt-get install dwarves

方法二:源码编译安装

若需要安装pahole指定版本,请访问官方网站 ,解压后查看README文件进行安装

使用

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// file: example.cpp
struct S
{
unsigned int a : 5; // 第一个位域,位宽为5
unsigned int b : 17; // 第二个位域,位宽为17
unsigned int c : 28; // 第三个位域,位宽为28
unsigned int d : 31; // 第四个位域,位宽为31
};

int main()
{
S s;
return 0;
}

使用过程

①编译待测试的代码
编译时使用-g参数生成DWARF调试信息

1
g++ -g -o example example.cpp

②查看内存布局
编译完成后,使用pahole查看程序中数据结构的内存布局:

1
2
3
4
# 查看所有结构体的内存布局
pahole example
# 查看指定结构体(S)的内存布局
pahole -C S example

示例代码中S的内存布局如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
struct S {
unsigned int a:5; /* 0: 0 4 */
unsigned int b:17; /* 0: 5 4 */

/* XXX 10 bits hole, try to pack */

/* Force alignment to the next boundary: */
unsigned int :0;

unsigned int c:28; /* 4: 0 4 */

/* XXX 4 bits hole, try to pack */

/* Force alignment to the next boundary: */
unsigned int :0;

unsigned int d:31; /* 8: 0 4 */

/* size: 12, cachelines: 1, members: 4 */
/* sum bitfield members: 81 bits, bit holes: 2, sum bit holes: 14 bits */
/* bit_padding: 1 bits */
/* last cacheline: 12 bytes */
};
  • 标题: 内存布局分析工具pahole的安装和使用
  • 作者: paw5zx
  • 创建于 : 2024-10-11 10:18:24
  • 更新于 : 2024-10-11 11:53:08
  • 链接: https://paw5zx.github.io/tools-pahole/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论