红帽Linux故障定位技术详解与实例(4)
红帽Linux故障定位技术详解与实例(4)
在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行各种操作命令或测试程序的方式对故障环境进行观察,分析,测试,以定位出故障发生的原因。
6、使用kprobe来观察内核函数的执行实例
kprobe是SystemTap对内核函数进行probing的功能在内核中的实现,由于内核中提供了正式的API来使用kprobe,所以对很多内核程序员来说,也许直接使用kprobe比使用SystemTap更方便. 内核中提供了三种类型的kprobe处理函数,分别是jprobe, kprobe, kretprobe, 下面的代码用这三个probe观察在TCP/IP的arp_process函数执行中对ip_route_input()调用的返回结果.这个代码还展示了在同一个函数probe的Entry handler和Ret handler之间共享参数的方法. 代码如下:
- arp_probe.c /*
- * arp_probe.c, by Qianfeng Zhang (frzhang@redhat.com)
- */
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- MODULE_AUTHOR("frzhang@redhat.com");
- MODULE_DESCRIPTION("A module to track the call results of ip_route_input() inside arp_process using jprobe and kretprobe");
- MODULE_LICENSE("GPL");
- static int j_arp_process(struct sk_buff *skb)
- {
- struct net_device *dev = skb->dev;
- struct in_device *in_dev;
- int no_addr, rpf;
- in_dev = in_dev_get(dev);
- no_addr = ( in_dev->ifa_list == NULL );
- rpf = IN_DEV_RPFILTER(in_dev);
- in_dev_put(in_dev);
- printk("\narp_process() is called with interface device %s, in_dev(no_addr=%d,rpf=%d) \n", dev->name, no_addr, rpf);
- jprobe_return();
- return(0);
- };
- static int j_fib_validate_source(__be32 src, __be32 dst, u8 tos, int oif,
- struct net_device *dev, __be32 *spec_dst, u32 *itag, u32 mark)
- {
- printk("fib_validate_source() is called with dst=0x%x, oif=%d \n", dst, oif);
- jprobe_return();
- return(0);
- };
- static struct jprobe my_jp1 = {
- .entry = j_arp_process,
- .kp.symbol_name = "arp_process"
- };
- static struct jprobe my_jp2 = {
- .entry = j_fib_validate_source,
- .kp.symbol_name = "fib_validate_source"
- };
- static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
- {
- printk("Calling: %s()\n", ri->rp->kp.symbol_name);
- return(0);
- };
- static int return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
- {
- int eax;
- eax = regs->ax & 0xffff ;
- printk("Returning: %s() with a return value: 0x%lx(64bit) 0x%x(32bit)\n", ri->rp->kp.symbol_name, regs->ax, eax);
- return(0);
- };
- static int fib_lookup_entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
- {
- struct fib_result *resp;
- resp = (struct fib_result *) regs->dx;
- printk("Calling: %s()\n", ri->rp->kp.symbol_name);
- *((struct fib_result **)ri->data) = resp;
- return(0);
- };
- static int fib_lookup_return_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
- {
- struct fib_result *resp;
- int eax;
- eax = regs->ax & 0xffff ;
- resp = *((struct fib_result **) ri->data);
- printk("Returning: fib_lookup() with a return value: 0x%lx(64bit) 0x%x(32bit), result->type: %d\n", regs->ax, eax, resp->type);
- return(0);
- }
- static struct kretprobe my_rp1 = {
- .handler = return_handler,
- .entry_handler = entry_handler,
- .kp.symbol_name = "ip_route_input_slow"
- };
- static struct kretprobe my_rp2 = {
- .handler = return_handler,
- .entry_handler = entry_handler,
- .kp.symbol_name = "fib_validate_source"
- };
- static struct kretprobe my_rp3 = {
- .handler = fib_lookup_return_handler,
- .entry_handler = fib_lookup_entry_handler,
- .kp.symbol_name = "fib_lookup",
- .data_size = sizeof(struct fib_result *)
- };
- static int __init init_myprobe(void)
- {
- int ret;
- printk("RTN_UNICAST is %d\n", RTN_UNICAST);
- if ( (ret = register_jprobe(&my_jp1)) < 0) {
- printk("register_jprobe %s failed, returned %d\n", my_jp1.kp.symbol_name, ret);
- return(-1);
- }
- if ( (ret = register_jprobe(&my_jp2)) < 0) {
- printk("register_jprobe %s failed, returned %d\n", my_jp2.kp.symbol_name, ret);
- return(-1);
- }
- if ( (ret = register_kretprobe(&my_rp1)) < 0 ) {
- printk("register_kretprobe %s failed, returned %d\n", my_rp1.kp.symbol_name, ret);
- unregister_jprobe(&my_jp1);
- unregister_jprobe(&my_jp2);
- return(-1);
- }
- if ( (ret = register_kretprobe(&my_rp2)) < 0 ) {
- printk("register_kretprobe %s failed, returned %d\n", my_rp2.kp.symbol_name, ret);
- unregister_jprobe(&my_jp1);
- unregister_jprobe(&my_jp2);
- unregister_kretprobe(&my_rp1);
- return(-1);
- }
- if ( (ret = register_kretprobe(&my_rp3)) < 0 ) {
- printk("register_kretprobe %s failed, returned %d\n", my_rp3.kp.symbol_name, ret);
- unregister_jprobe(&my_jp1);
- unregister_jprobe(&my_jp2);
- unregister_kretprobe(&my_rp1);
- unregister_kretprobe(&my_rp2);
- return(-1);
- }
- return 0;
- }
- static void __exit rel_myprobe(void)
- {
- unregister_jprobe(&my_jp1);
- unregister_jprobe(&my_jp2);
- unregister_kretprobe(&my_rp1);
- unregister_kretprobe(&my_rp2);
- unregister_kretprobe(&my_rp3);
- }
- module_init(init_myprobe);
- module_exit(rel_myprobe);
- Makefile obj-m += arp_probe.o
- Making #> make -C /usr/src/kernels/2.6.32-71.el6.x86_64/ M=`pwd` modules
Linux故障定位技术详解与实例的内容介绍完了,希望通过本文红帽Linux故障定位技术的学习能对你有所帮助!
原文地址:http://beareyes.com.cn/2/lib/201109/27/20110927182_0.htm
红帽Linux故障定位技术详解与实例(4)的更多相关文章
- 红帽Linux故障定位技术详解与实例(3)
红帽Linux故障定位技术详解与实例(3) 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍然可以访问,故障处理人员可通过console, ssh等方式登录到操作系统上,在shell上执行 ...
- 红帽Linux故障定位技术详解与实例(2)
红帽Linux故障定位技术详解与实例(2) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- 红帽Linux故障定位技术详解与实例(1)
红帽Linux故障定位技术详解与实例(1) 2011-09-28 14:26 圈儿 BEAREYES.COM 我要评论(0) 字号:T | T 在线故障定位就是在故障发生时, 故障所处的操作系统环境仍 ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- Protocol Buffer技术详解(C++实例)
Protocol Buffer技术详解(C++实例) 这篇Blog仍然是以Google的官方文档为主线,代码实例则完全取自于我们正在开发的一个Demo项目,通过前一段时间的尝试,感觉这种结合的方式比较 ...
- Linux crontab命令详解与实例
内容有重复的,不过本着宁多勿少的原则就都看看吧,就当加深印象啦 基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示第2列表示小时 ...
- kali Linux渗透测试技术详解
kali Linux渗透测试技术详解 下载:https://pan.baidu.com/s/1g7dTFfzFRtPDmMiEsrZDkQ 提取码:p23d <Kali Linux渗透测试技术详 ...
- Python开发技术详解(视频+源码+文档)
Python, 是一种面向对象.直译式计算机程序设计语言.Python语法简捷而清晰,具有丰富和强大的类库.它常被昵称为胶水语言,它能够很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松地联结 ...
- 手游录屏直播技术详解 | 直播 SDK 性能优化实践
在上期<直播推流端弱网优化策略 >中,我们介绍了直播推流端是如何优化的.本期,将介绍手游直播中录屏的实现方式. 直播经过一年左右的快速发展,衍生出越来越丰富的业务形式,也覆盖越来越广的应用 ...
随机推荐
- C#编程 socket编程之unity聊天室
上面我们创建了tcp的客户端和服务端,但是只能进行消息的一次收发.这次我们做一个unity的简易聊天室,使用了线程,可以使用多个客户端连接服务器,并且一个客户端给服务器发消息后,服务器会将消息群发给所 ...
- 闲记Windows 取证艺术
是不是很好奇,别人能够在你电脑上查看你运行程序历史,文档使用痕迹,浏览器浏览历史种种历史痕迹,没错,通过简单的系统了解以及配合相对应的工具,这一切就是这么的简单,看起来很高大上的操作,其实是 ...
- 【miscellaneous】最新HEVC/H.265 4K视频,显卡解码测试
转载自:http://bbs.zol.com.cn/diybbs/d34441_76103.html 4K这个概念也在最近几年开始流行了起来,无论是4K显示器.4K电视盒子,还是4K游戏对硬件的要求也 ...
- 影响mysql主从延迟速度的相关参数
1.sync-binlog MySQL提供一个sync_binlog参数来控制数据库的binlog刷到磁盘上去. 默认,sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自 ...
- HP UNIX弱口令
这种弱口令直接丢进kali linu里用john --wordlist=zd.txt 加上文件
- 2019icpc南昌邀请赛B Polynomial (拉格朗日插值法)
题目链接:https://nanti.jisuanke.com/t/40254 题意: 思路: 这题要用到拉格朗日插值法,网上查了一下,找到一份讲得特别好的: -------------------- ...
- 课程计划安排 ver: 2016-12-14
录的越多,后续肯定会涨价. <x86 从实模式到保护模式> 这本书涉及到除了汇编语言,还有一些计算机架构和操作系统方面相关的知识点. 不仅为学习高级编程语言打下了非常扎实的基础,学完C++ ...
- redis缓存穿透00
缓存穿透 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果数据库 ...
- 小白基础Python重要的字符串详解String的内置方法
String的内置方法: st='hello world {name} is {age}' {} 特殊内容需要识别format print(st.count('1')) 统计元素个数 print ...
- Java加密数据库
一.背景 数据库配置以明文方式展示如图,会造成安全隐患,如果有黑客入侵会造成密码泄露,信息窃取和破坏等. 二.加密步骤 1.对数据库信息加密: 对数据库中的账号和密码信息进行加密(选择一种算法)然后替 ...