我正在编写一个 python 脚本来自动从 gdb 调试核心转储。我正在尝试打印包含内核数据结构和列表的数据结构(例如 struct list_head)。例如结构是这样的:
struct my_struct {
struct my_hardware_context ahw;
struct net_device *netdev;
struct pci_dev *pdev;
struct list_head mac_list;
....
....
};
我正在使用以下 API tp 打印此结构:
gdb.execute('p (*(struct my_struct *)dev_base->priv)')
所以我可以自动打印'struct my_struct'、struct my_hardware_context ahw 的内容,但不能打印指针和列表的内容(例如struct net_device *netdev、struct pci_dev *pdev、struct list_head mac_list)(只打印地址)。那么如何使用 gdb-python 脚本打印 *netdev、*pdev 和 mac_list 的内容呢?
编辑:让我的问题更清楚
我正在编写一个 python 脚本来自动从 gdb 调试核心转储。我正在尝试打印包含内核数据结构和列表的数据结构(例如 struct list_head)。例如结构是这样的:
struct my_struct {
struct my_hardware_context ahw;
struct net_device *netdev;
struct pci_dev *pdev;
struct list_head mac_list;
....
....
};
我正在使用以下 API 来打印此结构:(可以假设我有正确的核心转储并添加了正确的符号。
main_struct = gdb.execute('p (*(struct my_struct *)dev_base->priv)')
print main_struct
现在它将打印 struct my_struct 的所有成员的值,但最多打印一级,这意味着它将打印 struct my_hardware_context ahw 的全部内容,因为它是一个实例,但它不会打印 struct net_device *netdev、struct pci_dev *pdev 的内容, struct list_head mac_list 等,所以现在我需要手动执行如下操作:
netdev = gdb.parse_and_eval('*(*(struct my_struct *)dev_base->next->priv).netdev')
print netdev
pdev = gdb.parse_and_eval('*(*(struct my_struct *)dev_base->next->priv).pdev')
print pdev
所以我想自动化这些步骤。是否有任何 gdb-python API 或方法可以迭代 struct my_struct 并自动打印指针、数组和列表值?
谢谢。