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