¿Cómo depurar funciones de biblioteca c estándar como printf?

5 minutos de lectura

¿Como depurar funciones de biblioteca c estandar como printf
usuario117953

Quería depurar la función printf, así que cuando entré en la función printf (depurador gdb) me mostró esto:

__printf (format=0x80484d0 " my name is Adam") at printf.c:28
28  printf.c: No such file or directory.

¿Cuál es el significado de este?

Y cuando comencé de nuevo el paso, hay muchas más declaraciones como esta.

Por favor, ayúdame a entender esto.

  • ¿Por qué quieres depurar printf? ¿Esperas que haya insectos escondidos allí?

    – norte 1.8e9-dónde-está-mi-participación m.

    13 de agosto de 2017 a las 15:46

  • Debe suponer que las funciones proporcionadas por el sistema, especialmente las básicas como printf(), están libres de fallas y que el problema está en su código que lo usa, no en la función en sí. Si está utilizando un compilador moderno, asegúrese de compilar con tantas opciones de advertencia como sea posible y de que ni siquiera intente ejecutar el código mientras haya advertencias. (Usando GCC, requiero gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes … para estar limpio, incluso con el código de las preguntas SO. Ocasionalmente, el código de SO debe tratarse de manera diferente, pero no con frecuencia).

    –Jonathan Leffler

    13 de agosto de 2017 a las 16:56


  • ¿No hay versiones de depuración de las bibliotecas?

    – Martín James

    13 de agosto de 2017 a las 19:34

  • ¿Cuál es tu sistema operativo? Debe instalar el paquete “glibc-debug”. El nombre exacto del paquete depende del sistema operativo que esté utilizando.

    – ks1322

    14 de agosto de 2017 a las 11:12

  • Si todavía tienes curiosidad (y un poco fuera del tema), lee este blog: blog.hostilefork.com/donde-printf-rubber-meets-road Es una mirada bastante detallada a cómo printf eventualmente escribe un carácter.

    – Jugador no tripulado

    31 de agosto de 2017 a las 4:52


¿Como depurar funciones de biblioteca c estandar como printf
Iharob Al Asimi

Creo que está bastante claro. Hay un lugar donde el gdb espera que sea el código fuente, así que descargue glibc‘s código fuente y ponerlo allí. Creo que el mensaje de error contiene la ruta completa.

Si se trata de una distribución de Linux, es bastante simple, de hecho, porque generalmente también se envían paquetes fuente. De lo contrario, debe encontrar el código fuente usted mismo, tenga en cuenta que DEBE ser exactamente el mismo que se usó para compilar los componentes de la biblioteca c, no solo la misma versión porque los distribuidores a menudo realizan cambios en las fuentes.

  • no es tan fácil como parece: necesita ser exactamente el mismo código fuente que se utilizó para compilar la biblioteca. Y, por lo general, eso significa que desea obtener el paquete de código fuente y el símbolo de depuración de su sistema operativo / distribución 🙂

    – Marcus Muller

    13 de agosto de 2017 a las 15:40

  • @MarcusMüller Si se trata de una distribución de Linux, es bastante simple, de hecho, porque generalmente también se envían paquetes fuente. Golpeó. Pondré la primera parte de este comentario en la respuesta, y no dije que fuera fácil, solo que el mensaje de error es claro sobre cuál es el problema.

    – Iharob Al Asimi

    13 de agosto de 2017 a las 15:41

  • Suena bastante difícil… 🙁 Uso Clion en Ubuntu y hago clic en “entrar en” para obtener el código ensamblado.

    – Rick

    6 de marzo de 2019 a las 16:26

Bueno, para que el depurador le muestre el código que se compiló en los archivos binarios que está usando, necesita el código original en alguna parte.

Parece que no tiene eso, por lo que su depurador no puede encontrarlo.

Tenga en cuenta que normalmente no desea depurar el código fuente de las funciones de su biblioteca estándar, pero solo la forma en que se llaman. Para eso, los paquetes habituales de “símbolo de depuración” de sus sistemas operativos son óptimos.

  • Buen comentario. Es como si el OP sospechara que el error está en la biblioteca estándar, cuando es muy probable que esté en su código. Pero, quizás lo que quiere el OP es comprobar cómo funcionan estas funciones.

    – Iharob Al Asimi

    13 de agosto de 2017 a las 15:40

  • @IharobAlAsimi @ Marcus Müller Hola chicos, quiero hacer una pregunta aquí. Si entiendo correctamente, hay 3 tipos de archivos aquí: 1. Código fuente de texto C 2. Código fuente binario C 3. Código fuente binario C con información de depuración. Entonces puedo depurar el tipo 1 y 3 pero no el 2, ¿verdad?

    – Rick

    6 de marzo de 2019 a las 16:21

  • no, no lo entiendes correctamente: el “código fuente binario” no existe. Eso es contradictorio. Lo que quiere decir es “1. Código fuente C, 2. Código de máquina 3. Código de máquina con información de depuración”. Puede depurar los tres, pero de manera diferente.

    – Marcus Muller

    6 de marzo de 2019 a las 17:42

1647645847 720 ¿Como depurar funciones de biblioteca c estandar como printf
jxh

Como otros han respondido, GDB no pudo encontrar el archivo fuente.

Para las bibliotecas de tiempo de ejecución de C, las distribuciones de Linux pueden proporcionar una información de depuración RPM que puede instalar, lo que puede permitir que GDB vea los archivos. Por ejemplo:

$ yum search glibc-debuginfo

glibc-debuginfo.x86_64 : Debug information for package glibc
glibc-debuginfo-common.x86_64 : Debug information for package glibc

los glibc paquete y el glibc-debuginfo son un par emparejado. No hay una dependencia explícita, pero glibc-debuginfo el paquete no funcionará a menos que coincida con la misma versión de glibc.

Si tiene las fuentes desempaquetadas en algún lugar, pero no donde GDB espera que estén, puede intentar usar el directory o la set substitute-path comando para que GDB sepa dónde están las fuentes.

los directory El comando le dice a GDB que anteponga un prefijo antes de cualquier ruta del archivo fuente que esté tratando de encontrar. Por ejemplo, si el árbol de origen se encuentra realmente debajo del /tmppodrías usar:

(gdb) directory /tmp

los set substitute-path El comando se usa para decirle a GDB que reemplace un prefijo coincidente en una ruta de archivo fuente con un prefijo de ruta diferente. Por ejemplo, si el archivo fuente compilado estaba en /build/path/source.cpero en la depuración, el archivo fuente está realmente en /usr/home/alice/release-1.1/source.centonces podrías usar:

(gdb) set substitute-path /build/path /usr/home/alice/release-1.1

El comando asume que solo está especificando un nombre de ruta completo, por lo que no realizará la sustitución en /build/pathological/source.c.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad