例如,我知道一个类似于“ 0x7f0fdd25d7d0”的地址,它表示具有已知python类类型的python对象。无论如何,要获取对象字段的值?
从gdb
文档中:
您可以使用命令
x
(用于“检查”)以几种格式中的任何一种来检查内存,而与程序的数据类型无关。
x/nfu addr
x addr
x
使用
x
命令检查内存。
n
,f
和u
是所有可选参数,用于指定要显示多少内存以及如何格式化内存;addr
是一个表达式,提供您要开始显示内存的地址。如果您使用默认值nfu
,则无需键入斜杠/
。几个命令为addr设置了方便的默认值。
n
,重复次数重复计数是一个十进制整数;默认值为1。它指定要显示的内存量(按单位计数
u
)。
f
,显示格式显示格式是打印,
s
(以零结尾的字符串)或i
(机器指令)使用的格式之一。x
最初的默认值为(十六进制)。每次使用x或print时,默认值都会更改。
u
,单位大小单位大小是以下任意一项
b
个字节。
h
半字(两个字节)。
w
字(四个字节)。这是初始默认值。
g
巨字(八个字节)。每次使用指定单位大小时
x
,该大小将在您下次使用时成为默认单位x
。(对于s
和i
格式,单位大小将被忽略,通常不会写入。)
addr
,起始显示地址
addr
是您希望GDB开始显示内存的地址。该表达式不必具有指针值(尽管可以);它始终被解释为内存字节的整数地址。有关表达式的更多信息,请参见表达式。的默认值addr
通常是在检查的最后一个地址之后-但是其他几个命令也设置了默认地址:info断点(到列出的最后一个断点的地址),info行(到一行的起始地址)和print (如果使用它来显示内存中的值)。例如,x/3uh 0x54320
请求显示三个h
内存半字(),格式为无符号十进制整数(u
),从地址0x54320开始。在堆栈指针上方x/4xw $sp
打印w
内存的四个单词()(此处,$sp
; 参见十六进制(x
)中的“寄存器”部分。由于表示单位尺寸的字母与指定输出格式的字母完全不同,因此您不必记住单位尺寸或格式是第一个。任一个命令都可以。输出规格
4xw
和4wx
含义完全相同。(但是,计数n必须排在最前面;`wx4'不起作用。)即使格式为
s
和的单位大小u被忽略i
,您仍可能要使用计数n;例如,3i
指定您要查看三个机器指令,包括任何操作数。反汇编命令提供了一种检查机器指令的替代方法。请参阅源代码和机器代码部分。x参数的所有默认值旨在简化每次您使用x时以最少的规格继续扫描内存的情况。例如,您使用检查了三个机器说明后
x/3i addr
,可以使用just检查接下来的七个机器说明x/7
。如果使用RET重复x命令,则重复计数n将再次使用;其他参数默认为x的连续使用。x命令打印的地址和内容不会保存在值历史记录中,因为它们太多了,它们会妨碍您的操作。而是,GDB使这些值可作为方便变量$ _和$的值供表达式随后使用。使用x命令后,最后检查的地址可用于方便变量$ _中的表达式中。经检查,该地址的内容可在便捷变量$中获得。
如果
x
命令具有重复计数,则保存的地址和内容来自最后打印的存储单元;如果在输出的最后一行上打印了多个单位,则此地址与最后打印的地址不同。
来源:ftp : //ftp.gnu.org/old-gnu/Manuals/gdb/html_chapter/gdb_9.html#SEC56
有关以下内容的更多文档gdb
:
23.2.2.4 Python中的类型
gdb使用类gdb.Type表示劣等类型。
gdb模块中提供了以下与类型相关的功能:
—函数:gdb.lookup_type(名称[,块])此函数通过其名称查找类型,该名称必须是字符串。
如果给出块,则在该范围内查找名称。否则,将在全局范围内进行搜索。
通常,此函数将返回gdb.Type的实例。如果找不到命名的类型,它将引发异常。
如果类型是结构或类类型或枚举类型,则可以使用Python字典语法访问该类型的字段。例如,如果some_type是具有结构类型的gdb.Type实例,则可以使用以下命令访问其foo字段:
bar = some_type['foo']
bar将是gdb.Field对象;有关gdb.Field类的描述,请参见下面Type.fields方法的描述。
Type的实例具有以下属性:
—变量:Type.code此类型的类型代码。类型代码将是下面定义的TYPE_CODE_常量之一。
—变量:Type.name此类型的名称。如果此类型没有名称,则返回None。
—变量:Type.sizeof此类的大小,以目标字符单位为单位。通常,目标的char类型将是8位字节。但是,在某些不常见的平台上,此类型的大小可能有所不同。
—变量:Type.tag此类型的标签名称。标记名称是在C和C ++中struct,union或enum之后的名称;并非所有语言都有这个概念。如果此类型没有标签名称,则返回None。
提供以下方法:
—功能:Type.fields()对于结构和联合类型,此方法返回字段。范围类型有两个字段,最小值和最大值。枚举类型每个枚举常量具有一个字段。函数和方法类型的每个参数都有一个字段。C ++类的基本类型也表示为字段。如果类型没有字段,或者不属于这些类别之一,则将返回一个空序列。
每个字段都是一个gdb.Field对象,具有一些预定义的属性:
bitpos此属性不适用于枚举或静态(如C ++或Java)字段。该值是从包含类型的开头开始的位置(以位为单位)。enumval此属性仅可用于枚举字段,其值是枚举成员的整数表示形式。name字段名称,对于匿名字段则为None。人工的如果字段是人工的,则为True,通常意味着它是由编译器而不是用户提供的。始终提供此属性,如果该字段不是人工的,则为False。is_base_class如果该字段表示C ++结构的基类,则为True。始终提供此属性,如果字段不是作为字段参数的类型的基类,或者该类型不是C ++类,则为False。bitssize如果该字段是压缩字段或者是位字段,那么它将具有一个非零值,该值是字段的大小(以位为单位)。否则,它将为零;否则为0。在这种情况下,字段的大小由其类型给定。type字段的类型。这通常是Type的实例,但在某些情况下可以为None。parent_type包含此字段的类型。这是gdb.Type。—函数:Type.array(n1 [,n2])返回一个新的gdb.Type对象,该对象表示此类型的数组。如果给定一个参数,则它是数组的包含上限。在这种情况下,下限为零。如果给定两个参数,则第一个参数是数组的下限,第二个参数是数组的上限。数组的长度不能为负,但范围可以为负。
—函数:Type.vector(n1 [,n2])返回一个新的gdb.Type对象,该对象表示此类型的向量。如果给定一个参数,则它是向量的包含上限。在这种情况下,下限为零。如果给定两个参数,则第一个参数是向量的下限,第二个参数是向量的上限。向量的长度不能为负,但范围可以为负。
数组与向量之间的区别在于,数组的行为类似于C:在表达式中使用时,它们会衰减为指向第一个元素的指针,而向量则被视为第一类值。
—函数:Type.const()返回一个新的gdb.Type对象,该对象表示此类型的const限定变体。
—函数:Type.volatile()返回一个新的gdb.Type对象,该对象表示此类型的volatile限定的变体。
—函数:Type.unqualified()返回一个新的gdb.Type对象,该对象表示此类型的不合格变体。也就是说,结果既不是常量也不是易失的。
—函数:Type.range()返回一个Python Tuple对象,该对象包含两个元素:参数类型的下限和该类型的上限。如果类型不具有范围,则gdb将引发gdb.error异常(请参阅异常处理)。
—函数:Type.reference()返回一个新的gdb.Type对象,该对象表示对此类型的引用。
—函数:Type.pointer()返回一个新的gdb.Type对象,该对象表示此类型的指针。
—函数:Type.strip_typedefs()在删除所有类型的typedef后,返回一个表示真实类型的新gdb.Type。
—函数:Type.target()返回一个新的gdb.Type对象,该对象表示此类型的目标类型。
对于指针类型,目标类型是指向对象的类型。对于数组类型(意味着类似C的数组),目标类型是数组元素的类型。对于函数或方法类型,目标类型是返回值的类型。对于复杂类型,目标类型是元素的类型。对于typedef,目标类型是别名类型。
如果类型没有目标,则此方法将引发异常。
—函数:Type.template_argument(n [,block])如果此gdb.Type是模板的实例化,则将返回一个新的gdb.Value或gdb.Type,它表示第n个模板参数的值(索引起始于0)。
如果此gdb.Type不是模板类型,或者该类型的模板参数少于n个,则将引发异常。通常,只有C ++代码将具有模板类型。
如果给出块,则在该范围内查找名称。否则,将在全局范围内进行搜索。
—函数:Type.optimized_out()返回此类型的gdb.Value实例,其值已被优化掉。这允许帧装饰器指示未知的参数或局部变量的值。
每种类型都有一个代码,指示该类型属于什么类别。可用的类型类别由gdb模块中定义的常量表示:
gdb.TYPE_CODE_PTR类型是一个指针。
gdb.TYPE_CODE_ARRAY类型是一个数组。
gdb.TYPE_CODE_STRUCT类型是结构。
gdb.TYPE_CODE_UNION类型是联合。
gdb.TYPE_CODE_ENUM类型是枚举。
gdb.TYPE_CODE_FLAGS位标志类型,用于状态寄存器之类的东西。
gdb.TYPE_CODE_FUNC类型是一个函数。
gdb.TYPE_CODE_INT该类型是整数类型。
gdb.TYPE_CODE_FLT浮点类型。
gdb.TYPE_CODE_VOID特殊类型void。
gdb.TYPE_CODE_SET Pascal集类型。
gdb.TYPE_CODE_RANGE范围类型,即带边界的整数类型。
gdb.TYPE_CODE_STRING字符串类型。请注意,这仅适用于具有语言定义的字符串类型的某些语言。C字符串不以这种方式表示。
gdb.TYPE_CODE_BITSTRING一串位。不推荐使用。
gdb.TYPE_CODE_ERROR类型未知或错误。
gdb.TYPE_CODE_METHOD一种方法类型,可以在C ++或Java中找到。
gdb.TYPE_CODE_METHODPTR指向成员函数的指针。
gdb.TYPE_CODE_MEMBERPTR指向成员的指针。
gdb.TYPE_CODE_REF引用类型。
gdb.TYPE_CODE_CHAR字符类型。
gdb.TYPE_CODE_BOOL布尔类型。
gdb.TYPE_CODE_COMPLEX一个复杂的浮点类型。
gdb.TYPE_CODE_TYPEDEF某种其他类型的typedef。
gdb.TYPE_CODE_NAMESPACE C ++名称空间。
gdb.TYPE_CODE_DECFLOAT十进制浮点类型。
gdb.TYPE_CODE_INTERNAL_FUNCTION gdb内部的函数。这是用于表示便利功能的类型。gdb.types Python模块提供了对类型的进一步支持(请参阅gdb.types)。
来源:https : //sourceware.org/gdb/onlinedocs/gdb/Types-In-Python.html
有关的:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句