LINUX 内核调试基础+编程基础
http://blog.chinaunix.net/uid-20564848-id-73208.html
内核文档:[root@localhost Documentation]# pwd /usr/src/kernels/linux-2.6.32/Documentation [root@localhost Documentation]# ls 00-INDEX i2o parport.txt ABI ia64 PCI accounting ics932s401 pcmcia acpi ide pi-futex.txt aoe infiniband pnp.txt applying-patches.txt initrd.txt power arm input powerpc atomic_ops.txt Intel-IOMMU.txt pps auxdisplay intel_txt.txt prctl bad_memory.txt ioctl preempt-locking.txt basic_profiling.txt io-mapping.txt printk-formats.txt binfmt_misc.txt IO-mapping.txt prio_tree.txt blackfin io_ordering.txt rbtree.txt block iostats.txt RCU blockdev IPMI.txt rfkill.txt braille-console.txt IRQ-affinity.txt robust-futex-ABI.txt bt8xxgpio.txt irqflags-tracing.txt robust-futexes.txt btmrvl.txt IRQ.txt rtc.txt BUG-HUNTING isapnp.txt rt-mutex-design.txt c2port.txt isdn rt-mutex.txt cachetlb.txt ja_JP s390 cdrom java.txt SAK.txt cgroups kbuild scheduler Changes kdump scsi CodingStyle kernel-doc-nano-HOWTO.txt SecurityBugs connector kernel-docs.txt SELinux.txt console kernel-parameters.txt serial cpu-freq keys-request-key.txt serial-console.txt cpu-hotplug.txt keys.txt sgi-ioc4.txt cpuidle kmemcheck.txt sgi-visws.txt cpu-load.txt kmemleak.txt sh cputopology.txt kobject.txt slow-work.txt credentials.txt ko_KR SM501.txt cris kprobes.txt Smack.txt crypto kref.txt sound dcdbas.txt kvm sparc debugging-modules.txt laptops sparse.txt debugging-via-ohci1394.txt ldm.txt spi dell_rbu.txt leds-class.txt spinlocks.txt development-process leds-lp3944.txt stable_api_nonsense.txt device-mapper lguest stable_kernel_rules.txt devices.txt local_ops.txt SubmitChecklist DMA-API.txt lockdep-design.txt SubmittingDrivers DMA-attributes.txt lockstat.txt SubmittingPatches dmaengine.txt logo.gif svga.txt DMA-ISA-LPC.txt logo.txt sysctl DMA-mapping.txt m68k sysfs-rules.txt DocBook magic-number.txt sysrq.txt dontdiff make telephony driver-model Makefile thermal dvb ManagementStyle timers dynamic-debug-howto.txt mca.txt tomoyo.txt early-userspace md.txt trace edac.txt memory-barriers.txt uml eisa.txt memory-hotplug.txt unaligned-memory-access.txt email-clients.txt memory.txt unicode.txt fault-injection mips unshare.txt fb misc-devices usb feature-removal-schedule.txt mn10300 vgaarbiter.txt filesystems mono.txt VGA-softcursor.txt firmware_class mtd video4linux flexible-arrays.txt mutex-design.txt video-output.txt frv namespaces vm futex-requeue-pi.txt netlabel volatile-considered-harmful.txt gcov.txt networking voyager.txt gpio.txt nmi_watchdog.txt w1 highuid.txt nommu-mmap.txt watchdog HOWTO numastat.txt wimax hwmon oops-tracing.txt x86 hw_random.txt parisc zh_CN i2c parport-lowlevel.txt zorro.txt
内核书籍:LDK:LINUX内核设计与实现ULK:深入理解LINUX内核LDD:LINUX 设备驱动程序LVMM:深入理解LINUX 虚拟内存管理深入理解LINUX网络内幕
内核社区:http://vger.kernel.org/vger-lists.html#linux-kernel http://dir.gmane.org/gmane.linux.usb.general https://www.kernel.org/ http://linux.chinaunix.net/
printk小结1 printk 消息级别定义#define KERN_EMERG "<0>" /*紧急事件,一般是系统崩溃之前的提示消息*/#define KERN_ALERT "<1>" /*必须立即采取行动*/#define KERN_CRIT "<2>" /*临界状态,通常涉及严重的硬件或者软件操作失败*/#define KERN_ERR "<3>" /*用于报告错误状态,设备驱动会经常使用KERN_ERR来报告硬件错误*/#define KERN_WARNING "<4>" /*对可能出现问题的情况进行警告,这类情况通常不会对系统造成严重问题 */#define KERN_NOTICE "<5>" /*有必要进行提示的正常情形,许多与安全相关的状况用这个级别进行汇报*/#define KERN_INFO "<6>" /*内核提示性信息,很多驱动程序在启动的时候以这个级别打印找到的硬件信息*/#define KERN_DEBUG "<7>" /*用于调试信息*/2 使用方法printk(KERN_ALERT "XXXXXX",XXXX); 3 /proc/sys/kernel/printk该文件可以调节printk的输出等级,文件中有四个数字值。(1) 控制台日志级别:优先级高于该值的消息将被打印至控制台。(2) 默认的消息日志级别:用该优先级来打印未定义优先级的消息。(3) 最低的控制台日志级别:控制台日志界别可被设置的最小值。(4) 默认的控制台日志级别:控制台日志级别的默认值。4 通过如下命令可以使得Linux内核的任何printk都被输出到控制台#echo 8 > /proc/sys/kernel/printk 5. cat /proc/kmsg 这个文件用于检索用printk生成的内核消息。任何时刻只能有一个具有超级用户权限的进程可以读取这个文件。也可以用系统调用syslog检索这些消息。 通常使用工具dmesg或守护进程klogd检索这些消息。 printk---------------->log buffer --------------->klogd---------------->syslogd------->文件
printk---------------->log buffer --------------->klogd---------------->文件
printk---------------->log buffer------------------>dmesg 内核模块: OOPS:LINUX 系统崩溃,LINUX 不能使用 1.EIP2.CALL TRACE3.OBJDUMP 反汇编 EIP GDB调试内核:
[root@localhost linux-2.6.32]# pwd
/usr/src/kernels/linux-2.6.32
[root@localhost linux-2.6.32]# gdb vmlinux /proc/kcore
刷新GDB缓存:
(gdb) core-file /proc/kcore
[New process 1]
Core was generated by `ro root=LABEL=/ rhgb quiet'.
#0 0x0000000000000000 in per_cpu.irq_stack_union ()
(gdb) print jiffies
$11 = -109 '\223'
(gdb) core-file /proc/kcore
[New process 1]
Core was generated by `ro root=LABEL=/ rhgb quiet'.
#0 0x0000000000000000 in per_cpu.irq_stack_union ()
(gdb) print jiffies
$12 = 42 '*'
其他内核调试器:
KGDB
http://blog.csdn.net/hejinjing_tom_com/article/details/9932451
KDB
KPROBES
KDUMP
硬件调试器
BDM/JTAG SysRq:
b 立即重启系统
c 内核live reboot,并输出错误信息
d 显示所有排它锁
e 向除 init 外进程发送 SIGTERM 信号,让其自行结束
f 人为触发 OOM Killer (out of memory)
g 当进入内核模式时,以 framebuttter 代替输出
h 输出帮助
i 向除 init 以外所有进程发送 SIGKILL 信号,强制结束进程
k 结束与当前控制台相关的全部进程
m 内存使用信息
n 重置所有进程的 nice(优先级)
o 关机
p 输出cpu 寄存器信息
q Display all active high-resolution timers and clock sources.
r 把键盘设置为 ASCII 模式,使按键可以穿透 x server 捕捉传递给内核
s 同步缓冲区数据到硬盘
t 输出进程列表
u 重新挂载所有文件系统为只读模式
v 输出 Voyager SMP 处理信息
w 输出 block(d状态)进程列表
hello.c 内核模块编绎 #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h>static int init_hello_4(void) {printk(KERN_ALERT "Hello, world 4 ");return 0; }static void cleanup_hello_4(void) {printk(KERN_ALERT "Goodbye, world 4 "); }module_init(init_hello_4); module_exit(cleanup_hello_4); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Playmud"); MODULE_DESCRIPTION("Test only!"); 配置Makefile和执行ko编译 [root@server1 ~]# echo "obj-m:=hello.o" > Makefile
[root@server1 ~]# make -C /lib/modules/`uname -r`/build M=`pwd` modules
make: Entering directory `/usr/src/kernels/2.6.32-431.23.3.el6.x86_64'
Building modules, stage 2.
MODPOST 1 modules
make: Leaving directory `/usr/src/kernels/2.6.32-431.23.3.el6.x86_64'
/lib/modules/`uname -r`/build就是本地机子的module编译配置目录不是为正在运行的内核编译模块: make -C M=`pwd` 为正在运行的内核编译模块: make -C /lib/modules/`uname -r`/build M=`pwd` modulesprintk没有在console上打印出提示,通过
[root@server1 ~]# dmesg |tail -1
Hello, world
可以查到,具体配置可以查看 vim /etc/syslog.conf
sysrq常使用的魔术键:echo 1>/proc/sys/kernel/sysrq 打开sysrq功能echo 't' >/proc/sysrq-trigger 打印进程栈,调试时很有用echo 'c' >/proc/sysrq-trigger 常常用来测试dump模式
printk打印不能显示到终端的问题【原型】int printk(const char * fmt,…);【示例】与大多数展示printf的功能一样,我们也用一个helloworld的程序来演示printk的输出:编写一个内核模块:#include#include#if CONFIG_MODVERSIONS==1#define MODVERSIONS#include#endifMODULE_LICENSE("GPL");int init_module(){printk("hello.word-this is the kernel speaking\n");return 0;}void cleanup_module(){printk("Short is the life of a kernel module\n");}保存为文件hello.c编写一个Makefile:CC=gccMODCFLAGS:=-O6 -Wall -DMODULE -D__KERNEL__ -DLINUXhello.o:hello.c /usr/include/linux/version.h$(CC) $(MODCFLAGS) -c hello.cecho insmod hello.o to turn it on保存为文件Makefile执行make我们可以看到生成了一个hello.o的内核模块,我们想通过这个模块在插入内核的时候输出"hello.word-this is the kernel speaking"这样一条信息。然后我们开始:[root@localhost root]# insmod hello.o[root@localhost root]#并没有输出任何消息。why?这也是printf和printk的一个不同的地方用printk,内核会根据日志级别,可能把消息打印到当前控制台上,这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。这些消息正常输出的前提是──日志输出级别小于console_loglevel(在内核中数字越小优先级越高)。没有指定日志级别的printk语句默认采用的级别是 DEFAULT_ MESSAGE_LOGLEVEL(这个默认级别一般为<4>,即与KERN_WARNING在一个级别上),其定义在linux26/kernel/printk.c中可以找到日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):#define KERN_EMERG 0#define KERN_ALERT 1#define KERN_CRIT 2#define KERN_ERR 3#define KERN_WARNING 4#define KERN_NOTICE 5#define KERN_INFO 6#define KERN_DEBUG 7现在我们来修改hello.c程序,使printk的输出级别为最高:printk("<0>""hello.word-this is the kernel speaking\n");然后重新编译hello.o,并插入内核:[root@localhost root]# insmod hello.o[root@localhost root]#Message from syslogd@localhost at Sat Aug 15 05:32:22 2009 ...localhost kernel: hello.word-this is the kernel speakinghello,world信息出现了。其实printk始终是能输出信息的,只不过不一定是到了终端上。我们可以去/var/log/messages这个文件里面去查看。如果klogd没有运行,消息不会传递到用户空间,只能查看/proc/kmsg通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别。查看这个文件的方法如下:#cat /proc/sys/kernel/printk 6 4 1 7上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别。可用下面的命令设置当前日志级别:# echo 8 > /proc/sys/kernel/printk这样所有级别<8,(0-7)的消息都可以显示在控制台上.
转载于:https://www.cnblogs.com/zengkefu/p/5566721.html
LINUX 内核调试基础+编程基础相关推荐
- linux内核调试指南
Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...
- 开源项目-基于Intel VT技术的Linux内核调试器
本开源项目将硬件虚拟化技术应用在内核调试器上,使内核调试器成为VMM,将操作系统置于虚拟机中运行,即操作系统成为GuestOS,以这样的一种形式进行调试,最主要的好处就是调试器对操作系统完全透明.如下 ...
- Linux 内核调试器 调试指南
Linux 内核调试器内幕 KDB 入门指南 Hariprasad Nellitheertha (nharipra@in.ibm.com), 软件工程师, IBM 简介: 调试内核问题时,能够跟踪内核 ...
- Linux内核调试技术指南
前两天,完成了ucos在2440上的移植,以及boot的修改.今天突然想到,我在linux下,该如何来编写,调试比较复杂的驱动.我想这个问题应该从如何调试内核入手,先转载两个文字,待西西看来. 系统搭 ...
- Linux Kernel - Debug Guide (Linux内核调试指南 )
linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...
- Linux内核调试方法【转】
转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...
- Linux内核调试 - 一般人儿我都不告诉他(一)【转】
转自:http://www.cnblogs.com/armlinux/archive/2011/04/14/2396821.html 悄悄地进入Linux内核调试(一) 本文基址:http://blo ...
- 基于IntelVt技术的Linux内核调试器 - 2
4 基于IntelVt技术的Linux内核调试器- 调试器设计与实现(2):调试核心 4.1反汇编引擎 如果说调试框架是一个调试器的灵魂,那么接口与反汇编引擎就是一个调试器的身体.我们在调试过程中是要 ...
- Linux内核调试的方式以及工具集锦
Linux内核调试的方式以及工具集锦 CSDN GitHub Linux内核调试的方式以及工具集锦 LDD-LinuxDeviceDrivers/study/debug 本作品采用知识共享署名-非商 ...
- Linux内核调试原理和工具介绍--理解静态插装/动态插装、tracepoint、ftrace、kprobe、SystemTap、Perf、eBPF
可以将linux跟踪系统分成Tracer(跟踪数据来自哪里),数据收集分析(如"ftrace")和跟踪前端(更方便的用户态工具). 1. 数据源(Tracers) printk 是 ...
最新文章
- 计算机电缆线对成缆系数,计算机电缆绞合系数 - 无图版
- Setting the Reply-To Header in an Email using CDONTS.NewMail Object and CDO Message
- 判断JS对象是否拥有某属性两种方式
- python下载大文件-python requests 下载大文件不完整
- WPF 窗口居中 变更触发机制
- Duration(2020多校第二场D)
- java类的理解_Java类该怎么理解?
- spring:我是如何解决循环依赖的?
- 代码投毒、删库跑路,开源生态链安全该如何保证?
- .net 这些年发展 参考资料
- jQuery-动画效果(图片抽奖案例)
- Linux下Docker安装微信文件传输问题
- #Ubuntu# #机械键盘# 功能键/多媒体键切换无效
- 兼容exe的linux系统,国产操作系统下想运行EXE?你何不虚拟个电脑系统出来
- 编程中的Context(上下文)
- Oracle:ORA-00054 资源正忙
- ARM GICv3中断控制器
- 格式工厂转码错误原因0x000000001 怎么办
- apt-get install E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing
- ldap打通confluence