<<linux device driver,third edition>> Chapter 4:Debugging Techniques
Debugging by Printing
printk lets you classify messages accoring to their severity by associating different loglevels.
There are eight possible loglevel strings,defined in the header linux/kernel.h; we list them in order of decreasing severity:
KERN_EMERG
KERN_ALERT
KERN_CRIT
KERN_ERR
KERN_WARNING
KERN_NOTICE
KERN_INFO
KERN_DEBUG
Printng Device Numbers
int print_dev_t(char *buffer,dev_t dev);
char *format_dev_t(char *buffer,dev_t dev);
Using the /proc Filesystem (kernel version 2.6)
The /proc filesystem is a special,software-created filesystem that is used by the kernel to export information to the world.
Implementing files in /proc
All modules that work with /proc should include linux/proc_fs.h to define the proper functions.
When a process reads from your /proc file,the kernel allocates a page of memory where the driver can write data to be returned to user space.That buffer is passed to your function,which is a method called read_proc:
int (*read_proc)(char *page,char **start,off_t offset,int count,int *eof,void *data);
Creating your /proc file
once you have a read_proc function defined,you need to connect it to an entry in the /proc hierarchy.This is done with a call to create_proc_read_entry:
struct proc_dir_entry *create_proc_read_entry(const char *name,mode_t mode,struct proc_dir_entry *base,read_proc_t *read_proc,void *data);
remove_proc_entry(const char *name,NULL);
Using the /proc Filesystem (kernel version 4.6)
We can create a proc entry using the function:
static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode,struct proc_dir_entry *parent, const struct file_operations *proc_fops);
The proc entry that was created will be removed in the exit function using remove_proc_entry.
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kdev_t.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <linux/uaccess.h>
#define PROC_NAME "hello"
#define CAPACITY 100
struct buf{
char *msg;
int len;
int capacity;
} my_buf;
ssize_t main_proc_read(struct file *filp,char *buf,size_t count,loff_t *offp);
ssize_t main_proc_write(struct file *filp,const char *buf,size_t count,loff_t *offp);
struct file_operations proc_fops = {
.read = main_proc_read,
.write = main_proc_write,
};
ssize_t main_proc_write(struct file *filp,const char *buf,size_t count,loff_t *offp)
{
int remain_len = my_buf.capacity - my_buf.len;
int len = count > remain_len ? remain_len:count;
if(remain_len == 0) return -ENOMEM;
copy_from_user(my_buf.msg + my_buf.len,buf,len);
my_buf.len += len;
return len;
}
ssize_t main_proc_read(struct file *filp,char *buf,size_t count,loff_t *offp)
{
int len = count > my_buf.len ? my_buf.len:count;
copy_to_user(buf,my_buf.msg,len);
my_buf.len -= len;
return len;
}
void create_new_proc_entry(void)
{
proc_create(PROC_NAME,0,NULL,&proc_fops);
my_buf.capacity = CAPACITY;
my_buf.msg = kmalloc(CAPACITY,GFP_KERNEL);
my_buf.len = 0;
}
static int __init main_init(void)
{
printk("main init\n");
create_new_proc_entry();
return 0;
}
static void __exit main_exit(void)
{
remove_proc_entry(PROC_NAME,NULL);
kfree(my_buf.msg);
printk("main exit\n");
}
module_init(main_init);
module_exit(main_exit);
MODULE_LICENSE("GPL");
link: http://tuxthink.blogspot.com/2017/03/creating-proc-read-and-write-entry.html
The ioctl Method
Debugging by Watching
strace receives information from the kernel itself.This means that a program can be traced regardless of whether or not it was compiled with debugging support and whether or not it is stripped.
the most useful of which are -t to display the time when each call is executed,-T to display the time spent in the call, -e to limit the types of call traced, and -o to redirect the output to a file.By default,strace prints tracing information on stderr.
Debugging System Faults
Even though an oops usually does not bring down the entire system, you may well find yourself needing to reboot after one happens.
Oops Message
An oops displays the processor status at the time of the fault,including the contents of the CPU registers and other seemingly incomprehensible information.
http://www.cnblogs.com/wwang/archive/2010/11/14/1876735.html
Magic SysRq key
Magic SysRq is invoked with the combination of the Alt and SysRq keys on the PC keyboard,
r Turns off keyboard raw mode;
k Invokes the "secure attention key" function
s Performs an emergency synchronization of all disks
u Unmount.Attempts to remount all disks in a read-only mode.
b Immediately reboots the system.
p Prints processor registers information
t Prints the current task list
m Prints memory information
link:https://www.ibm.com/developerworks/cn/linux/l-cn-sysrq/index.html
Debuggers and Related Tools
Using gdb
gdb /usr/src/linux/vmlinux /proc/kcore
The first argument is the name of the uncompressed ELF kernel executable,not the zImage or bzImage. The second argument on the gdb command line is the name of the core file.
Issue the command core-file /proc/kcore whenever you want to flush the gdb cache;
however,always need to issue core-file when reading a new datum.
The kdb Kernel Debugger
The kgdb Patches
<<linux device driver,third edition>> Chapter 4:Debugging Techniques的更多相关文章
- <<linux device driver,third edition>> Chapter 3:Char Drivers
The Internal Representation of Device Numbers Within the kernel,the dev_t type(defined in linux/type ...
- <<linux device driver,third edition>> Chapter 2: Building and Running Modules
Kernel Modules Versus Applications Kernel modules programming is similar to event driven programming ...
- linux device driver —— 环形缓冲区的实现
还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...
- Linux Device Driver 学习(1)
Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...
- how to write your first linux device driver
how to write your first linux device driver 0. environment-ubuntu 1804 64bit 1. apt-get install linu ...
- Linux Device Driver && Device File
catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关 ...
- How to learn linux device driver
To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...
- linux device driver —— ioctl
实现了应用程序和设备驱动通过ioctl通信.还是对设备驱动没什么感觉,贴一下代码吧. 在Ubuntu 16.04 64bit中测试通过 ioctldemo.c #include <linux/m ...
- linux device driver —— 字符设备
现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...
随机推荐
- Spring中四种实例化bean的方式
本文主要介绍四种实例化bean的方式(注入方式) 或者叫依赖对象实例化的四种方式.上面的程序,创建bean 对象,用的是什么方法 ,用的是构造函数的方式 (Spring 可以在构造函数私有化的情况下把 ...
- Java学习第一篇 — 字符串
package StringTest; public class TestString { public static void main(String[] args){ // String str= ...
- 关于模板引擎handlebars.js基本用法
说明:模板引擎主要针对于渲染DOM,取代了字符串拼接,用下面的代码亲测handlebars模板引擎比字符串拼接渲染DOM慢了20ms, 这里配置一个在线DEMO,简单说明下handlebars.js的 ...
- photoshop使用笔记-制作古代印章
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 第一步:新建图层400x400像素,白色背景的图层,并且复制图层 第二步:设置前景色为R230,G30,B30 第三步:选择圆角 ...
- 结合vue展示百度天气接口天气预报
HTML: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 1145.cn 百度MIP适配实例
MIP,全称Mobile Instant Pages(移动端即时页面),是百度推出的一套移动端网页开放技术标准.网站移动端页面统计MIP改造,能实现页面缓存,从而达到移动网页加速效果. 百度官方已经明 ...
- Linux 下tomcat 出现 java.lang.OutOfMemoryError: unable to create new native thread
问题现象: Tomcat(8.5.13)部署了SuperMap iServer,并发用户在100左右.系统运行一段时间后,服务崩溃.异常提示 问题分析: 1.看到日志中的提示信息后,认为是系统内存不足 ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- python:异常处理、自定义异常、断言
什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象,如果传入一个不能转化的对象就会报错并抛出异常 常用的异常有: ValueError :传入无效的错 ...
- format 代码
#!/bin/bash#file format.sh#将某个源代码文件中的全角符号转换成半角符号#调用astyle 将某个源代码文件转换成linux风格,缩进方式为4个空格 echo $1#将全角空格 ...