Skip to content

Commit 79ba058

Browse files
再做了一些优化
1 parent a57ca8b commit 79ba058

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

README.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,15 @@
1313

1414
**set_fun_info**函数用于在so文件的指定偏移处设置uprobe挂载点,并可传递指定函数名。
1515

16+
**set_fun_info2**函数用于在set_fun_info函数设置成功但失效的情况下,与set_fun_info函数作用一致
17+
1618
**clear_all_uprobes**函数用于清除所有的uprobe挂载点。
1719

18-
上述函数的返回结果有SET_TRACE_SUCCESS、SET_TRACE_ERROR两种,分别表示设置成功和失败。
20+
上述函数的返回结果有SET_TRACE_SUCCESS、SET_TRACE_ERROR两种,分别表示设置成功和失败。
21+
22+
# 一些疑惑
23+
set_fun_info2函数其实就是将传入的函数偏移-0x1000再传递到内核,为什么要这样做?其实是因为
24+
在内核使用uprobe_register函数注册uprobe挂载点的时候在一些情况下会出现实际注册的函数偏移比
25+
传入的偏移多上0x1000,而如果我们传入的偏移-0x1000就正好抵消了这个影响。至于为什么会这样,
26+
我翻阅linux内核源码发现问题出现于[内存地址计算错误](https://elixir.bootlin.com/linux/v5.15.74/source/kernel/events/uprobes.c#L1004),从这里开始内存地址就多加上了0x1000,我推测是内存页少算了
27+
一页,但是具体原因不清楚。

kernel_trace.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ static int trace_handler(struct uprobe_consumer *self, struct mpt_regs *regs){
139139
if(tfun){
140140
goto target_out;
141141
}else{
142-
fun_offset = fun_offset - 0x1000;
143-
tfun = search_key_value(&fun_info_tree,fun_offset);
142+
tfun = search_key_value(&fun_info_tree,fun_offset- 0x1000);
144143
if(likely(tfun)){
145144
goto target_out;
146145
}
@@ -150,7 +149,7 @@ static int trace_handler(struct uprobe_consumer *self, struct mpt_regs *regs){
150149
}
151150

152151
target_out:
153-
logkd("+Test-Log+ fun_name:%s,fun_offset:0x%llx calling\n",tfun->value,fun_offset);
152+
// logkd("+Test-Log+ fun_name:%s,fun_offset:0x%llx calling\n",tfun->value,fun_offset);
154153
int trace_printk_ret = trace_printk(_THIS_IP_,"+Test-Log+ fun_name:%s,fun_offset:0x%llx calling\n",tfun->value,fun_offset);
155154
if(unlikely(trace_printk_ret<0)){
156155
logke("+Test-Log+ trace_printk error\n");

user/uprobe_trace_user.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ int set_fun_info(unsigned long fun_offset,char *fun_name){
3737
return ret;
3838
}
3939

40+
//set_fun_info函数设置成功但失效的情况下再用这个函数
41+
//,最好在一个程序内不要与set_fun_info函数同时使用
42+
int set_fun_info2(unsigned long fun_offset,char *fun_name){
43+
int ret = syscall(__NR_mincore,fun_offset-0x1000,TRACE_FLAG+SET_FUN_INFO,fun_name);
44+
return ret;
45+
}
46+
4047
int clear_all_uprobes(){
4148
int ret = syscall(__NR_mincore,0,TRACE_FLAG+CLEAR_UPROBE,"");
4249
return ret;

0 commit comments

Comments
 (0)