2009-08-26 13 views
7

Estoy tratando de entender cómo funciona una determinada biblioteca. Lo he compilado con mis instrucciones añadidas y todo es genial. Ahora quiero detener el programa de ejemplo durante el tiempo de ejecución para ver la pila de llamadas, pero no puedo entender cómo hacerlo con gdb. La función que quiero romper, está dentro de una biblioteca compartida. He revisado un previous question aquí en SO, pero el enfoque no funciona para mí. El lenguaje en cuestión es C++. Intenté proporcionar el nombre de archivo y el número de línea, pero gdb se niega a comprenderlo, solo enumera los archivos fuente de la aplicación de demostración.Depuración/rastreo dentro de una biblioteca compartida durante el tiempo de ejecución?

¿Alguna sugerencia?

Respuesta

4

Primero puede hacer "break main". Para cuando llegue a ese punto, la biblioteca compartida debe estar cargada, y luego puede establecer un punto de interrupción en cualquiera de sus rutinas.

+1

Sí, pero asegúrese de que se ha compilado biblioteca con -g, ¡y con optimizaciones desactivadas! – Alex

+0

Desafortunadamente eso no ayudó. La función aún no está visible, incluso desde main. ¿Hay algo que pueda agregar al código para que la ejecución se detenga y caiga en el depurador? – EightyEight

+0

@EightyEight: Hmm, eso funciona para mí. ¿La biblioteca a la que intenta depurar está cargada dinámicamente mediante dlopen()? Eso podría explicar por qué todavía no es visible en main. Si ese es el caso, puede establecer su punto de interrupción inicial después de la llamada dlopen para la biblioteca de destino, luego establecer el punto de corte final. Parece que debería haber una manera más simple; Seguiré buscando. –

3

Hay dos casos a considerar (y su pregunta no tiene claro qué caso de tener):
- el ejecutable está enlazado con la biblioteca compartida directamente:
esto significa que se GDB "ver" el símbolos (y fuentes) de la biblioteca compartida cuando deja en la principal
- el ejecutable de carga dinámicamente la biblioteca compartida (por ejemplo a través de dlopen):
en ese caso, GDB no se "ve" su biblioteca compartida hasta después dlopen complete.

Como no puede ver los símbolos cuando se detiene en main, supongo que tiene el segundo caso. Puede hacer "set stop-on-solib-events 1" en el indicador (gdb), y GDB se detendrá cada vez que se cargue (o descargue) una nueva biblioteca compartida.

Puede ver qué bibliotecas GDB "sabe" sobre el comando info shared.
Simplemente espere hasta que vea su biblioteca de destino en esa lista, antes de intentar establecer puntos de interrupción en ella.

+0

Esta solución no funcionará al depurar la aplicación de cliente SQLPlus de Oracle –

1

mira esto:

http://linux.die.net/man/1/ltrace

realizará un seguimiento de las llamadas de biblioteca - probablemente sea útil.

Y "strace" hace lo mismo para las llamadas al sistema.

Y con eso usted debe ser capaz de encontrar un punto de entrada ... Se podría establecer un punto de interrupción en el GDB de esa manera (aunque no puedo explicar los detalles yo)

Cuestiones relacionadas