gcc 如何可视化C++结构/类的布局

xriantvc  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(163)

可视化由GCC编译的C类/结构体的内存布局的最佳方法是什么?
我在C
编译选项中添加了GCC开关-fdump-lang-class,但它没有向stdout输出任何内容,我也没有注意到创建了任何文件.class
我只想查看类/数据成员的大小/偏移量。

lnlaulya

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>参数提供类名

$ 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 */
};

相关问题