summaryrefslogtreecommitdiff
path: root/documents/kprobe.md
blob: 320d8ee261bbe46310a88cfbbde63014b6f8cd8d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
## kprobe
本功能监控任意内核函数的执行情况,并生成火焰图。
### 查看帮助信息
通过如下命令查看本功能的帮助信息:
```
diagnose-tools kprobe --help
```
结果如下:
```
    kprobe usage:
        --help kprobe help info
        --activate
            verbose VERBOSE
            tgid process group that monitored
            pid thread id that monitored
            comm comm that monitored
            cpu cpu-list that monitored
            probe function that monitored
            dump-style dump style for kprobe. dump to dmesg if it is 1.
        --deactivate
        --report dump log with text.
        --settings dump settings.
```
###  安装KO
参见《安装和卸载KO》一节
###  激活功能
激活本功能的命令是:
```
diagnose-tools kprobe --activate
```
在激活本功能时,可用参数为:
* verbose VERBOSE该参数设置输出级别,暂时未用
* tgid 要采样的进程PID
* pid 要采样的线程TID
* comm 要采样的进程名称
* cpu cpus 要采样的CPU列表,如0-16,23这样的格式d
* probe 要监控的函数名称
* dump-style 输出格式,如果为1,表示输出到dmesg中
例如,如下命令表示监控hrtimer_interrupt函数:
```
diagnose-tools kprobe --activate='probe=hrtimer_interrupt'
```
如果成功,将输出:
```
功能设置成功,返回值:0
    进程ID:0
    线程ID:0
    进程名称:
    函数名称:hrtimer_interrupt
    CPUS:
    输出级别:0
```

如果失败,将输出:
```
功能设置失败,返回值:-16
    进程ID:0
    线程ID:0
    进程名称:
    函数名称:hrtimer_interrupt
    CPUS:
    输出级别:0
```
###  测试用例
运行如下命令,将启动本功能的测试用例:
```
sh /usr/diagnose-tools/test.sh kprobe
```
###  查看设置参数
使用如下命令查看本功能的设置参数:
```
diagnose-tools kprobe --settings
```
结果如下:
```
功能设置:
    是否激活:×
    进程ID:0
    线程ID:0
    进程名称:
    函数名称:hrtimer_interrupt
    CPUS:0-1
    输出级别:0
```

###  查看结果
执行如下命令查看本功能的输出结果:
```
diagnose-tools kprobe --report
```
输出结果示例如下:
```
KPROBE命中:PID: 106526[h2o],时间:[1584004225:651374]
##CGROUP:[h2o]  106526      [4564]  KPROBE命中,时间:[1584004225:651374]
    内核态堆栈:
#@        0xffffffff81025022 save_stack_trace_tsk  ([kernel.kallsyms])
#@        0xffffffffa141f419 diagnose_save_stack_trace  [diagnose]  ([kernel.kallsyms])
#@        0xffffffffa141fd8e ali_diag_task_kern_stack   [diagnose]  ([kernel.kallsyms])
#@        0xffffffffa142eaab kprobe_pre [diagnose]  ([kernel.kallsyms])
#@        0xffffffff81659e1c kprobe_ftrace_handler  ([kernel.kallsyms])
#@        0xffffffff8113559e ftrace_ops_list_func  ([kernel.kallsyms])
#@        0xffffffff81663d44 ftrace_regs_call  ([kernel.kallsyms])
#@        0xffffffff81664cdf smp_apic_timer_interrupt  ([kernel.kallsyms])
#@        0xffffffff81660432 apic_timer_interrupt  ([kernel.kallsyms])
    用户态堆栈:
#~        0xcbf32d _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE4findEPKcmm ([symbol])
#*        0xffffffffffffff h2o (UNKNOWN)
    进程链信息:
#^        0xffffffffffffff h2o (UNKNOWN)
#^        0xffffffffffffff auditd (UNKNOWN)
#^        0xffffffffffffff systemd (UNKNOWN)
##
```
输出结果中,包含kprobe命中的线程PID/名称,线程所在CGROUP组,内核态堆栈,用户态堆栈,进程链等信息。
每次输出结果后,历史数据将被清空。

###  输出火焰图
执行如下命令生成火焰图:
```
diagnose-tools kprobe --report > kprobe.log
diagnose-tools flame --input=kprobe.log --output=kprobe.svg
```
###  关闭功能
通过如下命令关闭本功能:
```
diagnose-tools kprobe --deactivate 
```
如果成功,将输出:
```
kprobe is not activated
```
如果失败,将输出:
```
deactivate kprobe fail, ret is -1
```
关闭功能后,本功能将不会对系统带来性能影响。