gdb からのコア ダンプのデバッグを自動化する Python スクリプトを作成しています。カーネル データ構造とリスト (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 print this structureを使用しています:
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 の内容を出力するにはどうすればよいでしょうか?
編集済み:私の質問をより明確にするために
gdb からのコア ダンプのデバッグを自動化する Python スクリプトを作成しています。カーネル データ構造とリスト (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 のすべてのメンバーの値が 1 つのレベルまで出力されます。つまり、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
だから私はこれらのステップを自動化したい。構造体 my_struct を反復処理し、ポインター、配列、およびリストの値も自動的に出力できる gdb-python API または方法はありますか?
ありがとう。