Cómo depurar una DLL en Linux
-g.
En este artículo, analizaré la depuración de archivos DLL utilizando gdb. h
Proporciona dos interfaces de llamada de funciones:
int get ();
int set (int a);
Para generar tales una biblioteca de enlaces dinámicos, primero escribimos un archivo de encabezado:
[Copiar al portapapeles]
CÓDIGO:
/**** **** ****Acerca de este documento ********* ******************************* **** *
*Nombre de archivo: get.h
*propósito: un ejemplo de un archivo de encabezado DLL
*ordenado por: zhoulifa() Zhou Lifa()
Linux Hobbyist Linux Knowledge Spreader SOHO Developer Mejor en C
*fecha y hora:2006-11-15 21:11:54
* Nota: cualquiera puede copie el código y utilice la documentación como quiera, incluso para sus propios fines comerciales
* pero cumpla con la GPL
*. Esperanza: espero que cada vez más personas contribuyan al desarrollo de la ciencia y la tecnología
* ¡Cuando la tecnología esté sobre los hombros de gigantes, su progreso será más rápido! ¡Gracias a las personas mayores de código abierto por sus contribuciones!
*Gracias por el código original que proporcionaste.
Compilé este artículo basándome en su trabajo.
*********** * ************************************************* ** *********/
int get ();<
int set (int a);
Entonces prepara tal archivo fuente, utilizado para generar bibliotecas de enlaces dinámicos:
[Copiar al portapapeles]
CÓDIGO:
/*********** * Acerca de este documento ************************* ********************** p >
*nombre de archivo: get.cpp
*propósito: un ejemplo de un archivo fuente DLL
*tided by: zhoulifa() Zhou Lifa ()
Difusor de conocimientos sobre Linux entusiasta de Linux.
El desarrollador de SOHO que es mejor en lenguaje C
*Fecha y hora: 2006-11-15 21:11:54
* Nota: cualquiera puede copiar el código y utilizar la documentación a voluntad, por supuesto, también incluye su uso comercial
*Pero cumpla con GPL
*Esperanza: espero que cada vez más personas contribuyan al desarrollo de la ciencia y la tecnología.
* ¡Cuando la tecnología esté sobre los hombros de gigantes, progresará más rápido! ¡Gracias a las personas mayores de código abierto por sus contribuciones!
*Gracias por el código original,
Organicé este artículo basándome en él
************ ** ************************************************* * ********
#include & lt;stdio.h>
#include "get.h"
static int x= 0 ;
int get ()
{
printf ("get x=%d\n", x);
return x;
}
int set (int a)
{
printf ("set a=%d\n" , a);
x = a;
return x;
}
Luego usamos el compilador C/C++ de GNU Generamos una dinámica biblioteca de enlaces, el comando de compilación es el siguiente
CITA:
g++ get.cpp -shared -g -DDEBUG -o
libggg.so
De esta manera podemos generar una biblioteca de enlaces dinámicos. Escribiremos una aplicación para llamar a la biblioteca de enlaces dinámicos. El código fuente es el siguiente:
[Copiar al portapapeles]
.CÓDIGO:
/************ Acerca de este artículo********************** ******** *******************
*nombre de archivo: pk.cpp
*ejemplo. de llamar a una biblioteca de vínculos dinámicos
*tided by: zhoulifa() zhou Lifa()
Entusiasta de Linux evangelista del conocimiento de Linux Desarrollador étnico SOHO, mejor en lenguaje C
*Fecha y hora: 2006 -11-15 21:11:54
*Nota. Cualquiera puede copiar el código y utilizar la documentación como desee, incluso para sus fines comerciales
* Pero cumpla con la GPL
* Esperanza: espero que cada vez más personas contribuyan al desarrollo de la ciencia y la tecnología
* Sólo sobre los hombros de gigantes puede la ciencia ¡Y la tecnología avanza más rápido! ¡Gracias a las personas mayores de código abierto por sus contribuciones!
*Gracias por proporcionar el código original,
Organicé este artículo basándome en su trabajo
************ *** ********************************************** ** *****/
#include & lt;stdio.h>
#include "get.h"
int main (int argc, char ** argv)
{
int a = 100;
int b = get ();
int c = set ( a) ;
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n ", a,b,c,d);
devuelve 0;
}
Utilice el siguiente comando para compilar este programa, si ya ha colocado el libggg generado anteriormente. Si el libggg.so generado anteriormente se ha colocado en el directorio de archivos especificado por la ruta de búsqueda de archivos. , como /lib o /usr/lib, utilice el siguiente comando:
CITA:
g++ pk.cpp -o app -Wall -g -lggg -L`pwd `
Comencemos a depurar la aplicación generada por el comando anterior. Si ha colocado el libggg.so generado anteriormente en el directorio de archivos especificado por la ruta de búsqueda de la biblioteca, como /lib o /usr/lib, la depuración se completará exitosamente como se muestra a continuación
CITA: p>
./app
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, Inc.
GDB es software libre, protegido por GNU
Protección de Licencia Pública General (GNU
Licencia Pública General).
Ingresa "mostrar copia" para
obtener más información. Este GDB está configurado como "i486-linux-
gnu".
gnu"....Utilice la biblioteca host libthread_db "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main /* Establecer un punto de interrupción en la parte principal del programa*/
Establezca el punto de interrupción 1 en 0x804853c: archivo pk.cpp, línea 7.
(gdb) b establezca /* en el programa. en set*/
La función "set" no está definida
¿Hacer que el punto de interrupción esté pendiente en la carga futura de la biblioteca compartida
?(y o [n ]) y /. * y debe seleccionarse aquí para que el depurador rastree dentro de la DLL
*/ Punto de interrupción 2 (set) pendiente.
(gdb) run /* Comience a ejecutar nuestro programa hasta que encuentre un punto de interrupción y pausas*/
Inicie el programa: /data/example/c/app
Punto de interrupción 3, ubicado en 0xb7f665f8: archivo cpp, línea 11.
Punto de interrupción "establecido" por resolver
Punto de interrupción 1, principal (argc=1,argv=0xbf990504) en pk.cpp: 7
7 int a = 100;
(gdb) n /* Ingresa la siguiente línea del programa
*/
8 int b = get();
(gdb) n /* El programa ha alcanzado la DLL donde se encuentra el punto de interrupción */
get x=0
9 int c = set (a); (gdb) n
Punto de interrupción 3, establecido (a=100) en get.cpp:11
11 printf ("set a=%d\n", a);
(gdb) list /* Ver el código alrededor de la línea de código actual para demostrar que hemos rastreado el código fuente de la DLL*/
obtener código fuente*/
6 printf (" get x=%d\n", x);
7 return x;
8 }
9 int set (int a)
10 {
11 printf ("set a=%d\n", a);
12 x = a; p>
12 x = a;
11 printf ("establecer a=%d\n", a);
13 p>12 x = a; p>
13 return x ;
14 }
(gdb) n
establecer a=100
12 x = a; (gdb) n
p>
13 return x;(gdb) n
14 }
(gdb) n
14 }
( gdb) n
principal (argc=1, argv=0xbf990504) en
pk.cpp: 10
10 int d = get (); p>
(gdb) n
obtener x=100
11 printf ("a=%d,b =%d,c=%<
d,d=%d\n",a,b,c,d);
(gdb) n
a=100,b=0,c=100 ,d=100
12 devuelve 0;
(gdb) c
Continuar.
El programa sale normalmente.
(gdb) quit /* El programa finalizó exitosamente*/#
Si no colocamos la biblioteca de vínculos dinámicos en el directorio especificado (como /lib), la depuración fallará , de la siguiente manera:
CITA:
# gdb .
GNU gdb 6.4-debian
Copyright 2005 Free Software Foundation, p>
Inc.
GDB es software gratuito protegido por la Licencia Pública General GNU
Puedes modificarlo y/o distribuirlo bajo ciertas condiciones
.Copiar.
Introduce "mostrar copia" para ver las condiciones.
BGF no tiene absolutamente ninguna garantía.
Ingrese "mostrar garantía" para ver los detalles.
Este GDB está configurado como "i486-linux-
gnu".... .Utilice la biblioteca host libthread_db
"/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) b main
Punto de interrupción 1 en 0x804853c: archivo pk.cpp,
línea 7.
(gdb) b set
Función "set" no definida.
¿Hacer que el punto de interrupción esté pendiente en futuras cargas de biblioteca compartida
?(y o [n]) y
Punto de interrupción 2 (set) pendiente.
(gdb) run /* La ejecución del programa falló, incluso si la operación de depuración es la misma*/
Inicie el programa: /data /example/c/ app
/data/example/c/app: error al cargar
bibliotecas compartidas: libggg.so: no se puede abrir
archivo de objeto compartido: no existe tal archivo o
directorio
El programa salió con el código 0177.
(gdb) quit
#
El El entorno para este experimento es:
CPU: procesador AMD Athlon(tm) 64 300
RAM: 512 M
SO: Ubuntu GNU/Linux 6.06 elegante LTS
gcc:gcc versión 4.0.3 (Ubuntu 4.0.3-1ubuntu5)
break(b) Número de línea: establece un punto de interrupción en la línea
break Nombre de la función: Set una pausa al comienzo de la función Punto
romper..si... .si... .si...: Establecer un punto de interrupción condicional
continuar (o c) : continúe ejecutando el programa desde la posición actual, en lugar de realizar un solo paso
eliminar puntos de interrupción: eliminar todos los puntos de interrupción
eliminar puntos de interrupción n: eliminar el punto de interrupción con el número de serie n
deshabilitar puntos de interrupción: deshabilitar puntos de interrupción
habilitar puntos de interrupción: habilitar puntos de interrupción
info (o i) puntos de interrupción: ver qué puntos de interrupción están configurados actualmente
ejecutar (o r): Ejecute continuamente el programa desde cero sin realizar un solo paso
Mostrar nombres de variables: realice un seguimiento de las variables y muestre sus valores cada vez que se detenga
no mostrar: cancelar seguimiento de variables previamente configuradas
visualización: Cancelar el seguimiento de variables previamente configuradas
visualización.