如果您使用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
之外的其他屬性,如果您想報告有關結構佈局的其他詳細信息,那麼這些屬性也可能是有用的。