如果您使用Python来定义offsetof
,你可能会像这样开始:
import gdb
class offsetof(gdb.Command):
def invoke(self, args, from_tty):
value, name = args.split()
struct = gdb.parse_and_eval(value)
fields = { field.name: field for field in struct.type.fields() }
gdb.write("{} offset: {} bits\n".format(name, fields[name].bitpos))
offsetof("offsetof", gdb.COMMAND_USER)
如果您保存到一个文件,并确保该目录下保存它是在sys.path
,你可以导入它。例如,如果你把它保存到你的主目录,你可能会做一些沿着这些路线:
(gdb) pi
>>> import os
>>> sys.path.insert(0, os.getenv('HOME'))
>>> import offsetof
>>>
(gdb)
如果你的GDB没有pi
命令,你可以在前面加上python
每个命令后一个>>>
提示。
如果gdb输入offsetof
而没有投诉,那么您应该能够调用offsetof
作为gdb命令。正如所写,它期望两个参数(空格分隔),一个值和一个名字。如果该值是一个具有提供名称的字段的结构,则它将报告偏移量(不是字节,因为基础Python代码可以处理位域)。
这里的代码可以改进。除了它从它调用的代码继承的东西之外,它没有真正的错误处理,并且它不会处理指针。
This page描述了该示例中使用的一些底层代码;它提到的target
方法可能会提供处理指针的开始(或者,您可以在传递的值中取消引用指针,即可指定*this
而不是this
作为第一个参数)。 Type.fields()
上的部分提到除bitpos
之外的其他属性,如果您想报告有关结构布局的其他详细信息,那么这些属性也可能是有用的。