2011-08-05 27 views
7

Tôi đang viết một dự án C++ và xây dựng một DAG của các kiểu liên quan đến kế thừa khác nhau. Tôi đã đặt một breakpoint sau khi xây dựng và tôi muốn xem DAG. Trình gỡ lỗi tuy nhiên sẽ chỉ hiển thị lớp cơ sở. Nó sẽ đặt tên loại có nguồn gốc nhiều nhất bên cạnh mục nhập __vfptr, nhưng tôi không thể xem nội dung đó và xác minh rằng chúng là những gì tôi mong đợi. Có cách nào để xem loại xuất phát nhất trong cửa sổ Người dân địa phương trực tiếp không?Xem hầu hết các loại có nguồn gốc trong trình gỡ lỗi

Tôi đang nhắm mục tiêu x64, nếu điều đó có liên quan.

+0

Trình gỡ rối chỉ có thể đoán ở loại thực tế, C++ không hỗ trợ sự phản chiếu. Sử dụng biểu thức truyền: * (foo *) ptr –

+0

@Hans: Trình gỡ lỗi biết loại chính xác. Ngoài bất kỳ đối số lý thuyết nào tôi có thể thực hiện, nó có nghĩa là đặt tên chính xác loại trong trình gỡ rối. Nó nói rõ ràng '__vfptr (loại có nguồn gốc nhiều nhất)'. Tôi chỉ không thể * khám phá * giá trị. – Puppy

+0

Nó biết chính xác loại con trỏ v-table, nó có thể nói từ giá trị của nó. Những gì nó không biết là loại đối tượng có chứa con trỏ đó. Bạn đã thử các diễn viên (nó đã nhai, '* (foo *) ptr') –

Trả lời

2

Cách duy nhất có vẻ hiệu quả đối với tôi là cho trình gỡ lỗi hiển thị đúng đối tượng với trợ giúp của autoexp.dat. Bạn không chắc chắn nó sẽ hoạt động tốt như thế nào trong vs2010, tôi vẫn đang sử dụng 2008. Phương pháp này rất phù hợp cho các con trỏ thông minh. Nếu bạn đang cố gắng nhìn vào bên trong con trỏ thô thì tôi đoán, bạn cần phải tự tạo con trỏ trong cửa sổ đồng hồ/xem nhanh. Nếu đó là một số loại smartpointer hoặc một lớp lưu trữ mà con trỏ cơ sở liệu thì bạn có thể chỉ đơn giản là làm cho nó thực hiện với autoexp.dat theo cách này (giả định rằng ptr cơ sở của bạn được gọi là m_ptr):

smart_ptr<*>{ 
preview 
(
    #if (($e.m_ptr)!=0) 
    (
    #(
     "smart_ptr ", 
     (*(($T1 *)$e.m_ptr)) 
    ) 
    ) 
    #else 
    (
     #("<Bad Ptr>") 
    ) 
) 
children 
(
    #(
     ptr: (*(($T1 *)$e.m_ptr)) 
    ) 
) 

}

Các vấn đề liên quan