可视化由GCC编译的C类/结构体的内存布局的最佳方法是什么?我在C编译选项中添加了GCC开关-fdump-lang-class,但它没有向stdout输出任何内容,我也没有注意到创建了任何文件.class。我只想查看类/数据成员的大小/偏移量。
-fdump-lang-class
.class
lnlaulya1#
你可以用pahole,它是瑞士军队用来做这类事情的工具。https://manpages.ubuntu.com/manpages/impish/man1/pahole.1.html例如,假设您有以下test.cpp文件
struct A { int i; char c; double x; }; void doit( A& a ) { a.i = 1; a.c = 0; a.x = 1.0; }
让我们将其编译到共享库中
$ g++ test.cpp -shared -ggdb -o libtest.so $ ls -l libtest.so -rwxrwxr-x 1 awesome awesome 16872 Aug 12 20:15 libtest.so
然后在二进制文件上运行pahole(带有调试信息)
$ pahole libtest.so struct A { int i; /* 0 4 */ char c; /* 4 1 */ /* XXX 3 bytes hole, try to pack */ double x; /* 8 8 */ /* size: 16, cachelines: 1, members: 3 */ /* sum members: 13, holes: 1, sum holes: 3 */ /* last cacheline: 16 bytes */ };
您还可以使用-C <classname>参数提供类名
-C <classname>
$ pahole -C A libtest.so struct A { int i; /* 0 4 */ char c; /* 4 1 */ /* XXX 3 bytes hole, try to pack */ double x; /* 8 8 */ /* size: 16, cachelines: 1, members: 3 */ /* sum members: 13, holes: 1, sum holes: 3 */ /* last cacheline: 16 bytes */ };
1条答案
按热度按时间lnlaulya1#
你可以用pahole,它是瑞士军队用来做这类事情的工具。
https://manpages.ubuntu.com/manpages/impish/man1/pahole.1.html
例如,假设您有以下test.cpp文件
让我们将其编译到共享库中
然后在二进制文件上运行pahole(带有调试信息)
您还可以使用
-C <classname>
参数提供类名