linux内核调试方法

无人久伴 提交于 2020-02-16 09:45:30

借助OOPS信息调试

配置串口:

1.

vi /boot/grub.conf

  

说明:

Console=ttyS0 对应串口设备

9600 代表波特率

2. 虚拟机上添加串口设备

 

3. 物理机上配置串口

首先应安装minicom软件

 

配置minicom

# minicom –s

依次选择 Serial port setup -> Serial Device

修改为: /dev/ttyS0

Save setup as dfl

Exit from Minicom

 

启动minicom

# Minicom –C 接收文件名

 

NULL Pointer – 问题分析

 

当使用了空指针后,内核会产生如上的OOPS信息

使用GDB确定问题代码位置:

1. Gdb ***.ko

2. L*

注:当代码中有释放内存的情况,应该先对该内存置特殊位,以方便代码调试。

实现:

 

调用:

 

 

Soft lockup –问题分析

 

1. Spinlock 应该成对出现

2. 避免spinlock被中断,导致长时间无法放锁,使用spin_lock_saveirq和spin_unlock_restore

3. 自旋锁内不可以有耗时操作,不可以有睡眠。

Stack Overflow –问题分析

 

死锁问题

 

callstack显示大量进程尝试获取同一个lock,那么说明有一个进程持有了该lock未释放。

 用”echo t > /proc/sysrq-trigger”命令来获取所有线程的call stack。

 

# 立即重新启动计算机

echo "b" > /proc/sysrq-trigger

# 立即关闭计算机

echo "o" > /proc/sysrq-trigger

# 导出内存分配的信息 (可以用/var/log/message 查看)

echo "m" > /proc/sysrq-trigger

# 导出当前CPU寄存器信息和标志位的信息

echo "p" > /proc/sysrq-trigger

# 导出线程状态信息

echo "t" > /proc/sysrq-trigger

# 故意让系统崩溃

echo "c" > /proc/sysrq-trigger

# 立即重新挂载所有的文件系统

echo "s" > /proc/sysrq-trigger

# 立即重新挂载所有的文件系统为只读

echo "u" > /proc/sysrq-trigger

 

Core dump

http://blog.csdn.net/tenfyguo/article/details/8159176

配置

http://blog.chinaunix.net/uid-26557245-id-3199660.html

 

  1. 1. 确认需要的软件包已经安装:

a) Kexec-tools

b) Kernel-debuginfo

c) kernel-debuginfo-common

  1. 2. 配置kdump

打开/etc/kdump.conf,添加

path /var/crash   (也可使用scp)

  1. 3. 配置内核

1. 配置启用NMI Watchdog Timer

     vi /boot/grub/grub.cfg

  追加nmi_watchdoc=1 (重启后grep NMI /proc/interrupts)

  

cat /proc/sys/kernel/hung_task_panic 软中断 , 内核中有进程进入了死循环,结束不了,或执行时间过长。

cat /proc/sys/kernel/nmi_watchdog     硬中断

 

2. 打开/etc/sysctl.conf,添加

vm.panic_on_oom = 1

kernel.panic_on_unrecovered_nmi = 0

kernel.unknown_nmi_panic = 0

kernel.panic_on_oops = 1

  1. 4. 配置启动项

打开/etc/grub.conf,添加

crashkernel=256M

  1. 5. 启动kdump服务

# chkconfig kdump on

# service kdump start

  1. 6. 测试

# echo "c" > /proc/sysrq-trigger

 

GDB查看结构体内的偏移

(gdb) p &((struct task_struct *)0)->prio

$1 = (int *) 0x30

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!