• Kprobe在Linux kernel debug中的应用


    http://www.linuxidc.com/Linux/2013-01/77578.htm


    一直在做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的基本框架,仅供参考:



    点击(此处)折叠或打开

    1. /*
    2. * kprobe_jiffies.c
    3. */

    4. #include <linux/module.h>
    5. #include <linux/kernel.h>
    6. #include <linux/string.h>
    7. #include <linux/init.h>
    8. #include <linux/kprobes.h>
    9. #include <linux/kallsyms.h>

    10. /* global probe object */
    11. struct kprobe probe;

    12. /* jiffies record */
    13. unsigned long jiffies_enter = 0;
    14. unsigned long jiffies_exit = 0;

    15. /*
    16. * enter the probe pointer
    17. */
    18. static int pre_probe(struct kprobe *probe, struct pt_regs *regs)
    19. {
    20. jiffiesjiffies_enter = jiffies;
    21. return 0;
    22. }

    23. /*
    24. * exit the probe pointer
    25. */
    26. static void post_probe(struct kprobe *probe, struct pt_regs *regs, unsigned long flags)
    27. {
    28. unsigned long diff;

    29. jiffiesjiffies_exit = jiffies;
    30. diff = jiffies_exit - jiffies_enter;
    31. printk("spending time: %lu, enter: %lu, exit: %lu ",
    32. diff, jiffies_enter, jiffies_exit);
    33. }

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

    38. probe.addr = (kprobe_opcode_t *) kallsyms_lookup_name("probe_function");
    39. if (probe.addr == NULL) {
    40. printk("Cannot find out 'dd_xor_encode_sse' in system ");
    41. return 1;
    42. }

    43. register_kprobe(&probe);
    44. printk("register probe jffies driver. ");
    45. return 0;
    46. }

    47. static void __exit kprobe_jiffies_exit(void)
    48. {
    49. unregister_kprobe(&probe);
    50. printk("unregister probe jffies driver. ");
    51. return;
    52. }

    53. module_init(kprobe_jiffies_init);
    54. module_exit(kprobe_jiffies_exit);

    55. MODULE_AUTHOR("xxx");
    56. MODULE_DESCRIPTION("kernel probe driver");
    57. MODULE_LICENSE("GPL");



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



    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(65) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Npm 被公司墙解决方法
    使用Docker开发NodeJs APP
    如何利用Require.Js管理多页面站点文件(译)
    Swift语言指南(十)--字符串与字符
    Swift语言指南(九)--基本运算符
    Swift语言指南(八)--语言基础之元组
    Swift语言指南(七)--语言基础之布尔值和类型别名
    web 开发入门
    JDBC的操作总结
    JDBC连接数据库
  • 原文地址:https://www.cnblogs.com/ztguang/p/12649184.html
Copyright © 2020-2023  润新知