Найти абсолютные смещения вложенных структур с помощью GDB- Python Types API - PullRequest
1 голос
/ 28 февраля 2020

Я пытаюсь исследовать структуру памяти типов данных, используя 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;

Используя команду ptype в gdb, я получаю:

(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.

Я пытаюсь получить те же результаты, используя API типа GDB Python, но безуспешно. В частности, я использую метод gdb.types.deep_items (lookup_type), который возвращает относительные смещения полей вложенной структуры, то есть 0 для первого поля (x) и 8 для второго поля (y).

Есть ли способ получить 8 для x и 16 для y (как показывает вывод ptype), используя GDB Python API?

Спасибо

1 Ответ

0 голосов
/ 28 февраля 2020

Я не могу проверить прямо сейчас, но если я правильно помню, этот плагин для 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...