Red de conocimiento informático - Material del sitio web - Cómo depurar una DLL en Linux

Cómo depurar una DLL en Linux

Como sabes, puedes usar gdb en Linux para depurar tu aplicación, pero solo si compilas tu programa con gcc y usas el parámetro

-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 ************************* **********************

*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:

./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;

12 x = a;

11 printf ("establecer a=%d\n", a);

13 p>12 x = a;

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 ();

(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,

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.