Linux Kernel PANIC(三)--Soft Panic/Oops调试及实例分析

本文详细介绍了Linux内核驱动出现OOPS(错误)时的调试步骤,包括如何重现OOPS、分析OOPS信息、通过gdb调试定位代码、地址转换以及使用objdump反汇编。通过实例解析了如何从寄存器信息和堆栈回溯找到问题根源,帮助开发者有效解决内核驱动问题。
摘要由CSDN通过智能技术生成

凡是非中断处理引发的模块崩溃都将导致 soft panic

在这种情况下, 驱动本身会崩溃, 但是还不至于让系统出现致命性失败, 因为它没有锁定中断处理例程. 导致 hard panic的原因同样对soft panic也有用(比如在运行时访问一个空指针).

1 驱动OOPS实例分析

1.1 导致 OOPS 的代码

模块代码, 有一处 NULL 指针异常

// kerneloops.c
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>

static int __init hello_init(void)
{
    int *p = 0;

    *p = 1;

    return 0;
}

static void __exit hello_exit(void)
{
    return;
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");

makefile

# -------------------------------------------------
#
# Makefile for the LDD-LinuxDeviceDrivers.
#
# Author: gatieme
# Create: 2016-07-29 15:50:46
# Last modified: 2016-07-29 16:10:29
# Description:
#   This program is loaded as a kernel(v2.6.18 or later) module.
#   Use "make install" to load it into kernel.
#   Use "make remove" to remove the module out of kernel.
#
# -------------------------------------------------


#   my driver description
DRIVER_VERSION := "1.0.0"
DRIVER_AUTHOR  := "Gatieme @ AderStep Inc..."
DRIVER_DESC    := "Linux input module for Elo MultiTouch(MT) devices"
DRIVER_LICENSE := "Dual BSD/GPL"


MODULE_NAME := kerneloops
EXTRA_CFLAGS  += -g


ifneq ($(KERNELRELEASE),)

obj-m := $(MODULE_NAME).o #print_vmarea.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

PWD := $(shell pwd)

modules:
    make -C $(KERNELDIR) M=$(PWD) modules

modules_install:
    make -C $(KERNELDIR) M=$(PWD) modules_install


insmod:
    sudo insmod $(MODULE_NAME).ko

reinsmod:
    sudo rmmod $(MODULE_NAME)
    sudo insmod $(MODULE_NAME).ko


rmmod:
    sudo rmmod $(MODULE_NAME)


clean:
    make -C $(KERNELDIR) M=$(PWD) clean
    rm -f modules.order Module.symvers Module.markers

.PHNOY:
    modules modules_install clean

endif

1.2 重现 OOPS

make后加载模块, 提示加载失败, 此时内核倒是了OOPS, 由于故障不严重, 系统并未死机
在这里插入图片描述

1.3 OOPS 信息

查看 Kernel的日志, 或者dmesg 打印日志可以查看 OOPS 信息

[ 5235.513513] BUG: unable to handle kernel NULL pointer dereference at           (null)
[ 5235.513604] IP: [<ffffffffc0008003>] hello_init+0x3/0x1000 [kerneloops]
[ 5235.513671] PGD 0 
[ 5235.513696] Oops: 0002 [#1] SMP 
[ 5235.513736] Modules linked in: kerneloops(OE+) bbswitch(OE) cuse arc4 ath9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值