Как получить базовый тип переменной с помощью GDB / MI - PullRequest
2 голосов
/ 11 августа 2011

Используя машинный интерфейс GDB, есть ли способ получить базовый тип для определенной переменной? Например, если у меня есть переменная, тип которой является uint32_t (из types.h), есть ли способ заставить GDB сказать мне, что либо базовый тип этой переменной является беззнаковым long int, либо, альтернативно, что uint32_t имеет typedef к беззнаковому длинному int?

Ответы [ 2 ]

9 голосов
/ 11 августа 2011

Вы можете использовать команду whatis

предположим, что у вас

typedef unsigned char BYTE;
BYTE var;

(gdb)whatis var
type = BYTE
(gdb)whatis BYTE
BYTE = unsigned char
0 голосов
/ 11 августа 2011

Я очень мало знаю о GDB / MI;Следующие хаки используют Python, чтобы обойти MI, будучи вызванными из команды MI -interpreter-exec.Вероятно, не то, что вы представляли.

Я не видел ничего очевидного в документации MI -var-info-type, кажется, не делает то, что вы хотите, и это похоже на ошибку 8143 (или ядолжен сказать, что возможно, если ошибка 8143 была реализована):

http://sourceware.org/bugzilla/show_bug.cgi?id=8143

Часть 1 : реализовать команду, которая делает то, что вы хотите в python.

# TODO figure out how to do this without parsing the the normal gdb type = output

class basetype (gdb.Command):
    """prints the base type of expr"""

    def __init__ (self):
        super (basetype, self).__init__ ("basetype", gdb.COMMAND_OBSCURE);

    def call_recursively_until_arg_eq_ret(self, arg):
        x = arg.replace('type = ', "")
        x = gdb.execute("whatis " + x, to_string=True)
        if arg != x:
          x = self.call_recursively_until_arg_eq_ret(x).replace('type = ', "")
        return x

    def invoke (self, arg, from_tty):
        gdb.execute("ptype " + self.call_recursively_until_arg_eq_ret('type = ' + arg).replace('type = ', ""))


basetype ()

Часть 2 : выполнить его с помощью консольного интерпретатора

source ~/git/misc-gdb-stuff/misc_gdb/base_type.py
&"source ~/git/misc-gdb-stuff/misc_gdb/base_type.py\n"
^done
-interpreter-exec console "basetype y"
~"type = union foo_t {\n"
~"    int foo;\n"
~"    char *y;\n"
~"}\n"
^done
-interpreter-exec console "whatis y"
~"type = foo\n"
^done

Часть 3 :

Обратите внимание на ограничения части 2ваш вывод идет в поток stdout.Если это неприемлемо, вы можете подключить второй выходной канал из gdb для использования с вашим интерфейсом и записать его с помощью python.используя что-то вроде витой матрицы или файла.

Вот пример использования витой матрицы, вам просто нужно переключить ее, чтобы направить вывод 'basetype' туда, куда вы хотите.https://gitorious.org/misc-gdb-stuff/misc-gdb-stuff/blobs/master/misc_gdb/twisted_gdb.py

в противном случае вы могли бы проанализировать поток stdout, я полагаю, в любом случае его хаки хаки.надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...