2011-08-10 42 views
1

使用GDB機器接口,是否有一種方法可以獲取特定變量的基本類型?例如,如果我有一個類型爲uint32_t(來自types.h)的變量,有沒有辦法讓GDB告訴我該變量的基本類型是unsigned long int,或者uint32_t是typedef'ed一個unsigned long int?如何使用GDB/MI獲取變量的基本類型

+0

FWIW,通常稱爲「基本類型」,而不是「基本類型」AFAIK。對不起,沒有答案。 –

+1

Quibble:'uint32_t'來自''或''。 –

回答

8

您可以使用 「頭朝下」 命令

假設你有

typedef unsigned char BYTE; 
BYTE var; 

(gdb)whatis var 
type = BYTE 
(gdb)whatis BYTE 
BYTE = unsigned char 
0

我知道很少GDB/MI;下面的黑客使用python來避開MI,同時可以從MI'-interpreter-exec'命令中調用。可能不是你想象的。

我在MI文檔中沒有看到任何明顯的東西-var-info-type看起來沒有做你想做的事情,這和bug 8143類似(或者如果bug 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流我想,無論哪種方式其黑客入侵。 希望有所幫助。

相關問題