目前我正在使用C语言的Linux(2.6内核)中的FUSE文件系统模块开发应用程序。由于某些编程错误,应用程序在安装文件系统后崩溃。因为我是Linux / C环境中的新手开发人员。你能告诉我调试这些程序的可能选项吗?
答案 0 :(得分:8)
我知道这个问题已经很老了,但如果你使用-f
开关,它将在前台运行,这对调试很有帮助。 -s
开关禁用多线程,这也非常有用。
我目前正在开发一个FUSE驱动程序,此页面非常有用:http://www.cs.hmc.edu/~geoff/classes/hmc.cs135.201109/homework/fuse/fuse_doc.html
引用:
Printf只有使用-f开关运行时,printf / fprintf调试代码才有效。否则,Fuse断开stdout和stderr。
答案 1 :(得分:6)
首先,确保您正在编译启用调试符号(-g
选项gcc
)。在运行程序之前,请使用shell命令启用核心转储:
ulimit -c unlimited
然后当应用程序崩溃时,它会在当前工作目录中留下core
文件(只要它可以写入它)。
然后,您可以在gdb
调试器中加载核心文件:
gdb <executable file> <core file>
...它会显示崩溃的位置,让你检查变量等等。
答案 2 :(得分:6)
使用-d
选项运行您的保险丝客户端。
答案 3 :(得分: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是不可或缺的。
答案 4 :(得分:0)
UML非常适合调试linux内核的通用部分,如文件系统,调度,但不是硬件平台或内核的驱动程序特定部分。
http://www.csee.wvu.edu/~katta/uml/x475.html
http://valerieaurora.org/uml_tips.html
仔细查看图表:
您将看到正在实现所有FUSE回调处理程序的应用程序“hello”。因此,大多数调试都在用户空间程序中,因为FUSE内核模块(和libfuse)通常用于所有FUSE文件系统。