如何在Linux中debuggingFUSE文件系统崩溃

目前我正在用C语言在Linux(2.6 Kernel)中开发一个使用FUSE文件系统模块的应用程序。 由于编程错误,安装文件系统后应用程序崩溃。 因为我是Linux / C环境下的新手开发人员。 你能让我告诉我可能的选项来debugging这样的程序?

我知道这个问题很老,但是如果使用-f开关,它将在前台运行,这对调试非常有帮助。 -s开关禁用多线程,这也是非常有用的。

我目前正在开发一个FUSE驱动程序,这个页面非常有帮助: http : //www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html

去引用:

Printf你的printf / fprintf调试代码只有在你使用-f开关运行时才会起作用。 否则,保险丝断开stdout和stderr。

首先,确保你正在编译启用调试符号( -g选项到gcc )。 在运行程序之前,使用shell命令启用核心转储:

 ulimit -c unlimited 

然后,当应用程序崩溃时,它将在当前工作目录中留下一个core文件(只要它可以写入)。

然后你可以在gdb调试器中加载核心文件:

 gdb <executable file> <core file> 

…它会告诉你它在哪里崩溃,让你检查变量等等。

-d选项运行保险丝客户端。

你可以使用Valgrind和FUSE,不过首先阅读这个来学习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杀手采取行动,解引用一个错误的指针,双重释放()等。90%的时间Valgrind是一个很好的工具来捕捉。 GDB是有帮助的,但我发现Valgrind是不可或缺的。

UML非常适合调试Linux内核的通用部分,比如文件系统,调度而不是硬件平台或者驱动程序的特定部分。

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

http://valerieaurora.org/uml_tips.html

仔细看图:

FUSE文件系统的图像结果

您将看到应用程序“hello”,它正在实现所有的FUSE回调处理程序。 所以大部分调试都在用户空间程序中,因为FUSE内核模块(和libfuse)一般意味着被ALL FUSE文件系统使用。