Cómo depurar el bloqueo del sistema de archivos FUSE en Linux

3 minutos de lectura

Actualmente estoy desarrollando una aplicación utilizando el módulo de sistema de archivos FUSE en Linux (2.6 Kernel) en lenguaje C. Debido a algún error de programación, la aplicación falla después de montar el sistema de archivos. Ya que soy un desarrollador novato en el entorno Linux/C. ¿Podría dejarme decirme posibles opciones para depurar dichos programas?

  • ¿Qué quieres decir con “usar”? ¿Está intentando implementar un sistema de archivos de espacio de uso basado en un mecanismo de fusible o algo más?

    – Sam Liao

    9 de diciembre de 2009 a las 6:25

  • +1 – FUSE puede ser un poco complicado de depurar.

    – Tim Publicar

    9 de diciembre de 2009 a las 12:31

  • @arsane, sí, estoy implementando un sistema de archivos de espacio de usuario basado en FUSE.

    – Hrishi

    9 de diciembre de 2009 a las 15:34

avatar de usuario de br1ckd
br1ckd

Hay un par de características de FUSE que pueden dificultar la depuración: normalmente se ejecuta en segundo plano (lo que significa que se desconecta de la entrada/salida estándar) y es multiproceso (lo que puede introducir condiciones de carrera y es más complicado de depurar con gdb). Afortunadamente, ambas funciones se pueden desactivar:

  1. Utilizar el -f cambie para mantener su aplicación en primer plano. Esto hará que sus líneas printf funcionen.
  2. Utilizar el -s cambiar para deshabilitar subprocesos múltiples. Deshabilitar los subprocesos múltiples limitará el rendimiento, pero también ocultará ciertos errores (condiciones de carrera), simplificará el uso de gdb y garantizará que la salida de printf sea legible (cuando varios subprocesos llaman a printf aproximadamente al mismo tiempo, su salida puede mezclarse).

También recomendaría leer el libro de Geoff Kuenning FUSIBLE documentación.

  • Gracias por el puntero. Por lo que puedo ver, esta es la respuesta más útil.

    – apilador de clases

    12 de noviembre de 2015 a las 19:06

avatar de usuario de lyman
lyman

Ejecute su cliente fusible con el -d opción.

Primero, asegúrese de estar compilando con los símbolos de depuración habilitados (-g opción a gcc). Antes de ejecutar su programa, habilite los volcados del núcleo con el comando de shell:

ulimit -c unlimited

Luego, cuando la aplicación falle, dejará un core archivo en el directorio de trabajo actual (siempre que pueda escribir en él).

A continuación, puede cargar el archivo principal en el gdb depurador:

gdb <executable file> <core file>

…y le mostrará dónde falló y le permitirá examinar las variables, etc.

Puedes usar Valgrind con FUSE, sin embargo Leé esto primero para obtener información sobre una solución temporal de setuid. De hecho, hago lo siguiente para comodidad de otras personas que puedan necesitar depurar mi sistema de archivos:

#include <valgrind/valgrind.h>

if (RUNNING_ON_VALGRIND) {
    fprintf(stderr,
        "******** Valgrind has been detected by %s\n"
        "******** If you have difficulties getting %s to work under"
        " Valgrind,\n"
        "******** see the following thread:\n"
        "******** http://www.nabble.com/valgrind-and-fuse-file-systems"
        "-td13112112.html\n"
        "******** Sleeping for 5 seconds so this doesn't fly by ....",
            progname, progname);
    sleep(5);
    fprintf(stderr, "\n");
}

Trabajo mucho en FUSE… y el 90% de las veces mis bloqueos se deben a una fuga que hace que el asesino OOM tome medidas, eliminando la referencia de un puntero incorrecto, doble free(), etc. Valgrind es una gran herramienta para detectar eso. . GDB es útil, pero he encontrado que Valgrind es indispensable.

UML es muy bueno para depurar partes genéricas del kernel de Linux como el sistema de archivos, la programación, pero no la plataforma de hardware o la parte específica de los controladores del kernel.

http://www.csee.wvu.edu/~katta/uml/x475.html

http://valerieaurora.org/uml_tips.html

Y mirando el diagrama con atención:

Resultado de imagen para sistema de archivos FUSE

Verá la aplicación “hola” que está implementando todos los controladores de devolución de llamada FUSE. Por lo tanto, la mayor parte de la depuración se realiza en el programa del espacio de usuario, ya que el módulo del núcleo FUSE (y libfuse) está destinado genéricamente a TODOS los sistemas de archivos FUSE.

¿Ha sido útil esta solución?