一、问题发现
问题发现可根据系统运行时查询/proc信息(/proc是伪文件系统,主要提供一些系统信息),例如查询/proc/meminfo查询内存信息,也可采用一些内存检查工具来检测。
还可以根据系统运行崩溃发现问题。
二、调试方法
1、内核调试选项配置
Kernel hacking下有选型配置,可以打开一些调试相关的然后编译内核。
Kernel leak相关配置打开时,可在文件系统中产生可能内存泄漏的日志信息,查看方法见《
Linux内核内存泄漏工具使用》
2、断言
类似应用中的断言,内核编程中也可以调用BUG()和BUG_ON()来实现。这两个宏会触发oops,从而可以根据oops分析出问题。
3、printk()
内核中使用printk()来输出调试信息,这种方法是最常用的最方便的调试方法。中断上下文和进程上下文都可以调用这个函数。
但在终端初始化前不可调用此函数,即系统程序运行起始一直到终端初始化完成这段时间内这个函数无效。
这个函数对应不同的log等级。
这个函数的系统开销比较大,若在一些实时要求高的任务中调用可能会导致任务运行出错。
4、内存调试工具的使用
例如memwatch、yamd等。
strace
5、KGDB
内核调试的GDB,一般很少使用。
6、OOPS
oops就是内核系统运行崩溃是打印出的一段信息,oops指出了bug的位置。
可借助objdump分析问题
objdump -S xxx.o //xxx.o既是oops指出的bug错误模块
当编译内核时一些关于spinlock、mutex的内核调试选项打开时,出错时就会触发打印oops信息。
7、syslogd/klogd
LINUX系统启动后,由/etc/init.d/sysklogd先后启动klogd,syslogd两个守护进程。
其中klogd会通过syslog()系统调用或者读取proc文件系统来从系统缓冲区(ring buffer)中得到由内核printk()
发出的信息.而syslogd是通过klogd来读取系统内核信息.
syslogd这个守护进程根据/etc/syslog.conf,将不同的服务产生的Log记录到不同的文件中.
8、dmesg
在dmesg里我们可以查看到开机信息,printk产生的信息等。若研究内核代码,在代码中插入printk函数,然后通过dmesg观察是一个很好地方法。
9、proc文件系统
proc可以查看一些系统信息。驱动开发中也可以向/proc文件系统中导出信息。
-
const struct file_operations proc_mymsg_operations =
-
{
-
.read = mymsg_read,
-
};
-
-
static int mymsg_init(void)
-
{
-
myentry = create_proc_entry("mymsg", S_IRUSR, &proc_root);
-
if (myentry)
-
myentry->proc_fops = &proc_mymsg_operations;
-
return 0;
-
}
-
-
static void mymsg_exit(void)
-
{
-
remove_proc_entry("mymsg", &proc_root);
-
}
通过create_proc_entry建立/proc文件,然后read函数中实现用户读取自己驱动中想给出的信息。
10、ioctl
也可以在ioctl中写一些驱动测试的代码或者返回一些信息给用户态。
这是一种比较有效的方法,可以通过测试代码测试驱动存在的问题。