В настоящее время я разрабатываю приложение, используя модуль файловой системы FUSE в Linux (2.6 Kernel) на языке C. Из-за некоторой ошибки в программном обеспечении приложение аварийно завершает работу после установки файловой системы. Так как я начинающий разработчик в среде Linux/C. Не могли бы вы рассказать мне возможные варианты для отладки таких программ?
Как отладить файловую систему FUSE в Linux
Ответ 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
И внимательно посмотрев на диаграмму:
Вы увидите приложение "привет", которое реализует все обработчики обратного вызова FUSE. Таким образом, большинство отладки выполняется в пользовательской программе, так как модуль ядра FUSE (и libfuse) в общем случае предназначен для использования файловой системой ALL FUSE.