¿Cómo se puede depurar el código de C++ 11 con unique_ptr en DDD(o gdb)?
c++11 unique-ptr (1)
Este problema en realidad no está relacionado con C ++ 11, unique_ptr o la impresión bonita. El problema es que gcc no emite código para std :: unique_ptr :: operator * que podría ser llamado por gdb para eliminar la referencia de unique_ptr. Si, por ejemplo, agrega *pTest;
a su código, entonces gdb realiza la desreferenciación.
Un problema similar se describe en la publicación de SO Cómo ''imprimir'' / evaluar funciones de plantillas de C ++ en gdb . Casi el mismo problema se describe para un auto_ptr en https://sourceware.org/ml/archer/2012-q1/msg00003.html . Si entiendo el hilo correctamente, una solución alternativa sería aplicarle un parche a la bonita impresora y también imprimir el puntero sin referencia al imprimir el unique_ptr. Un informe de error gdb se puede encontrar en http://sourceware.org/bugzilla/show_bug.cgi?id=12937 .
El wiki de gdb en https://sourceware.org/gdb/wiki/STLSupport describe soluciones de impresión más bonitas, que podrían tener otras soluciones.
Editar: Una solución más elegante que obliga al compilador a emitir código para todas las plantillas miembro, incluido el operador *, es crear una instancia explícita de la clase:
template class std::unique_ptr<MyType>;
std::unique_ptr
son agradables, pero los encuentro menos cómodos al depurar DDD o gdb .
Estoy usando las impresoras bonitas gdb que son parte de gcc (por ejemplo, /usr/share/gcc-4.8.2/python/libstdcxx/v6/printers.py
). Esa es una gran victoria para la legibilidad, por ejemplo:
$ print pTest
std::unique_ptr<MyType> containing 0x2cef0a0
Sin embargo, desreferenciar el puntero no funciona:
$ print *pTest
Could not find operator*.
Cuando necesito acceder al valor, tengo que copiar manualmente el puntero y convertirlo al tipo correcto, por ejemplo:
print *((MyType*) 0x2cef0a0)
Si el proceso aún se está ejecutando, esta versión funciona (aún fea pero mejor):
print *pTest.get() // will not work if analyzing a core dump
El enfoque sencillo para Display *pTest
en DDD tampoco funciona. Solo da como resultado el siguiente error:
<error: Could not find operator*.>
¿Hay alguna forma de depurar el código de C ++ 11 con unique_ptr en DDD (sin interrumpir el flujo de trabajo como lo hago con mis soluciones engorrosas)?
No tengo miedo de usar comandos gdb, pero la integración DDD sería un plus. Por ejemplo, seguir los punteros en estructuras de datos simplemente haciendo doble clic en ellos es a menudo más rápido que escribir.
Ya traté de descartar la linda impresora, pero tampoco es óptima. Lo mejor que se me ocurre es lo siguiente:
print pTest._M_t->_M_head_impl