Kprobe在Linux kernel debug中的应用

一直在做kernel开发方面的工作,也一直苦于kernel debug的困惑,到底如何进行kernel开发的debug的工作?今天经美国同事的推荐,我认为kprobe是一个非常好的debug工具。其本质原理就是在你需要probe的地方放入断点指令,然后在断点处调用你的调试/测试程序,从而可以实现对kernel程序的调试/测试。

Kprobe只是提供了一种机制,使得用户可以在系统运行时调试/测试内核程序。使用Kprobe需要做如下几件事情:

1,需要找到测试点所对应的内存地址。这件工作可能是最麻烦的,如果测试点是函数,那么可以通过/proc/kallsyms接口得到需要测试函数的内存地址,当然也可以通过kallsyms_lookup_name函数找到函数的内存地址。如果测试点是函数中间的某个位置,那么需要通过通过反汇编找到这个内存地址,这一步可以通过objdump来完成。目前,我不知道是不是有现成的程序可以完成测试点内存地址的查找工作,我觉得完全可以开发一个perl脚本对ko文件解析,从而获取测试点的内存地址。

2,写一个kernel module,完成信息收集,测试等工作,所有的测试代码需要在这个kernel module中完成。

下面是我今天的一个测试程序,用Kprobe测试一个内核函数所用的jiffies时间,基本上是一个Kprobe kernel module的基本框架,仅供参考:

/*
 * kprobe_jiffies.c
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/kprobes.h>
#include <linux/kallsyms.h> 

/* global probe object */
struct kprobe probe;  

/* jiffies record */
unsigned long jiffies_enter = 0;
unsigned long jiffies_exit = 0;  

/*
 * enter the probe pointer
 */
static int pre_probe(struct kprobe *probe, struct pt_regs *regs)
{
    jiffiesjiffies_enter = jiffies;
    return 0;
}  

/*
 * exit the probe pointer
 */
static void post_probe(struct kprobe *probe, struct pt_regs *regs, unsigned long flags)
{
    unsigned long diff;  

    jiffiesjiffies_exit = jiffies;
    diff = jiffies_exit - jiffies_enter;
    printk("spending time: %lu, enter: %lu, exit: %lu\n",
            diff, jiffies_enter, jiffies_exit);
}  

static int __init kprobe_jiffies_init(void)
{
    probe.pre_handler = pre_probe;
    probe.post_handler = post_probe;  

    probe.addr = (kprobe_opcode_t *) kallsyms_lookup_name("probe_function");
    if (probe.addr == NULL) {
        printk("Cannot find out 'dd_xor_encode_sse' in system\n");
        return 1;
    }  

    register_kprobe(&probe);
    printk("register probe jffies driver.\n");
    return 0;
}  

static void __exit kprobe_jiffies_exit(void)
{
    unregister_kprobe(&probe);
    printk("unregister probe jffies driver.\n");
    return;
}  

module_init(kprobe_jiffies_init);
module_exit(kprobe_jiffies_exit);  

MODULE_AUTHOR("xxx");
MODULE_DESCRIPTION("kernel probe driver");
MODULE_LICENSE("GPL");

我想Kprobe是个非常不错的东西,如果在Kprobe的基础上包装一下,使得用户更加容易的使用,那么对内核程序的调试将是会发生革命性的变化。我想有时间我应该在Kprobe的基础上做一个内核调试工具了。

出处:http://alanwu.blog.51cto.com/3652632/1109054

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索内存
, 测试
, 函数
, kernel
, probe
, printk
, 一个
, probe函数调用
probe函数
linux kernel debug、linux kprobe、kernel debuginfo、sys kernel debug、kernel debug,以便于您获取更多的相关知识。

时间: 2024-11-18 10:13:17

Kprobe在Linux kernel debug中的应用的相关文章

Linux kernel scriptes bin2c &quot;\x&quot;

/**************************************************************************** * Linux kernel scriptes bin2c "\x" * 声明: * 早上在阅读Linux kernel scriptes中的源代码的时候发现bin2c的源代码, * 于是打算看一下,结果发现"\x"的写法,于是查了点资料,看了一下它的用法. * * 2015-12-29 深圳 南山平山村 曾剑锋

编译器-关于linux kernel中的container_of宏的困惑

问题描述 关于linux kernel中的container_of宏的困惑 #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );}) 最近在看linux kernel中的链表操作, 看到了如上这个宏, 其实表达的意思很简单, 但是他要用一个__mptr来指向

FL2440 Linux kernel + yaffs2根文件移植过程(一)

本文全过程为自己亲自试验,成功移植了一个最基本功能的Kernel.根文件系统,现在将这个一耗时.耗精力 的过程写下来,希望对遇到相同问题的朋友们有所帮助! 平台:飞凌FL2440             windows xp sp2             vmware 6.5.build-203739              ubuntu 9.10              交叉编译器: 4.3.2              内核:linux-2.6.28.7.tar.bz2        

The Linux Kernel Module Programming Guide

The Linux Kernel Module Programming Guide Peter Jay SalzmanMichael BurianOri Pomerantz Copyright 2001 Peter Jay Salzman The Linux Kernel Module Programming Guide is a free book; you may reproduce and/or modify it under the terms of the Open Software

Linux kernel suspend resume学习:2.6.35与3.0.35比较【转】

转自:http://blog.csdn.net/njuitjf/article/details/18317149 Linux kernel suspend resume学习:2.6.35与3.0.35比较 最近在学习linux kernel中suspend和resume的处理.只是一味的看代码,有点枯燥,刚好有两个项目使用了不同的内核版本,就以比较这两个间的处理差别为线索进行学习.由于列举了很多代码,为了保持连续性,整篇文章还是放到了一个blog中. 首先看看公开出去的接口,都是文件/sys/p

Linux Kernel sys_call_table、Kernel Symbols Export Table Generation Principle、Difference Between System Calls Entrance In 32bit、64bit Linux【转】

转自:http://www.cnblogs.com/LittleHann/p/4127096.html 目录 1. sys_call_table:系统调用表 2. 内核符号导出表:Kernel-Symbol-Table 3. Linux 32bit.64bit环境下系统调用入口的异同 4. Linux 32bit.64bit环境下sys_call_table replace hook   1. sys_call_table:系统调用表 0x1: sys_call_table简介 sys_call

日志-怎么控制,不让linux下debug信息输出到Tomcat下log/catalina.out

问题描述 怎么控制,不让linux下debug信息输出到Tomcat下log/catalina.out 最近维护服务器的时候,发现上传上去的文件大小全部为0, 一查才知道磁盘已经被占满了,排查下来发现tomcat下log/catalina.out文件 竟然达到惊人的10G,观察里面的信息,几乎全部是项目的debug信息, 而项目log4j的配置输出地址日志信息正常,等于是日志信息正常打印到指定位置之后, 又重复打印到catalina.out. 搜了下这个问题,几乎全是如何分割或清空catalin

在Ubuntu上编译 emulat Android avd内核源代码(Linux Kernel)

因为我没有真机的环境  所以需要在模拟器中进行模拟进行,所以要下载支持模拟器的源代码版本,而goldfish这个源代码版本就是专门为模拟器环境而提供的. The goldfish project contains the kernel sources for the emulated platforms. 一.首先,到 git clone https://android.googlesource.com/kernel/goldfish.git下载Linux Kernel for Android

Linux Kernel 4.5在3月15日发布最终版

  今天Linus Torvalds和辛苦工作的内核团队非常自豪的宣布了Linux Kernel 4.5版本,并已经开放下载.自2016年1月25日首个候选版本发布,经历了长达两个多月的不懈更新,在3月6日发布最后一个候选版本之后,Linux Kernel 4.5终于在今天获得了最终版本. Linux Kernel 4.5的突出特性包括部署了AMD的PowerPlay电池管理技术,针对Radeon 显卡添加的AMD GPU开源驱动带来了更高的性能输出,同时在处理Brtfs文件系统中改善了空闲空间