专栏首页相遇LinuxLinux内核常用的动态调试手段

Linux内核常用的动态调试手段

本文介绍linux内核中几种常用的动态调试手段,也都是我常用的,都是在生产环境中直接使用,不需要借助工具,依照我的经验,去客户生产环境中解决问题,很多都不会预装perf、BPF工具,有的即使有perf这样的工具,也因为工具性能影响客户几千亿美金的正常业务,也会不让你使用。

最常见的就是使用kprobe,kprobe具体的原理可以参考我以前写的这篇文章kprobe原理

使用kprobe最常用的就是查询函数调用的参数和返回值:

cd /sys/kernel/debug/tracing

echo ‘p:myprobe do_sys_open fname_str=+0(%si):string' > kprobe_events

echo 'r:myretprobe do_sys_open $retval' >> kprobe_events

ls ./events/kprobes/

enable filter myprobe myretprobe

使能kprobe event:

echo 1 > ./events/kprobes/myprobe/enable

echo 1 > ./events/kprobes/myretprobe/enable

cat ./trace (可以看到系统中调用open的文件名和返回值)

至于在kprobe_events文件中指定的寄存器(%si),基于具体平台的不同会不一样,可以预先使用perf工具查询到当前平台上获取函数参数的寄存器。

[root@u-jeff ~]# perf probe 'do_sys_open filename:string flags:u32'

Added new event:

...

[root@u-jeff ~]# cat /sys/kernel/debug/tracing/kprobe_events

p:probe/do_sys_open _text+2391184 filename_string=+0(%si):string flags_u32=%dx:u32

第二类就是使用trace event:

比如像linux内核中最著名的函数__schedule()

static void __sched notrace __schedule(bool preempt)

{

...

trace_sched_switch(preempt, prev, next);

...

}

这种原理不用多说,是内核代码编译的时候就已经内嵌于函数中的,只需打开对应开关就可以看到固定格式的打印信息。

#pwd

/sys/kernel/debug/tracing/events/sched/sched_switch

#cat /sys/kernel/debug/tracing/trace

系统中大量子系统中的函数都嵌入了这种trace event,只需针对性打开开关便可。

#pwd

/sys/kernel/debug/tracing/events

还有一些函数里面没有内嵌trace event,或者有时想查看函数的调用堆栈,可以使用trace function + stack_trace

cd /sys/kernel/debug/tracing/

echo 0 > ./tracing_on

echo function > current_tracer

echo 1 > options/func_stack_trace

echo "your function" > set_ftrace_filter

echo 1 > tracing_on

比如把”your function"改成 schedule

cat ./trace 可以看到调用schedule时的函数堆栈,而不需要在函数中加上WARN_ON(1)这样的语句再重新编译内核。

不管是function tracer还是 function_graph 这样的tracer,

cat ./available_tracers

hwlat blk function_graph wakeup_dl wakeup_rt wakeup function nop

我最佩服的就是实现此功能时同步代码段的方法,其实就是怎样从下面第一幅图变成第二幅图:

图一:

图二:

因为实现这些功能的原理就是在代码段函数头中插上预先设定好的函数调用,如果刚刚插入代码时,正好有程序跑到这块代码就好玩了,系统很可能会崩掉,在x86系统上采用的就是先在函数头中插入一个字节指令'cc',当其它进程执行此指令时,系统进入int3中断流程,

所以在do_int3中可以看到下面类似的代码:

当插入‘cc'之后,把'cc'指令同步到所有的cpu,然后把’cc‘之后的代码换成函数调用代码,最后把’cc'换掉,一切都ok.

本文分享自微信公众号 - 相遇Linux(LinuxJeff),作者:JeffXie

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一步步利用Linux kernel漏洞<1/4>

    声明: 我nice值至少为0,利用Linux kernel 漏洞不是为了做坏事,在这里分享如何利用Linux kernel漏洞,在整个利用过程中掌握linux ...

    jeff xie
  • Linux内核红黑树使用

    我现正在linux kernel 4.4.1中新增一个类sysfs文件系统,取名jefffs,

    jeff xie
  • KVM影子页表

    2019年是崭新的一年,Linux kernel 5.0 低调发布了,给我的感觉就是,牛人不断在飞跃,我们也要策马奔腾赶紧追赶才有些许出路。

    jeff xie
  • Web/PhpStorm2019等Jetbrains系列软件最新版激活教程

    打开网站:http://idea.lanyus.com 点击获得激活码可获取最新激活码。

    德顺
  • 让你家的楼宇门变聪明:基于树莓派实现任意终端控制楼宇门

    原创作者:豆豆青春不喂狗 一、背景 寒冷冬天的早晨,你躺在被窝里,门铃响了,你需要立刻起床穿衣服,然后去开门。现在,树莓派能帮你获得一个从容穿衣的时间。 二、摘...

    FB客服
  • 如何在设计中使用色彩叠加

    色彩在任何设计中都是一个重要的组成部分。无论你是喜欢明亮、大胆的色彩,或是更喜欢简约的黑白色,如何使用颜色对整体的设计有很大的影响。 设计中使用颜色叠加是运用颜...

    前朝楚水
  • 记一次数据恢复经历

    有将近一周没有写文章了,经历了一场所有IT从业者的梦魇——数据丢失。一块1T的移动硬盘中,约500G的分区数据无故消失,想必挺多人都遇上过这种事,无奈,尽快尝试...

    一条老狗
  • 行业内参 | 4个行业,100条新闻,一文全面了解过去1周大事件

    保险行业协会披露的公告显示,中国太平洋人寿保险股份有限公司将对蚂蚁金服进行股权投资,投资金额约 16 亿元。太平洋寿险是保险巨头中国太保旗下的寿险子公司。公告显...

    机器之心
  • SVM | 支持向量机原理讲解(二)

    在支持向量机一中,我们介绍了当数据集是线性可分的时候,我们可以使用线性可分的支持向量机将数据进行分类(由于隔了很长时间才更新,因此忘记了支持向量机一的读者可以回...

    磐创AI
  • Entity Framework DBFirst尝试

    “Database First”模式我们称之为“数据库优先”,前提是你的应用已经有相应的数据库,你可以使用EF设计工具根据数据库生成数据数据类,你可以使用Vis...

    aehyok

扫码关注云+社区

领取腾讯云代金券