使用printk进行内核调试的方法
2012-03-22 12:28
204 查看
FROM:http://hi.baidu.com/bitzsk/blog/item/a242ed4588cb888ab3b7dccc.html
---------------------------------------------------------------------------------------------------------------
在编程时候,最简单的调试莫过于用打印语句打印出结果从而判断BUG出在哪儿,但是内核调试与用户程序调试相比难度要大很多,原因是有二:首先,虽然Linux是用C语言写的,但是内核中不认识库文件中的printf函数。其次,内核程序运行在内核空间,而用户程序运行在用户空间,我们的打印语句要将内存的内容输出到控制台打印出来。因此,我们要想办法将“打印”这个操作转到内核空间中对内核代码进行跟踪。
内核通过printk函数解决了第一个难点。它是可以运行在内核空间的打印函数,相当于C语言中的printf函数。例如:
printk(KERN_ALERT “hello world\n”);
注意,KERN_ALERT与上引号中间有空格但是没有逗号。
关于printk的具体用法请参考printk()函数的使用
printk输出的信息在哪里?
由于Linux都带有syslog和klog进程(参考linux系统管理中的日志管理),如果没有修改过日志配置文件,这些信息会输出到/var/log/messages中。
在Linux中,内核是按模块划分的,一般包括进程管理,内存管理,文件系统,设备控制,网络等。模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。
使用模块的优点:
1,将来修改内核时,不必全部重新编译整个内核,可节省不少时间
2,系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可
因此,我们可以将“打印”操作作为一个内核模块,printk语句就可以打印出内核空间的内容。
下面是一个简单的内核模块示例:
使用make来编译Makefile文件,然后以root身份来执行插入模块卸载模块。通过dmesg命令来查看printk输出的内容。下面是Makefile文件:
---------------------------------------------------------------------------------------------------------------
在编程时候,最简单的调试莫过于用打印语句打印出结果从而判断BUG出在哪儿,但是内核调试与用户程序调试相比难度要大很多,原因是有二:首先,虽然Linux是用C语言写的,但是内核中不认识库文件中的printf函数。其次,内核程序运行在内核空间,而用户程序运行在用户空间,我们的打印语句要将内存的内容输出到控制台打印出来。因此,我们要想办法将“打印”这个操作转到内核空间中对内核代码进行跟踪。
内核通过printk函数解决了第一个难点。它是可以运行在内核空间的打印函数,相当于C语言中的printf函数。例如:
printk(KERN_ALERT “hello world\n”);
注意,KERN_ALERT与上引号中间有空格但是没有逗号。
关于printk的具体用法请参考printk()函数的使用
printk输出的信息在哪里?
由于Linux都带有syslog和klog进程(参考linux系统管理中的日志管理),如果没有修改过日志配置文件,这些信息会输出到/var/log/messages中。
在Linux中,内核是按模块划分的,一般包括进程管理,内存管理,文件系统,设备控制,网络等。模块(module)是在内核空间运行的程序,实际上是一种目标对象文件,没有链接,不能独立运行,但是可以装载到系统中作为内核的一部分运行,从而可以动态扩充内核的功能。模块最主要的用处就是用来实现设备驱动程序。
使用模块的优点:
1,将来修改内核时,不必全部重新编译整个内核,可节省不少时间
2,系统中如果需要使用新模块,不必重新编译内核,只要插入相应的模块即可
因此,我们可以将“打印”操作作为一个内核模块,printk语句就可以打印出内核空间的内容。
下面是一个简单的内核模块示例:
1 #include<linux/init.h> 2 #include<linux/module.h> 3 #include<linux/kernel.h> 4 MODULE_LICENSE("Dual BSD/GPL"); 5 6 static int hello_init(void) 7 { 8 printk(KERN_ALERT "Hello world\n"); 9 return 0; 10 } 11 12 13 static int hello_exit(void) 14 { 15 printk(KERN_ALERT "Goodbye,cruel world\n"); 16 return 0; 17 } 18 module_init(hello_init); 19 module_exit(hello_exit); |
|
查看printk输出的信息,可以先用locate命令来查找messages文件: locate messages 看看/var/log/messages下是否有这个文件,有的话就用tail命令看该文件的最后内容: tail[option] messages 也可以直接使用cat 命令: cat /var/log/messages or cat /proc/kmsg (这个文件可能不存在) 注意,上面的命令有的需要root身份才能执行。 如果启动了syslogd的话(通常是有的),可以通过/var/log/messages查看printk输出的信息。也可以通过修改/etc/syslog.conf使其将信息输出到其它文件。 使用klogd -f 命令或修改/etc/syslog.conf将记录写到另一个文件中.
相关文章推荐
- 使用printk进行内核调试的方法
- 使用Firebug对js进行断点调试的图文方法
- linux 使用nfs进行设备调试的方法
- linux设备驱动学习笔记--内核调试方法之printk
- 使用Carbide进行调试时免除重新启动模拟器的一种方法(转)
- 使用西门子profibus通讯时对从站进行调试和监视时,速度太慢的解决方法
- 在 FreeBSD 中使用串行通信进行远程内核调试
- 使用maven进行测试设置断点调试的方法
- 驱动程序调试方法之printk——printk的原理与直接使用
- Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
- Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
- Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
- Xcode5.1离线下载安装及使用iOS5模拟器进行开发调试的方法
- 使用XILINX SDK工具通过网络进行基于linux系统的远程调试方法
- printk()函数的使用 内核调试技术
- 驱动程序调试方法之printk——printk的原理与直接使用
- 使用Bochs和GDB对内核进行源代码级调试
- 怎么使用VS对Unity进行调试 UnityVs的使用方法的探讨
- 【iOS开发】使用XCode 8进行真机调试的方法(各种报错信息的解决方法)
- Xcode -- Xcode5.1使用低版本模拟器进行开发调试的方法