2011-10-12 10 views
5

Mam wersję debugowania programu (VM JavaScript V8) i chcę zrozumieć, jak instancje niektórych klas są rozmieszczone w pamięci. Mogę konstrukcje całkiem-print, takie jak ten:Jak mogę zobaczyć, jak klasa C++ rozłożona jest w pamięci za pomocą gdb?

(gdb) print thread_local 
$6 = { 
    blocks_ = { 
    data_ = 0x868ceb0, 
    capacity_ = 7, 
    length_ = 1 
    }, 
    entered_contexts_ = { 
    data_ = 0x868d828, 
    capacity_ = 1, 
    length_ = 1 
    }, 
    saved_contexts_ = { 
    data_ = 0x868d838, 
    capacity_ = 1, 
    length_ = 1 
    }, 
    spare_ = 0x0, 
    ignore_out_of_memory_ = false, 
    call_depth_ = 1, 
    handle_scope_data_ = { 
    next = 0x0, 
    limit = 0x0, 
    level = 0 
    } 
} 

ale chcę wiedzieć, gdzie te różne członkowie (bloki, entered_contexts, etc.) są fizycznie względem początku obiektu. W systemach opartych na Solaris, MDB może zrobić dla struktur C tak:

> ::print -at port_event_t 
0 port_event_t { 
    0 int portev_events 
    4 ushort_t portev_source 
    6 ushort_t portev_pad 
    8 uintptr_t portev_object 
    10 void *portev_user 
} 

W tym przykładzie, każde pole jest poprzedzona jego przesunięcie od początku struktury. Chcę zrobić to samo dla klas C++. gdb musi mieć te informacje, aby wydrukować członków struktury, ale czy jest jakiś sposób, aby go wyświetlić?

Czy istnieje inny sposób wykonania tej czynności dla uruchomionego programu?

Odpowiedz

4

Możesz zawsze wydrukować adres każdego członka i this, aby samemu go znaleźć (używaj &, aby uzyskać adres członka, tak jak w samym języku).

0

Jedynym sposobem znam jest x /<number of bytes>x <variable name>

To daje zrzut szesnastkowy to jest do ciebie, aby odczytać strukturę.

2

Chciałbym wiedzieć.

Możesz użyć ptype do listy członków. Następnie można wytwarzać offsetof biedny człowiek jest tak:

(gdb) p/a &((my_struct_*)0)->my_member 

(gdb) p/a &((struct sk_buff*)0)->iif 
$7 = 0x74 
0

Zastosowanie pahole (nie jest częścią GDB).

Inna możliwość to pahole.py (jeszcze nie zatwierdzona).

+0

Dziękuję. Wygląda to bardzo interesująco. –

Powiązane problemy