Как отладить файловую систему FUSE в Linux

В настоящее время я разрабатываю приложение, используя модуль файловой системы FUSE в Linux (2.6 Kernel) на языке C. Из-за некоторой ошибки в программном обеспечении приложение аварийно завершает работу после установки файловой системы. Так как я начинающий разработчик в среде Linux/C. Не могли бы вы рассказать мне возможные варианты для отладки таких программ?

Ответ 1

Я знаю, что этот вопрос довольно старый, но если вы используете переключатель -f, он будет работать на переднем плане, что очень полезно для отладки. Переключатель -s отключает многопоточность, что также очень полезно.

В настоящее время я разрабатываю драйвер FUSE, и эта страница очень помогла: http://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html

Цитата:

Printf Ваш отладочный код printf/fprintf будет работать только при запуске с ключом -f. В противном случае предохранитель отключит выходы stdout и stderr.

Ответ 2

Сначала убедитесь, что вы компилируете с включенными символами отладки (-g опция gcc). Перед запуском вашей программы включите дампы ядра с помощью команды оболочки:

ulimit -c unlimited

Затем, когда приложение выйдет из строя, он оставит файл core в текущем рабочем каталоге (пока он может писать на него).

Затем вы можете загрузить основной файл в отладчик gdb:

gdb <executable file> <core file>

... и он покажет вам, где он разбился, и пусть вы просматриваете переменные и т.д.

Ответ 3

Запустите клиент-плавкий предохранитель с параметром -d.

Ответ 4

Вы можете использовать Valgrind с помощью FUSE, однако read это первый, чтобы узнать о работе setuid. Я действительно делаю следующее в качестве удобства для других, которым может потребоваться отладка моей файловой системы:

#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");
}

Я много работаю над FUSE.. и в 90% случаев мои сбои происходят из-за утечки, из-за которой убийца OOM принимает меры, разыгрывает плохой указатель, double free() и т.д. Valgrind - отличный инструмент поймать это. GDB полезен, но я нашел Valgrind незаменимым.

Ответ 5

UML очень хорош для отладки общих частей ядра Linux, например файловой системы, планирования, но не аппаратной платформы или конкретной части ядра ядра.

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

http://valerieaurora.org/uml_tips.html

И внимательно посмотрев на диаграмму:

Image result for FUSE filesystem

Вы увидите приложение "привет", которое реализует все обработчики обратного вызова FUSE. Таким образом, большинство отладки выполняется в пользовательской программе, так как модуль ядра FUSE (и libfuse) в общем случае предназначен для использования файловой системой ALL FUSE.