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的更多相关文章

  1. <<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 ...

  2. <<linux device driver,third edition>> Chapter 2: Building and Running Modules

    Kernel Modules Versus Applications Kernel modules programming is similar to event driven programming ...

  3. linux device driver —— 环形缓冲区的实现

    还是没有接触到怎么控制硬件,但是在书里看到了一个挺巧妙的环形缓冲区实现. 此环形缓冲区实际为一个大小为bufsize的一维数组,有一个rp的读指针,一个wp的写指针. 在数据满时写进程会等待读进程读取 ...

  4. Linux Device Driver 学习(1)

    Linux Device Driver 学习(1) 一.搭建虚拟机开发环境 1.选择虚拟机VirtualBox,官网下载.deb包安装: VirtualBox Linux 5.1.6 下载fedora ...

  5. 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 ...

  6. Linux Device Driver && Device File

    catalog . 设备驱动程序简介 . I/O体系结构 . 访问设备 . 与文件系统关联 . 字符设备操作 . 块设备操作 . 资源分配 . 总线系统 1. 设备驱动程序简介 设备驱动程序是内核的关 ...

  7. How to learn linux device driver

    To learn device driver development, like any other new knowledge, the bestapproach for me is to lear ...

  8. linux device driver —— ioctl

    实现了应用程序和设备驱动通过ioctl通信.还是对设备驱动没什么感觉,贴一下代码吧. 在Ubuntu 16.04 64bit中测试通过 ioctldemo.c #include <linux/m ...

  9. linux device driver —— 字符设备

    现在对linux设备驱动还没有什么认识,跟着书上敲了一个字符驱动,这里把代码贴一下. 测试环境是 Ubuntu 16.04 64bit 驱动程序: #include <linux/fs.h> ...

随机推荐

  1. Java坦克大战(二)

    本文紧接上一篇讲解坦克大战这个项目,因为当初在学习的时候,是以这个案例逐步学习Java基础的,过程是先讲知识点,再将知识点逐步的融入到项目中,即给坦克添加新的功能.之前的Demo练习,想都记录下来.这 ...

  2. 【github&&git】7、gitignore 修改不起作用

    在git使用过程中有时会遇到修改了.gitignore文件,修改了之后发现,不能起作用,这是因为git存在缓存问题,所以做一下步骤即可: git rm -r --cached . git add . ...

  3. Linux常用基本命令:三剑客命令之-awk内置函数用法

    awk的内置函数大致可以分类为算数函数.字符串函数.时间函数.其他函数等 算数函数 最常用的算数函数有rand函数.srand函数.int函数. 可以使用rand函数生成随机数,但是使用rand函数时 ...

  4. 网页三剑客:HTML+CSS+JavaScript 之CSS概述

    CSS 简介 什么是 CSS? CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式通常存储在样式表中 把样式添加到 HTML 4.0 中,是 ...

  5. 【工具相关】web-HTML/CSS/JS Prettify的使用

    一,打开Sublime Text,代码如下面所示. 二,鼠标右键--->HTML/CSS/JS Prettify--->Prettify Code.代码如图所示,明显的代码变得整齐了.

  6. 【读书笔记】iOS-开发者证书

    虽然使用通配符听起来很赞,但问题是使用这种App ID的应用无法使用苹果的Push Notification服务以及应用内支付服务. 如果你有钱的话,建议单独买一个设备用于开发,将来你可能会安装iOS ...

  7. 微信小程序踩过的一些坑

    前言 迄今为止,正儿八经的上线了真正意义上的程序,但是这个小程序却着实不小. 之所以不小,是因为这个类似于社区的小程序,已经做了大部分都有的功能了 举例说明,具体的一些功能点: 1.帖子列表页面:会有 ...

  8. Angular基础(六) DI

      一.依赖注入 a) 如果模块A需要依赖模块B,通常的做法是在A中导入B,import{B} from ‘B’,但有一些场合需要解除这种直接依赖,比如单元测试时需要mock一个B对象.还有时要创建B ...

  9. Cordova/Ionic开发的Android APP启用Chrome Inspect调试的方法

    Cordova/Ionic开发的Android APP,需要启用WebView的调试模式,才可以在Chrome浏览器中输入chrome://Inspect,然后使用大家熟悉的开发者工具进行调试.不启用 ...

  10. [Android] 设置AlertDialog中按钮的可用(Enable)状态

    弹出一个保存文件的对话框,要控制输入内容限制,同时内容为空时保存按钮不可用. 原文地址请保留http://www.cnblogs.com/rossoneri/p/4140184.html 直接上代码: ...