2011-08-05 21 views
7

Estoy escribiendo un proyecto en C++ y creando un DAG de varios tipos relacionados con la herencia. He colocado un punto de interrupción después de la construcción y me gustaría ver el DAG. Sin embargo, el depurador solo mostrará la clase base. Nombrará el tipo más derivado junto a la entrada __vfptr, pero no puedo ver sus contenidos y verificar que sean lo que espero que sean. ¿Hay alguna manera de ver el tipo más derivado en la ventana Locales directamente?Ver el tipo más derivado en el depurador

Estoy orientada a x64, si es relevante.

+0

El depurador solo puede adivinar el tipo real, C++ no admite la reflexión. Use una expresión moldeada: * (foo *) ptr –

+0

@Hans: el depurador conoce el tipo exacto. Aparte de cualquier argumento teórico que pueda hacer, literalmente nombra el tipo exacto en el depurador. Dice claramente '__vfptr (tipo más derivado)'. Simplemente no puedo * explorar * el valor. – Puppy

+0

Conoce el tipo exacto del puntero de la tabla v, puede determinar su valor. Lo que no sabe es el tipo de objeto que contiene ese puntero. ¿Has probado el elenco (se ha comido, '* (foo *) ptr') –

Respuesta

2

La única manera que parece funcionar para mí es decirle a depurador que muestre objetos correctamente con la ayuda de autoexp.dat. No estoy seguro de qué tan bien funcionará en vs2010, todavía estoy usando 2008. Este método es muy adecuado para punteros inteligentes. Si está tratando de mirar dentro de los punteros crudos, entonces, supongo que debe lanzar manualmente el puntero en la ventana del reloj/reloj rápido. Si se trata de algún tipo de SmartPointer o una clase que almacena ese puntero de base cruda, entonces solo puede lograr que se haga con autoexp.dat esta manera (suponiendo que su base se denomina PTR 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)) 
    ) 
) 

}

Cuestiones relacionadas