Estoy intentando depurar algún código C++ basado en STL en gdb. El código tiene algo así comoAgregar funciones en gdb en tiempo de ejecución
int myfunc()
{
std::map<int,int> m;
...
}
Ahora en GDB, dentro myfunc el uso de "impresión m" da algo muy feo. Lo que he visto recomendada es algo así como la compilación de
void printmap(std::map<int,int> m)
{
for(std::map<int,int>::iterator it = ...)
{
printf("%d : %d", it->first, it->second);
}
}
Luego, en GDB haciendo
(gdb) call printmap(m)
Esto parece una buena manera de manejar el problema ... pero puedo poner en un printmap separada objeto archivo (o incluso biblioteca dinámica) que luego cargo en gdb en tiempo de ejecución en lugar de compilarlo en mi binario, ya que recompilar el binario cada vez que quiero ver otra variable STL no es divertido ... mientras compilo y cargo uno. o archivo para la rutina de impresión puede ser aceptable.
ACTUALIZACIÓN:
Impulsada por sugerencia de Nikolais estoy mirando dlopen/dlsym.
Así que todavía no lo tengo funcionando, pero parece que me estoy acercando.
En printit.cpp
#include <stdio.h>
extern "C" void printit()
{
printf("OMG Fuzzies");
}
Compilar a un .so usando
g++ -Wall -g -fPIC -c printit.cpp
g++ -shared -Wl,-undefined,dynamic_lookup -o printit.so printit.o
Iniciar mi aplicación de prueba y cargar el .so dlopen (2 = RTLD_NOW) y luego tratar de conseguir el símbolo para una función de depuración usando dlsym.
(gdb) break main
(gdb) run
(gdb) print (void*) dlopen("printit.so", 2)
$1 = (void *) 0x100270
(gdb) print (void*) dlsym(0x100270, "_printit")
$2 = (void *) 0x0
Tan cerca pero por alguna razón no puedo conseguir ese símbolo ... (No puedo siquiera entiendo si pongo las llamadas dlopen/dlsym en mi ejecutable) que supongo que estoy bien compilar el lib incorrecto o usando dlsym incorrectamente.
Si puedo conseguir el símbolo Asumo que puedo llamar a la función usando algo como
(gdb) print ((void(*)())(0x....))()
Estoy compilando esta en OS X 10.4, lo que podría estar causando un poco de mi .so males. .. Cualquier indicador sería apreciada.
Averigüe cómo hacer que todo esto funcione. Han publicado como una solución a continuación.
Sí, realmente no me importa si la llamada copia los argumentos o no. Pero esta solución todavía no es práctica para mí, ya que si quiero ver otra clase de STL necesito recompilar mi binario y reiniciar gdb. Sin embargo, puede estar en algo con el uso de dlopen. Investigaré más a fondo. –
Oh, querías una solución * ahora *, sin siquiera salir de la consola gdb? Los niños de hoy en día ... :) –