鉴于内核运转逆,在非常顶点使习惯于下,内核运转睡觉,当内核睡觉时,它会引起睡觉。。为了处置此成绩,内核引入了一种新的内核机制,用于快速地装货和重行开端。。内核引发另一个事情的一件事新的内核经过kdump当它睡觉,旧内存回想的的内存调试,让零碎在新内核上运转 ,为了就撤销了机具的亡故。,增长零碎的不变性。

(1)刀具kexec引见

kexec是一套零碎转会,容许用户从眼前的治理的内核装货另人家内核。用户可以运用shell命令百胜 install kexec器安置kexec器,安置后,你可以运用kexec命令。

器kexec启动正好进入人家新的内核,它可以从眼前的内核装货并由另人家内核启动。。在眼前的内核中,kexec治理Bootloader的功用。首要的辨别规范的零碎启动和kexec启动我:kexec启动工序做成某事,固件或BIOS依赖于计算者硬件架构将无力的被治理。。这将大大地增加重行开端的工夫。。

使内核的转会功用,内核波湾阴谋使具一定排队断言config_kexec = Y,这项可能在可见。后使产生的使具一定排队用纸覆盖使具一定排队。

该器运用kexec是分为两个行走,率先,体重调试内核到内存kexec,抓,启动装货内核的转会。

装货内核的句子如次所示:

kexec -l kernel-image –append=command-line-options –initrd=initrd-image

在上面的命令中,决定因素内核回想的是装货内核的计划用纸覆盖。,命令不支集紧缩的内核回想的用纸覆盖先,未紧缩的内核回想的用纸覆盖vmlinux可能运用;决定因素的initrd回想的运用initrd回想的用纸覆盖启动;决定因素命令行相当或获准终止选择是命令行相当或获准终止选择。,命令行相当或获准终止选择可能是人眼前的内核。,可以从用纸覆盖/引发另一个事情的一件事/ CmdLine滴下,用纸覆盖的满足如次所示:

^-^$ cat /proc/cmdline

ro root=/dev/VolGroup00/LogVol00 rhgb quiet

像:内核,用户想启动计划/启动/ vmlinux,initrd为/boot/initrd,kexec装货命令如次:

Kexec –l /boot/vmlinux –append=/dev/VolGroup00/LogVol00 initrd=/boot/initrd

您还可以添加相当或获准终止选择P或装货恐慌。,指示性的在零碎内核睡觉中运用新内核的装货。。

装货内核接近末期的,用以下命令启动装货的内核,并运转在人家新内核中:

kexec -e

当kexec提议眼前的内核,新的内核,它运转,kexec份新内核预先准备好的保持不变的内存块,保持不变地位如图1所示。, 原始内核保持不变了份额内存(在GR的尾随切断)。,用于装货新内核,另一个内存区域缺勤装货新内核。,由原零碎内核运用。

图1 的prereserved地位在kexec装货内核

在x86建筑风格的机具上,第一位640kb物质的内存本质的运用零碎启动时,内核装货,kexec在重启动进入转储接住的内核从前伴奏的此区域。类似性地,ppc64架构的机具本质的运用第一位32kb物质的内核,你本质的支集64K页,kexec伴奏的第人家64KB内存。

(2)kdump引见

kdump是人家本kexec睡觉转储机制(本kexec Crash 卸下),不管内核内核本质的转储什么,如:当零碎睡觉时,kdump运用kexec快速地启动的内核转储接住。在这边,原始内核称为零碎内核或原始内核。,新装货的内核称为转储接住内核或内核。。

在重行试验工序中,保持不变原始内核的内存回想的。,转储接住的内核(新装货的内核)可以出口回想的。。用户可以运用命令cp和scp将内存计划拷贝到人家本地驱车旅行器上的转储用纸覆盖或经过系统拷贝到长途计算者上。

眼前除非X86, x86_64, ppc64和ia64构架支集kdump和kexec。

当零碎内核启动时,它保持不变了由转储接住的内存的一小切断。,它确保零碎内核正好内存出口(正好)。 Memory Access:DMA)不使舍弃转储所接住的内核。。命令kexec p将新内核装货到保持不变内存。。

睡觉前,占有零碎内核的玉蜀黍发育不良的穗图像编码是ELF体式。,并内存在内核的保持不变区域中。。ELF头的开端物质的地址经过决定因素elfcorehdr=boot交付到转储接住的内核。

经过运用转储接住的内核,用户可以经过两种办法出口内存回想的或旧内存。:

(1)经过/ dev / oldmem实现者鼻子,接住器可以读取实现者用纸覆盖并在源用纸覆盖中研究内存。,它是内存原始流的转储。。剖析和接住器本质的的十足智能,以决定L。。

(2)经过/proc / vmcore,可以在ELF体式用纸覆盖中出口转储传达,用户可以运用GDB(GNU) 运用调试器等剖析器调试转储用纸覆盖和睡觉调试T。

(3)达到快速地重启机制和安置器。

1)安置器kexec器

你可以下载源编码,波湾阴谋和安置器kexec太。因器kexec器还安心另一个已确定的藏书楼,例如,最好的办法是运用百胜命令。 install kexec器下载安置和非本意的动作求解dependenci。

2)波湾阴谋零碎和转储接住内核

波湾阴谋孤独转储接住内核来接住内核转储,您也可以运用原始内核作为转储接住内核。,在这种使习惯于下,你不本质的重行波湾阴谋内核转储接住人家独自的,不管怎样除非支集重行确定方向内核的钢骨构架才干用作,如:架构i386和IA64支集重行确定方向的玉蜀黍发育不良的穗。

在流行中的零碎和转储接住内核,翻开kdump支集,内核本质的设置已确定的特别使具一定排队相当或获准终止选择。,零碎内核和转储接住内核的使具一定排队相当或获准终止选择:

零碎内核的使具一定排队相当或获准终止选择阐明如次:

  • 在菜项处置机中 type and 的特征。翻开相当或获准终止选择kexec system call”,使内核波湾阴谋和安置科熙零碎转会。使具一定排队用纸覆盖。使具一定排队使产生句子config_kexec = Y。
  • 在菜项用纸覆盖零碎中,伪 用纸覆盖零碎。翻开相当或获准终止选择sysfs file system support”,使内核波湾阴谋安置用纸覆盖零碎sysfs.使具一定排队用纸覆盖使产生使产生句子CONFIG_SYSFS=y”。
  • 在菜项内核中 黑客。翻开相当或获准终止选择波湾阴谋 the kernel with debug info “,波湾阴谋和安置内核接近末期的,调试传达出口是,使产生用于转储用纸覆盖剖析的调试指示牌。使具一定排队用纸覆盖使产生使产生句子CONFIG_DEBUG_INFO=Y”。

转储接住内核使具一定排队相当或获准终止选择(不依赖于处置机):

  • 在菜项处置机中 type and 功用翻开相当或获准终止选择内核 crash dumps”,使具一定排队用纸覆盖使产生使产生句子 CONFIG_CRASH_DUMP=y”。
  • 在菜项用纸覆盖、伪 用纸覆盖翻开相当或获准终止选择/引发另一个事情的一件事/ vmcore support”,使具一定排队用纸覆盖使产生使产生句子CONFIG_PROC_VMCORE=y”。

转储接住内核使具一定排队相当或获准终止选择(依赖于处置机构架i386和x86_64)阐明如次:

  • 在i386处置机建筑风格,在菜项处置机中 type and 功用:开式高端内存支集,使具一定排队用纸覆盖使产生使产生句子CONFIG_HIGHMEM64G=y”或”CONFIG_HIGHMEM4G”。
  • 在i386和x86_64处置机建筑风格,在菜项功用 type and 特征:中近对称多处置机支集,使具一定排队用纸覆盖使产生使产生句子CONFIG_SMP=n”。假设在使具一定排队用纸覆盖中使具一定排队config_smp = Y,您可以装设maxcpus = 1的甩体重,内核命令行。
  • 假设你想达到人家漂的内核,在菜项功用 type and featuresif翻开相当或获准终止选择的达到 a relocatable kernel”,使具一定排队用纸覆盖使产生使产生句子CONFIG_RELOCATABLE=y”。
  • 在菜处置机中 type and 低嵌入物质的特点 address where the kernel is loaded”设置一向的值内核装货的物质的地址。它只翻开内核。 crash dumps”时涌现。针对性的值安心内核里面的哪一个可以拿下。。

假设设置了值”CONFIG_PHYSICAL_START=0x100000″,这目的运用人家可重确定方向的玉蜀黍发育不良的穗。将波湾阴谋内核在物质的地址1mb,内核是可重确定方向,例如,内核可以从究竟哪一个物质的地址运转。。Kexec 试验顺序将内核装货到转储帽的内核保持不变区域。。

别的方式,将运用启动决定因素”crashkernel=Y@X”装设其次个内核保持不变内核区域的开端地址,里面,y表现内存区域的规模。,X代表内存区保持不变转储上尉的开端地址,经过X为16MB (0x1000000),例如用户可设置”CONFIG_PHYSICAL_START=0x1000000″。

使具一定排队内核接近末期的,波湾阴谋和安置内核和内核模块。

3)发达crashkernel句子

在零碎内核的试验命令行相当或获准终止选择中,通常句子”crashkernel=size[@offset]”在流行中的大部分录音使具一定排队已足量了,但偶然保持不变的内存安心零碎RAM。。在这点上,内存可发达crashkernel命令行 在提议切断O后,该限度局限将免于零碎启动。。发达crashkernel句子如次:

crashkernel=:[,:,偏移]

里面,range=start-[end]。

像:crashkernel=512M-2G:64M,2G-:128M,牵涉为:假设内存决不512m,不要设置保持不变内存,假设内存是512M和2G私下,为64M设置保持不变内存区,假设内存大于128m,在流行中的128m设置保持不变内存区。

4)开端进入零碎内核。

本质的时更新的行为或事例试验顺序。那么,零碎内核启动决定因素crashkernel = YX,如:crashkernel=64M@16M,显示零碎的玉蜀黍发育不良的穗是从物质的地址0x01000000告知 (16MB)的启动64MB的规模用于接住内核转储。通常x86和x86_64平台设置”crashkernel=64M@16M”,ppc64平台设置”crashkernel=128M@32M”。

5)装货转储接住内核

进入零碎内核接近末期的,本质的装货转储接住内核。本处置机建筑风格典型和计划用纸覆盖(重行确定方向),可以选择装载不紧缩的vmlinux或紧缩的bzImage/vmlinuz内核回想的。选择办法表现如次:

i386和x86_64平台:

  • 假设内核不漂,运用vmlinux。
  • 假设内核是可重确定方向,运用bzImage/vmlinuz。

为ppc64平台:

在流行中的IA64平台:

假设用户运用未紧缩的vmlinux图像,那么运用上面的命令装货转储接住内核:

kexec -p     --initrd= --args-linux    --append="root= "

假设用户运用人家bzImage /vmlinuz图像紧缩,那么运用上面的命令装货转储接住内核:

kexec -p \
  --initrd= 
   --append="root= "

在意:args Linux不本质的在IA64平台装设的决定因素。

以下是运用的考虑到于钢骨构架的命令行相当或获准终止选择:

  • i386, x86_64和ia64平台,相当或获准终止选择是1。 irqpoll maxcpus=1 reset_devices”。
  • 为ppc64平台,相当或获准终止选择是1。 maxcpus=1 noirqdistrib reset_devices”。

在装载垃圾桶并接住虫时,应在意以下事项:

  • 未到庭设置下,ELF用纸覆盖是内存在elf64体式,零碎支集超越4GB的内核,在i386,kexec会非本意的动作反省里面的哪一个超越4GB的物质的内存规模限度局限,假设缺勤超越,运用ELF32。例如,在人家非PAE零碎,ELF头不变的运用Elf32体式。
  • 相当或获准终止选择–elf32-core-headers便于使用的于打动人的力量产生ELF32头,这是本质的的,因它在32位零碎上。,GDB是眼前无法与elf64头翻开vmcore用纸覆盖。
  • 在转储接住内核中,启动决定因素irqpoll降低质量驱车旅行顺序设定初值舍弃的存款。
  • 用户本质的的装设由逗号出口的根实现者术语的体式。
  • 启动决定因素1将转储接住内核启动为独立的用户。。假设用户祝愿运用系统,本质的设置为3。
  • 通常不本质的让转储接住内核在SMP中运转。。例如,通常波湾阴谋人家单CPU转储接住内核或装载转储接住内核时装设相当或获准终止选择”maxcpus=1″。

6)内核睡觉时引发另一个事情的一件事内核启动

装货转储后接住内核,假设零碎睡觉(内核) 恐慌),零碎将重行试验到转储接住内核。。重行开端的引发另一个事情的一件事点在功用模块中。, die_nmi()和sysrq处置例程(按ALT-SysRq-c结成键)。

顺风的资格将治理睡觉引发另一个事情的一件事点:

  • 假设计算者硬件被锁定,计算者硬件被锁定。,使具一定排队海里 watchdog”,零碎启动呼叫功用die_nmi()到转储接住内核。
  • 假设职务转会被转会,同样螺纹的PID是0或1。,或许在灯火管制左右包装转会死,或达到panic_on_oops叫死,零碎将开端进入转储接住内核。。
  • 在PowerPC零碎,当产生软重新安放或安置时,占有CPU转会都死了,而且零碎将开端进入转储接住内核。。
  • 为了考查,用户可以运用alt-sysrq-c,”echo c > proc /键引发另一个事情的一件事引发另一个事情的一件事睡觉,或许笔法人家内核模块来打动人的力量内核睡觉。。

7)下车转储用纸覆盖

转储接住内核启动后,用上面的命令写转储用纸覆盖:

cp /proc/vmcore

用户还可以将转储内存作为实现者/dev/oldmem以一次的原始流看法终止出口,运用以下命令成立实现者:

mknod /dev/oldmem c 1 12

运用命令DD重复转储内存的考虑到切断。,重复完全的内存的命令如次所示:

dd if=/dev/oldmem of=oldmem.001

8)转储用纸覆盖剖析

在转储图像剖析从前,用户可能重行试验到不变内核中。。用户可以运用GDB对重复转储终止有限的的剖析。。- G相当或获准终止选择可能被添加到vmlinux波湾阴谋,可以使产生调试指示牌。,那么,用上面的命令调试vmlinux:

SysRq有奇异魔力的结成键用誊写版印刷机印刷内核传达

键瑰宝是一套钥匙,三键Alt键 [ commandkey ]的用键盘进行作用上,这是人家可选的使用钥匙commandkey。SysRq有奇异魔力的结成键以意见分歧的结成键,可以把持内核或内核传达布置功用。SysRq有奇异魔力的的结成键的功用表现是显示在Tabl。

表1 SysRq结成键的功用表现

项名 功用阐明
b 紧接地开端意见分歧步或卸下货物或其它负担硬质地层。
c 相当的睡觉转储治理科熙重启。
d 显示占有锁定的锁。
e 发送人家记号SIGTERM的整个工序,除非设定初值。
f 你会要求给oom_kill消耗光回忆热工序。
g 经过对平台的PPC和SH KGDB运用。
h 显示帮忙传达。
i 发送人家记号SIGKILL的整个工序,除非设定初值。
k 承保出口键(承保) Access Key,SAK)消耗光在眼前的蠢货终点顺序。
m 将眼前的内存传达转储到把持台。
n 为实时分派设置可调尼斯。
o 将完毕当日广播零碎(假设使具一定排队为支集)。
p 用誊写版印刷机印刷眼前的流露并显示出特性把持台。
q 占有运转点火调节装置的列表将被完全屈从于压制。。
r 完毕当日广播用键盘进行作用原时尚和设置到XLATE时尚。
s 尝试同时性占有衔接的用纸覆盖零碎。。
t 将眼前的分派列表及其传达转储到把持台。
u 尝试以只读办法重行衔接占有衔接的用纸覆盖零碎。。
v 自船只在海上航行者 把持台的SMP处置机传达。
w 转储的占有不行灯火管制(闭塞)声明分派。
x 在平台PPC / PowerPC的xmon(X鼻子用于监控)。
0~9 实现者把持台日记高于,把持将用誊写版印刷机印刷到把持台的内核传达。。像:0只用誊写版印刷机印刷紧要传达,如:恐慌和蹩脚的传达。

默许SysRq结成键完毕当日广播。运用以下命令翻开此职务:

# echo 1 > /proc/sys/kernel/sysrq

完毕当日广播此职务的命令如次所示:

# echo 0 > /proc/sys/kernel/sysrq

假设你想让同样职务一向任务,您可以在用纸覆盖中设置1的值。。 零碎重行开端后,此功用将非本意的动作翻开。。

翻开SysRq结成键功用,终点出口的用户可以运用它来用誊写版印刷机印刷内核传达。。

在意:SysRq结成键X Windows无法运用。您本质的的率先切换到倒转术蠢货终点。。假设在图形接口,您可以经过Ctrl Alt f1切换到蠢货终点。。在串行终点上,您本质的先在终点发送灯火管制记号。,那么进入SysRq键5秒。假设用户具有root动力,可把commandkey性格研究到/proc/sysrq-trigger用纸覆盖,引发另一个事情的一件事内核传达用誊写版印刷机印刷,用誊写版印刷机印刷的传达内存在。上面是命令示例:

^-^$ echo ''t'' > sysrq-trigger
^-^vim /var/log/messages
Oct 29 17:51:43 njllinux kernel: SysRq : Show State
Oct 29 17:51:43 njllinux kernel:  task                        PC stack   pid father
Oct 29 17:51:43 njllinux kernel: init          S ffffffff812b76a0     0     1      0
Oct 29 17:51:43 njllinux kernel: ffff81013fa97998 0000000000000082 0000000000000000 ffff81013fa9795c
Oct 29 17:51:43 njllinux kernel: 000000003fa97978 ffffffff81583700 ffffffff81583700 ffff81013fa98000
Oct 29 17:51:43 njllinux kernel: ffffffff813cc5b0 ffff81013fa98350 000000003c352a50 ffff81013fa98350
Oct 29 17:51:43 njllinux kernel: Call Trace:
Oct 29 17:51:43 njllinux kernel: 000300000004 ffff8101333cb090
Oct 29 17:51:43 njllinux kernel: Call Trace:
Oct 29 17:51:43 njllinux kernel: [] sys_pause+0x19/0x22
Oct 29 17:51:43 njllinux kernel: [] tracesys+0xd0/0xd5
Oct 29 17:51:43 njllinux kernel:
Oct 29 17:51:43 njllinux kernel: lighttpd      S ffffffff812b76a0     0  3365      1
Oct 29 17:51:43 njllinux kernel: ffff810132d49b18 0000000000000082 0000000000000000 ffff810132d49adc
Oct 29 17:51:43 njllinux kernel: ffff81013fb2d148 ffffffff81583700 ffffffff81583700 ffff8101354896a0
Oct 29 17:51:43 njllinux kernel: ffffffff813cc5b0 ffff8101354899f0 0000000032d49ac8 ffff8101354899f0
Oct 29 17:51:43 njllinux kernel: Call Trace:
Oct 29 17:51:43 njllinux kernel: [] ? __mod_timer+0xbb/0xcd
Oct 29 17:51:43 njllinux kernel: [] schedule_timeout+0x8d/0xb4
Oct 29 17:51:43 njllinux kernel: [] ? process_timeout+0x0/0xb
Oct 29 17:51:43 njllinux kernel: [] ? schedule_timeout+0x88/0xb4
Oct 29 17:51:43 njllinux kernel: [] do_sys_poll+0x2a8/0x370
……

命令strace

命令strace 显示顺序转会的占有零碎转会。运用 strace 器,用户可以明晰地关照转会工序和所运用的决定因素。,从事流行它们与作用零碎私下的粗灰底层互相。。当零碎转会舍弃时,逆的指示牌值(如 enomem)和应和的性格串(像) of 内存)可以显示。

starce 另人家行动是处置与静态库相关性的成绩。。当运转人家可治理用纸覆盖的地位,它将告知您顺序所运用的静态库和地位。

strace命令行相当或获准终止选择的阐明如表1。普通的的选择是T, -T, -e, -o等。

表1 命令strace命令行相当或获准终止选择阐明

相当或获准终止选择 阐明
-c 每个零碎转会治理工夫的统计数字传达、次数和次数逆等。。
-d 出口已确定的调试传达自身的strace出口到规范出口。
-f 经过零碎转会尾随眼前的男高音使产生的子男高音。。
-ff 假设你运用相当或获准终止选择O filename,那么将尾随奏效出口到应和的正中的。,pid是每个男高音的男高音号。。
-F 冲击尾随vfork转会。在F,vfork不尾随。
-h 出口扼要帮忙传达。
-i 零碎转会时用誊写版印刷机印刷指导性的柄。
-q 制止出口涉及粘连和脱接头的传达,当出口重标定方向到用纸覆盖并正好而不是。
-r 印刷对立工夫戳在每个零碎转会的嵌入。
-t 在每行出口的工夫传达中。
-tt 在每行出口的工夫传达中,包住手写本。
-ttt 手写本出口,工夫表达工夫。
-T 显示零碎转会所需的工夫。
-v 出口占有零碎转会的传达。已确定的環境變數,声明,鉴于频繁运用,输出和出口转会常常运用。,默许出口不出口。
-V 出口传达版本传达。
-x 以十六带排队出口非ASCII规范性格串。
-xx 占有性格串都以十六的排队出口。。
-a column 将言归正传值与装设的列数流露。,默许值是40。。
-e expr 装设人家式,它是用来把持方式尾随的。
【准备工作!]value1[,value2]…
限符仅非常是 trace,abbrev,verbose,raw,signal,read,笔法经过。值是要界限的指示牌或数字。。默许限符是 trace。感叹号里面的哪一个为指示牌。
-eopen 力量的均等于 -e trace=open,指示性的只尾随翻开的转会。。而-etrace!翻开指示性的尾随另一个转会,而不是翻开。。
-e trace=set 只尾随装设的零碎转会。像:e trace=open,close,再,研究弄清除非这四的零碎转会被尾随。。默许值是set =占有。
-e trace=file 只尾随用纸覆盖名作为决定因素的零碎转会。,用纸覆盖作用普通。
-e trace=process 除非尾随零碎转会男高音把持。
-e trace=network 只尾随与系统相关性的占有零碎转会。
-e strace=signal 尾随与零碎记号涉及的占有零碎转会。
-e trace=ipc 尾随占非常零碎转会,男高音间符合相关性。
-o filename 写的传达出口到用纸覆盖的用纸覆盖名。
-p pid 尾随装设工序pid。
-s strsize 装设最大性格串用誊写版印刷机印刷音长。,默许值是32。。
-u username 治理命令的用户名的UID和GID。

像:命令strace 的PWD出口切断如次:

execve("/bin/pwd", [pwd], [/* 39 vars */]) = 0
uname({零碎=Linux, node="sammy", ...}) = 0
辩论(0)                                  = 0x804c000
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4001...
	fstat64(3, {st_mode=S_IFREG|0644, st_size=115031, ...}) = 0
old_mmap(NULL, 115031, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40017000
完毕当日广播(3)                                = 0
open("/lib/tls/", O_RDONLY)    = 3
里德(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\360U\1"..., 1024) = 1024
fstat64(3, {st_mode=S_IFREG|0755, st_size=1547996, ...}) = 0

职务printk用誊写版印刷机印刷内核传达

Linux内核职务printk用誊写版印刷机印刷调试传达,同样职务的运用类似地C库职务printf用誊写版印刷机印刷F,但在内核中运用。用户可以添加人家职务printk在内核编码的地位,正好在检查或日记用纸覆盖上用誊写版印刷机印刷相关性传达。

职务printk将调试传达辩论日记勒。日记高于是用宏界限的。,开发为性格串,在波湾阴谋时将它和音讯倒转术由预处置机衔接到性格串中。,例如,在日记高于和体式性格串私下不克不及有逗号。。

以下两 printk 的例,人家是调试传达。,人家是使用钥匙传达。:

printk(KERN_DEBUG "Here I am: %s:%i\n", _ _FILE_ _, _ _LINE_ _); 
printk(KERN_CRIT "I''m trashed; giving up on %p\n", PTR)

样例:在用户空偶然内核中开启及完毕当日广播用誊写版印刷机印刷调试音讯 用户还可以在内核或用户空虚的应用顺序中用誊写版印刷机印刷调试传达。,调试功用可以在makefile用纸覆盖翻开或完毕当日广播。界限办法如次所示:

/**/
#undef PDEBUG             /* undef it, just in case */ 
#ifdef SCULL_DEBUG 
#ifdef _ _KERNEL_ _ 
    /* This one if debugging is on, and kernel space */ 
#define PDEBUG(fmt,args。 printk(KERN_DEBUG "scull: " fmt, ## args)
#else 
    /* This one for user space */ 
#define PDEBUG(fmt, args。 fprintf(stderr, fmt, ## args) 
#endif 
#else 
#define PDEBUG(fmt, args。 /* not debugging: nothing */ 
#endif

将上面几行添加到用纸覆盖的makefile:

# Comment/uncomment the following line to disable/enable debugging 
DEBUG = y 
 
# Add your debugging flag (或 不) to CFLAGS 
ifeq (调试),y) 
 DEBFLAGS = -O -g -DSCULL_DEBUG # "-O" 
else 
 DEBFLAGS = -O2 
endif 
 
CFLAGS += $(DEBFLAGS)

在makefile调试值的多样,当您本质的调试传达时,DEBUG = y,不本质的工夫,调试分派另一个值。重行做。

内核检测Kprobe

Kprobe(内核检测),kernel 盘问)是一种静态搜集调试和功能环行的的器。,如:流露和大局录音结构的搜集和另一个调试传达,不本质的频繁地波湾阴谋和启动Linux内核。。用户可以接住究竟哪一个内核编码地址。,装设调试断点引发另一个事情的一件事器时的处置例程。。任务机制是:用户装设人家探测点。,并将用户界限的处置职务与探测点相关性联。,当内核治理探测点时,治理应和的相关性职务。,那么持续治理定期地的编码航线。。

Kprobe容许用户笔法内核模块添加调试传达的。当在长途机具上调试有bug的顺序而日记/var/log/messages不克不及看出逆时,Kprobe抵抗常有益于的。用户可以波湾阴谋内核模块。,并将内核模块拔出到调试内核中,您可以出口所需的调试传达。。

内核检测分为Kprobe, 它和Kretprobe(也叫偿还) probe,三种言归正传检测。Kprobe可以拔出到内核做成某事究竟哪一个指导性的;它将核职务的嵌入,出恭出口职务的决定因素;return 盘问用于检测装设职务的言归正传值。。

内核模块init的设定初值职务被安置(或记载),内核模块的放弃斗争职务放弃斗争将把它们记载着陆。。记载功用(如:register_kprobe())装设在侦察器拔出的位、由检测点引发另一个事情的一件事的处置例程。

(1)使具一定排队内核支集Kprobe

使具一定排队内核时确信在.config用纸覆盖中设置了CONFIG_KPROBES、CONFIG_MODULES、CONFIG_MODULE_UNLOAD、CONFIG_KALLSYMS_ALL和CONFIG_DEBUG_INFO。

使具一定排队了CONFIG_KALLSYMS_ALL,kprobe便于使用的职务kallsyms_lookup_name从地址解析编码。在使具一定排队config_debug_info,你可以运用命令objdump -d -l Vmlinux的检查编码计划从源到目的。

调试用纸覆盖零碎debugfs包住调试鼻子Kprobe,你可以检查记载Kprobe列表,你也可以完毕当日广播/翻开Kprobe。

检查零碎记载盘问的办法如次所示:

#cat /debug/kprobes/list
c015d71a  k  vfs_read+0x0
c011a316  j  do_fork+0x0
c03dedc5  r  tcp_v4_rcv+0x0

第一位列表现内核地址由检测点拔出,其次列表现内核检测的典型。,K代表Kprobe,R代表Kretprobe,J代表它,装设检测点的第三列的指示牌 偏移量。假设检测到的职务属于人家模块,还装设了模块名。。

翻开和完毕当日广播Kprobe办法如次:

#echo ‘1’ /debug/kprobes/enabled
#echo ‘0’ /debug/kprobes/enabled

(2)Kprobe范本

Linux内核源编码在一览表samples/kpobges下布置了各式各样的kprobe典型的探测处置例程笔法样例,辨别对应的用纸覆盖、和,稍加修正,用户就可以相当本人的内核检测模块。。以下是Kprobe型的要不是的例。

范本kprobe_example是Kprobe型检测顺序的内核模块,显示了在职务do_fork被转会时方式运用kprobe转储栈和选择的流露。当内核职务do_fork成立新的男高音,在把持台和/var/log/messages空军将领显示职务printk用誊写版印刷机印刷的尾随录音。战利品kprobe_example如次(在战利品:

#include 
#include 
#include 
 
/* 在流行中的每个检测,用户本质的装设人家Kprobe女朋友
static struct kprobe kp = {
	.symbol_name	= "do_fork",
};
 
/* 在治理检测指导性的从前,转会预处置例程 pre_handler,用户本质的界限例程的作用。
static int handler_pre(struct kprobe *p, struct pt_regs 规则)
{
#ifdef CONFIG_X86
	printk(KERN_INFO "pre_handler: p->addr = 0x%p, ip = %lx,"
			" flags = 0x%lx\n",
		p->addr, regs->ip, regs->符号);  用誊写版印刷机印刷地址、指示性的符号
#endif
#ifdef CONFIG_PPC
	printk(KERN_INFO "pre_handler: p->addr = 0x%p, nip = 0x%lx,"
			" msr = 0x%lx\n",
		p->addr, regs->nip, regs->msr);
#endif
 
	/* 在这边你可以转会内核鼻子职务dump_stack用誊写版印刷机印刷出
	return 0;
}
 
/* 在治理检测指导性的接近末期的,Kprobe转会后处置顺序post_handler */
static void handler_post(struct kprobe *p, struct pt_regs *regs,
				unsigned long 符号)
{
#ifdef CONFIG_X86
	printk(KERN_INFO "post_handler: p->addr = 0x%p, flags = 0x%lx\n",
		p->addr, regs->符号);
#endif
#ifdef CONFIG_PPC
	printk(KERN_INFO "post_handler: p->addr = 0x%p, msr = 0x%lx\n",
		p->addr, regs->msr);
#endif
}
 
/*在pre-handler或post-handler做成某事究竟哪一个指导性的或许kprobe单步治理的被探测指导性的产生了无规律时,fault_handler将转会
static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr)
{
	printk(KERN_INFO "fault_handler: p->addr = 0x%p, trap #%dn",
		p->addr, trapnr);
	/* 当您不处置逆时,您可能言归正传
	return 0;
}
 
设定初值内核模块
static int __init kprobe_init(void)
{
	int ret;
	kp.pre_handler = handler_pre;
	kp.post_handler = handler_post;
	kp.fault_handler = handler_fault;
 
	ret = register_kprobe(&kp);  /*记载kprobe*/
	if (RET < 0) {
		printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
		return ret;
	}
	printk(KERN_INFO "Planted kprobe at %p\n", );
	return 0;
}
 
static void __exit kprobe_exit(void)
{
	unregister_kprobe(&kp);
	printk(KERN_INFO "kprobe at %p unregistered\n", );
}
 
module_init(kprobe_init)
module_exit(kprobe_exit)
MODULE_LICENSE("GPL");

Systemtap调试

(1)将道德标准

SystemTap是一种本Kprobe开源软件调试内核。调试器只本质的笔法已确定的本子。,经过命令行相互作用来调查分析和调试运转做成某事内核,您不本质的修正或拔出调试编码。、重行波湾阴谋内核、安置内核并重行开端任务,使内核调试从事轻易和轻易。SystemTap调试工序类似地断点的命令行德。

将研究调试本子在本子释放宣言类似地awk La,本子命名事情并装设这些EV的处置例程。。供给装设的事情产生,Linux内核将运转应和的处置例程。。

有几种典型的事情,如:输出或放弃斗争职务,人家定时曝光控制计到期的或完全的SystemTap交往开端或终止。处置例程是大约装设的本子释放宣言句子。,包住事情左右文做成某事录音滴下,将它们内存到本质上的变量或用誊写版印刷机印刷奏效。

SystemTap的运转工序如图2所示,笔法、调试本子时将用户调试,Systemtap的判读员模块(translator)将本子经句子剖析(parse)、c释放宣言调试器使产生后的职务处置(特点阐明)和信息,那么,运转C波湾阴谋器波湾阴谋(build)成立调试内核模块。那么将内核模块装货到内核中。,经过Kprobe机制,内核的钩子起动占有检测事情。。当究竟哪一个处置机有效这些事情时,应和的处置例程被引发另一个事情的一件事以任务。,kprobe机制在内核获取的调试录音经过用纸覆盖零碎relayfs传回Systemtap,出口调试录音。在调试完毕时,交往终止,内核钩子衔接断开,并卸下货物或其它负担内核模块。完全的作用工序是由人家单一的命令行顺序,战术驱车旅行。

图2 SystemTap运转工序

(2)STAP顺序

STAP顺序是SystemTap器的前端,它收到检测指导性的写在SystemTap本子网络,把这些指导性的判读员成C释放宣言编码。,波湾阴谋C编码,使产生并装货内核模块到运转的林。,用于治理邀请的尾随或检测功用。。用户可以在装设用纸覆盖中布置本子,也可以布置调试句子f。。

命令STAP的运用如次所示:

stap [ OPTIONS ] FILENAME [ ARGUMENTS ]

stap [ OPTIONS ] - [ ARGUMENTS ]

stap [ OPTIONS ] -e SCRIPT [ ARGUMENTS ]

stap [ OPTIONS ] -l PROBE [ ARGUMENTS ]

相当或获准终止选择[ OPTIONS ]阐明如次:

-h 显示帮忙传达。

-V 显示版本传达。

-k 手术用完后,保持不变暂时一览表。用于反省使产生的C编码或重用已波湾阴谋的内核女朋友,这很有益于。。

-u 非最优化波湾阴谋时尚。.

-w 完毕当日广播正告传达。

-b 容许内核到用户录音信息运用大电流容量时尚。

-t 搜集工夫传达:检测次数治理、每回检测所破费的平均估价工夫。。

-sNUM 内核用户录音信息 MB 的缓冲剂。当多个处置机以块时尚任务时,这是独立的处置机缓冲剂的规模。。

-p NUM SystemTap终止后数步。行走数是1-5。: parse, elaborate, translate, compile, run。

-I DIR 添加tapset库(用于判读员C编码的职务集)搜索一览表。

-D NAME=VALUE 添加C释放宣言宏界限的内核模块的makefile,重写有限的决定因素。

-R DIR 在人家预先决定的一览表中找到SystemTap运转源编码。

-r RELEASE 在流行中的预先决定内核而不是运转内核波湾阴谋的公映的新影片版本。

-m MODULE 命名波湾阴谋模块使产生的内核模块,默许的随机命名代用药。使产生的内核模块被重复到眼前的一览表。。

-o FILE 将规范出口发送到命名用纸覆盖用纸覆盖。在批量时尚下,每个CPU的用纸覆盖的术语将由file_cpu序号代表。

-c CMD 开端检测,运转cmd,命令吃光后放弃斗争。

-x PID 设定目的

发表评论

电子邮件地址不会被公开。 必填项已用*标注