c++ - ¿Cómo examino el contenido de un std:: vector en gdb, usando el compilador icc?
stl (3)
No estoy seguro de que esto funcione con tu vector, pero funcionó para mí.
#include <string>
#include <vector>
int main() {
std::vector<std::string> vec;
vec.push_back("Hello");
vec.push_back("world");
vec.push_back("!");
return 0;
}
gdb:
(gdb) break source.cpp:8
(gdb) run
(gdb) p vec.begin()
$1 = {
_M_current = 0x300340
}
(gdb) p $1._M_current->c_str()
$2 = 0x3002fc "Hello"
(gdb) p $1._M_current +1
$3 = (string *) 0x300344
(gdb) p $3->c_str()
$4 = 0x30032c "world"
Quiero examinar el contenido de un std :: vector en gdb pero no tengo acceso a _M_impl porque estoy usando icc, no gcc, ¿cómo lo hago? Digamos que es un estándar :: vector por el bien de la simplicidad.
Aquí hay una respuesta muy buena , pero esto no funciona si uso icc, el mensaje de error es "No hay miembro o método llamado _M_impl". Parece que hay un buen conjunto de herramientas de depuración aquí, pero también se basa en _M_impl.
En general, cuando trato las clases de contenedor en un depurador, construyo una referencia al elemento, como una variable local, por lo que es fácil de ver en el depurador, sin desordenar en la implementación del contenedor.
Aquí hay un ejemplo artificial.
vector<WeirdStructure> myWeird;
/* push back a lot of stuff into the vector */
size_t z;
for (z = 0; z < myWeird.size(); z++)
{
WeirdStructure& weird = myWeird[z];
/* at this point weird is directly observable by the debugger */
/* your code to manipulate weird goes here */
}
Esa es la expresión que uso.
La plantilla std::vector
garantiza que los datos se almacenan contiguamente . Si toma la dirección del elemento frontal (por ejemplo, &v[0]
, por ejemplo), puede acceder a cualquier otro elemento en el vector a través de una matriz de estilo C. Eso no requiere que tenga el código fuente de la STL disponible para su depurador.
Después de jugar con esto, parece que v.front()
y v.begin()
están probablemente en línea y GDB no los está encontrando. Seguiré buscando, pero personalmente simplemente agregaría la línea int* i = &v[0]
al archivo fuente, y luego usaré los comandos GDB en i
durante la depuración. Tenga en cuenta que el compilador es libre de eliminar ese código muerto. Puede que necesite generar el valor de i
para evitar eso, o simplemente no aumentar las optimizaciones.