c++ - Examine boost shared_ptr con gdb
shared-ptr (4)
Cuando compile use la opción -ggdb y vea si eso funciona
http://sourceware.org/gdb/onlinedocs/gdb/Inline-Functions.html
La inclusión es una optimización que inserta una copia del cuerpo de la función directamente en cada sitio de llamada, en lugar de saltar a una rutina compartida. gdb muestra las funciones en línea al igual que las funciones no en línea. Aparecen en backtraces. Puedes ver sus argumentos y variables locales, entrar en ellos con paso, omitirlos con el siguiente y escapar de ellos con finalización. Puede verificar si una función estaba en línea usando el comando de marco de información.
Para que gdb admita funciones en línea, el compilador debe registrar información sobre el ingreso en la información de depuración: gcc que usa el formato dwarf 2 hace esto, y otros compiladores también lo hacen. gdb solo admite funciones en línea cuando se usa dwarf 2. Las versiones de gcc anteriores a 4.1 no emiten dos atributos necesarios (''DW_AT_call_file'' y ''DW_AT_call_line''); gdb no muestra llamadas de función en línea con versiones anteriores de gcc. En su lugar, muestra los argumentos y las variables locales de las funciones en línea como variables locales en la persona que llama.
El cuerpo de una función en línea se incluye directamente en su sitio de llamada; a diferencia de una función no integrada, no hay instrucciones dedicadas a la llamada. gdb aún simula que el sitio de llamada y el inicio de la función en línea son instrucciones diferentes. Al pasar al sitio de llamada, se muestra el sitio de llamada y luego, nuevamente, se muestra la primera línea de la función en línea, aunque no se ejecutan instrucciones adicionales.
Esto hace que la depuración a nivel de origen sea mucho más clara; Puede ver tanto el contexto de la llamada como el efecto de la llamada. Solo el paso por una sola instrucción usando stepi o nexti no hace esto; Los pasos de instrucciones individuales siempre muestran el cuerpo en línea.
Hay algunas maneras en que gdb no pretende que las llamadas de función en línea sean lo mismo que las llamadas normales:
La configuración de puntos de interrupción en el sitio de llamada de una función en línea puede no funcionar, porque el sitio de llamada no contiene ningún código. gdb puede mover incorrectamente el punto de interrupción a la siguiente línea de la función de cierre, después de la llamada. Esta limitación se eliminará en una versión futura de gdb; hasta entonces, establezca un punto de interrupción en una línea anterior o dentro de la función en línea en su lugar. gdb no puede localizar el valor de retorno de las llamadas en línea después de usar el comando de finalización. Esta es una limitación de la información de depuración generada por el compilador; después de terminar, puede pasar a la siguiente línea e imprimir una variable donde su programa almacenó el valor de retorno.
El siguiente es mi código fuente:
#include <iostream>
#include <boost/shared_ptr.hpp>
class MyClass
{
public:
MyClass()
{
i=10;
}
private:
int i;
};
int main(int argc, const char *argv[])
{
boost::shared_ptr <MyClass> obj(new MyClass());
return 0;
}
Quiero examinar obj en gdb y ver el valor de la variable miembro i.
Esto es lo que consigo con la impresión normal:
29 boost::shared_ptr <MyClass> obj(new MyClass());
(gdb) n
30 return 0;
(gdb) p obj
$1 = {px = 0x602010, pn = {pi_ = 0x602030}}
He intentado la punta mencionada en este enlace , pero no funciona.
(gdb) call (obj.get())->print()
Cannot evaluate function -- may be inlined
¿Hay alguna otra manera? La versión gdb es 7.0.1.
Esto va a ser difícil de responder. GDB 7.x agregó soporte para scripts de Python. Hay algunos recursos en la web. En lugar de hacer un pobre intento de asesorar sobre algo en lo que no tengo experiencia, lo referiré a una publicación anterior:
Lo tengo.!
(gdb) set print pretty
(gdb) p obj
$5 = {
px = 0x602010,
pn = {
pi_ = 0x602030
}
}
(gdb) p obj.px
$6 = (MyClass *) 0x602010
(gdb) p *(obj.px)
$7 = {
i = 10
}
Prueba esto:
imprimir (* obj.px) .i
El código completo está abajo:
(gdb) list 1,23
1 #include <iostream>
2 #include <boost/shared_ptr.hpp>
3 #include <string>
4
5 class MyClass
6 {
7 public:
8 MyClass()
9 : name("Testing")
10 {
11 i=10;
12 }
13 private:
14 int i;
15 std::string name;
16 };
17
18
19 int main(int argc, const char *argv[])
20 {
21 boost::shared_ptr <MyClass> obj(new MyClass());
22 return 0;
23 }
(gdb) p obj
$9 = {px = 0x602010, pn = {pi_ = 0x602060}}
(gdb) p (*obj.px).i
$10 = 10
(gdb) p (*obj.px).name
$11 = {static npos = 18446744073709551615,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x602048 "Testing"}}