2011-10-12 1 views
5

프로그램의 디버그 빌드 (V8 JavaScript VM)가 있는데 특정 클래스의 인스턴스가 메모리에 어떻게 배치되어 있는지 알고 싶습니다. 이 같은 꽤 인쇄 구조 할 수 있습니다어떻게하면 C++ 클래스가 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 
    } 
} 

하지만 난 그 다양한 회원 (블록, entered_contexts 등), 물리적 객체의 시작에 상대적 위치를 알고 싶어요. 솔라리스 기반 시스템 MDB 좋아해서 C 구조체를 위해이를 수행 할 수

> ::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 
} 

그런 예에서, 각각의 필드는 그 구조의 시작으로부터 오프셋 접두어. C++ 클래스에서도 동일한 작업을 수행하려고합니다. gdb는 구조체 멤버를 출력하기 위해이 정보를 가지고 있어야하지만 그것을 볼 수있는 방법이 있습니까?

다른 방법으로 실행중인 프로그램에 대해이 작업을 수행 할 다른 방법이 있습니까?

답변

4

각 구성원의 주소와 this을 직접 인쇄하여 (언어 자체와 마찬가지로 &을 사용하여 회원 주소를 얻을 수 있습니다.)

0

내가 아는 유일한 방법은의 x /<number of bytes>x <variable name>

이 그것의 구조를 읽는 당신에게 달려 당신에게 헥스 덤프를 줄 것입니다.

2

알고 싶습니다.

회원을 나열하려면 ptype을 사용할 수 있습니다.

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

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

사용 pahole (GDB의 일부) : 그럼 당신은 이런 가난한 사람의을 offsetof를 조작 할 수 있습니다.

다른 가능성은 pahole.py (아직 커밋되지 않음)입니다.

+0

감사합니다. 이것은 매우 흥미있어 보인다. –

관련 문제