2013-05-30 2 views
0

GDB-파이썬 스크립트를 사용하여 내부 커널 링크 된 목록을 반복하는 방법, 나는 커널 데이터 구조 및 목록 (예를 들어 구조체 list_head), 구조가GDB 파이썬 : 구조

인을 포함 데이터 구조를 인쇄하는 것을 시도하고있다
struct my_struct { 
    struct my_hardware_context ahw; 
    struct net_device *netdev; 
    struct pci_dev *pdev; 
    struct list_head mac_list; 
    struct list_head wait_list; 
    .... 
    .... 
}; 

그래서이 구조체 my_struct를 반복하는 동안이 구조체 안에 연결된 목록이 있는지 확인하는 방법으로 gdb 매뉴얼에 연결된 목록의 TYPE_CODE_ 상수가 없습니다. 식별 된 경우 ID를 확인한 후 역 참조 구조체를 반복하는 동안 역 참조 된 구조체를 인쇄하는 방법 명부. 이 링크에서 scottt 코드를 사용하고 있습니다. gdb-python : Parsing structure's each field and print them with proper value, if exists

답변

0

프로그래머 만이 링크 된 목록임을 알고 있습니다. 심지어 C 컴파일러도 그렇지 않기 때문에 gdb가 알 수있는 방법이 없습니다.

이러한 필드를 연결된 목록으로 처리하는 예쁜 프린터를 작성할 수 있습니다. 가장 간단한 방법은 프린터에이 지식을 코딩하는 것입니다. 즉, 프린터의 "자식"메서드가 연결된 목록을 반복합니다.

다른 방법이있을 수 있습니다. 예를 들어 list_head 유형에 대해 별도의 예쁜 프린터를 만드는 경우가 있습니다.

+0

@ 트로이, 이것을 구현할 수 없습니다. 커널 목록 (예 : mac_list 또는 wait_list 등)의 내용을 인쇄하려면 적절한 유형으로 유형 변환해야합니다. 예 : 그것은이 같은 것 wait_list을 위해 : '(GDB) P는 * (qlcnic_wait_event_t *) (((구조체 my_struct *) dev_base->하는 next-> PRIV) .wait_list)' 나는이 유형을 발견하고 (qlcnic_wait_event_t) 소스 코드에서 수동으로 타입 변환합니다. 프로그래밍 방식으로 각 목록의 해당 유형을 얻을 수있는 방법이 있습니까? 견본을 제공해달라고 호소 해 주시겠습니까? 거기에'list_for_each_entry' 매크로가 gdb 파이썬에 구현되어 있습니까? –

+0

gdb와 함께 제공되는 list_for_each_entry가 없습니다. 어쩌면 하나는 파이썬과 함께 올 것이다. gdb는 컴파일러가 보는 것을 볼 뿐이므로 링크 된 목록에 올바른 유형을 추측 할 방법이 없습니다. 어떻게 든 당신 자신을 제공 할 수 있습니다. –