2009-12-09 89 views
10

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

+0

你是什么意思“使用”?您是否尝试实施基于熔丝机制或其他功能的使用空间文件系统? – 2009-12-09 06:25:41

+4

+1 - FUSE调试可能有点痛苦。 – 2009-12-09 12:31:38

+0

@arsane,是的,我正在实现一个基于FUSE的用户空间文件系统。 – Hrishi 2009-12-09 15:34:51

回答

6

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

ulimit -c unlimited 

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

然后,您可以加载内核文件中gdb调试器:

gdb <executable file> <core file> 

...,它会告诉你在哪里坠毁,并让你检查变量等等。

2

您可以使用Valgrind与FUSE,但read this first了解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杀手能够采取行动,解除引用不良指针,双重释放()等等。Valgrind是一个很好的工具。 GDB很有帮助,但我发现Valgrind是不可或缺的。

+0

该链接中断 – 2010-01-02 06:49:28

+0

但是,这个工程:http://thread.gmane.org/gmane.comp.file-systems.fuse.devel/5224 – 2010-01-02 06:56:23

6

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

8

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

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

引述:

printf的你的printf/fprintf中调试代码,如果你与运行只会工作 - f开关。否则,保险丝断开stdout和stderr。

+0

谢谢你的指针。据我所知,这是最有用的答案。 – 2015-11-12 19:06:42

0

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文件系统使用。