python - 使用 GDB-Python Types API 查找嵌套结构的绝对偏移量

标签 python c++ c struct gdb

我正在尝试使用 GDB-Python Type API (gdb.types) 探索数据类型的内存布局。具体来说,我想找到一种方法来获取在父结构内定义的嵌套结构的所有成员的绝对偏移量。

在 C 语言中,我定义了:

typedef struct
{
    int  a;
    short bf1:2;
    char b:4;

    struct   //nested struct
    {
        long x;
        long y;
    };
} a_struct;

在 gdb 中使用 ptype 命令,我得到:

(gdb) ptype /o a_struct
/* offset    |  size */  type = struct a_struct {
/*    0      |     4 */    int a;
/*    4:14   |     2 */    short bf1 : 2;
/*    4: 2   |     1 */    char b : 4;
/* XXX  2-bit hole  */
/* XXX  3-byte hole */
/*    8      |    16 */    struct {
/*    8      |     8 */        long x;
/*   16      |     8 */        long y;

                               /* total size (bytes):   16 */
                           };

                           /* total size (bytes):   24 */
                         }

上面的输出显示了嵌套匿名结构体字段相对于父结构体开头的绝对值偏移量,即 x 位于字节 8,y 位于字节 16。

我尝试使用 GDB Python Type API 获得相同的结果,但没有成功。特别是,我使用 gdb.types.deep_items(lookup_type) 方法,该方法返回嵌套结构的字段的相对偏移量,即第一个字段 (x) 为 0,第二个字段 (y) 为 8。

有没有办法使用 GDB Python API 为 x 获取 8,为 y 获取 16(如 ptype 输出所示)?

谢谢

最佳答案

我现在无法检查,但如果我没记错的话,这个 gdb 插件提供了绝对偏移量:https://blog.mozilla.org/sfink/2018/08/17/type-examination-in-gdb/ 。它产生如下输出:

(gdb) pahole js::jit::ABIArg
  offset size
       0   16 : struct js::jit::ABIArg {
       0    4 :   kind_ : js::jit::ABIArg::Kind
       4    4 : --> 32 bit hole in js::jit::ABIArg <--
       8    8 :   u : struct union {...} {
   8  +0    1 :     gpr_ : js::jit::Register::Code
   8  +0    8 :     fpu_ : js::jit::FloatRegister::Code
   8  +0    4 :     offset_ : uint32_t
                  } union {...}
                } js::jit::ABIArg

关于python - 使用 GDB-Python Types API 查找嵌套结构的绝对偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60442223/

相关文章:

python - 如何在 sqlite 中执行带有占位符的 SELECT * LIKE 语句?

我们可以嵌套吗? : operator in C language. 解释如果是,那么如何

c++ - 为什么 free(p) 不将 p 设置为 NULL?

c - 安装 MinGW-W64 构建 FuTTY 时使用什么设置?

C++ std::vector<int> 问题

python - 如何将 raw_input 与 argv 一起使用?

python - 使用用户定义的函数时如何让两个函数返回?

python - Microsoft Teams - 机器人主程序中的无限循环

c++ - 引用和指针有什么区别?

C++-MPIR : Fastest Log Function?