Skip to content

Commit 49b6fbe

Browse files
author
Your Name
committed
添加 --no-tids 支持对tid进行过滤
1 parent 13cb7de commit 49b6fbe

9 files changed

Lines changed: 91 additions & 29 deletions

File tree

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ CMD_CLANG ?= clang
22
CMD_GO ?= go
33
CMD_RM ?= rm
44

5+
DEBUG_PRINT ?=
6+
ifeq ($(DEBUG),1)
7+
DEBUG_PRINT := -DDEBUG_PRINT
8+
endif
9+
510
.PHONY: all
611
all: ebpf assets build
712
@echo $(shell date)
@@ -22,6 +27,7 @@ ebpf:
2227
-nostdlibinc \
2328
-no-canonical-prefixes \
2429
-O2 \
30+
$(DEBUG_PRINT) \
2531
-isystem external/bionic/libc/include \
2632
-isystem external/bionic/libc/kernel/uapi \
2733
-isystem external/bionic/libc/kernel/uapi/asm-arm64 \
@@ -38,6 +44,7 @@ ebpf:
3844
-nostdlibinc \
3945
-no-canonical-prefixes \
4046
-O2 \
47+
$(DEBUG_PRINT) \
4148
-isystem external/bionic/libc/include \
4249
-isystem external/bionic/libc/kernel/uapi \
4350
-isystem external/bionic/libc/kernel/uapi/asm-arm64 \

cli/cmd/root.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ func persistentPreRunEFunc(command *cobra.Command, args []string) error {
7878
target_config.Pid = global_config.Pid
7979
}
8080

81+
target_config.TidBlacklistMask = 0
82+
if global_config.TidsBlacklist != "" {
83+
tids := strings.Split(global_config.TidsBlacklist, ",")
84+
if len(tids) > 5 {
85+
return fmt.Errorf("max tid blacklist count is 5, provided count:%d", len(tids))
86+
}
87+
for i, v := range tids {
88+
value, _ := strconv.ParseUint(v, 10, 32)
89+
target_config.TidBlacklist[i] = uint32(value)
90+
target_config.TidBlacklistMask |= (1 << i)
91+
}
92+
}
93+
8194
// 第二步 通过包名获取uid和库路径 先通过pm命令获取安装位置
8295
if global_config.Name != "" {
8396
return parseByPackage(global_config.Name)
@@ -210,6 +223,7 @@ func init() {
210223
rootCmd.PersistentFlags().StringVarP(&global_config.Name, "name", "n", "", "must set uid or package name")
211224
rootCmd.PersistentFlags().Uint64VarP(&global_config.Uid, "uid", "u", 0, "must set uid or package name")
212225
rootCmd.PersistentFlags().Uint64VarP(&global_config.Pid, "pid", "p", 0, "add pid to filter")
226+
rootCmd.PersistentFlags().StringVarP(&global_config.TidsBlacklist, "no-tids", "", "", "tid black list, max 5")
213227
rootCmd.PersistentFlags().BoolVarP(&global_config.Debug, "debug", "d", false, "enable debug logging")
214228
rootCmd.PersistentFlags().StringVarP(&global_config.LoggerFile, "out", "o", "", "-o save the packets to file")
215229
rootCmd.PersistentFlags().BoolVarP(&global_config.Quiet, "quiet", "", false, "use with --log-file, wont logging to terminal when used")

cli/cmd/stack.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,13 @@ func stackCommandFunc(command *cobra.Command, args []string) {
117117
Symbol: stack_config.Symbol,
118118
Offset: stack_config.Offset,
119119
SConfig: config.SConfig{
120-
UnwindStack: stack_config.UnwindStack,
121-
ShowRegs: stack_config.ShowRegs,
122-
RegName: stack_config.RegName,
123-
Uid: target_config.Uid,
124-
Pid: target_config.Pid,
120+
UnwindStack: stack_config.UnwindStack,
121+
ShowRegs: stack_config.ShowRegs,
122+
RegName: stack_config.RegName,
123+
Uid: target_config.Uid,
124+
Pid: target_config.Pid,
125+
TidBlacklist: target_config.TidBlacklist,
126+
TidBlacklistMask: target_config.TidBlacklistMask,
125127
},
126128
}
127129
if err := pConfig.Check(); err == nil {

src/common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#define TASK_COMM_LEN 16
99

10+
#define MAX_TID_BLACKLIST_COUNT 5
11+
1012
typedef signed char __s8;
1113

1214
typedef unsigned char __u8;

src/stack.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ struct {
2222
struct filter_t {
2323
u32 uid;
2424
u32 pid;
25+
u32 tid_blacklist_mask;
26+
u32 tid_blacklist[MAX_TID_BLACKLIST_COUNT];
2527
};
2628

2729
struct {
@@ -52,6 +54,30 @@ int probe_stack(struct pt_regs* ctx) {
5254
return 0;
5355
}
5456

57+
#ifdef DEBUG_PRINT
58+
char fmt0[] = "debug0, tid:%d mask:%d\n";
59+
bpf_trace_printk(fmt0, sizeof(fmt0), tid, filter->tid_blacklist_mask);
60+
#endif
61+
62+
#pragma unroll
63+
for (int i = 0; i < MAX_TID_BLACKLIST_COUNT; i++) {
64+
if ((filter->tid_blacklist_mask & (1 << i))) {
65+
66+
#ifdef DEBUG_PRINT
67+
char fmt1[] = "debug1, tid:%d filter_tid:%d\n";
68+
bpf_trace_printk(fmt1, sizeof(fmt1), tid, filter->tid_blacklist[i]);
69+
#endif
70+
71+
if (filter->tid_blacklist[i] == tid) {
72+
// 在tid黑名单直接跳过
73+
return 0;
74+
}
75+
} else {
76+
// 避免不必要的循环
77+
break;
78+
}
79+
}
80+
5581
u32 zero = 0;
5682
struct hook_data_event_t* event = bpf_map_lookup_elem(&data_buffer_heap, &zero);
5783
if (event == NULL) {

user/config/config_global.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
package config
22

33
type GlobalConfig struct {
4-
Quiet bool
5-
Prepare bool
6-
Name string
7-
Debug bool
8-
Uid uint64
9-
Pid uint64
10-
LoggerFile string
11-
ExecPath string
4+
Quiet bool
5+
Prepare bool
6+
Name string
7+
Debug bool
8+
Uid uint64
9+
Pid uint64
10+
TidsBlacklist string
11+
LoggerFile string
12+
ExecPath string
1213
}
1314

1415
func NewGlobalConfig() *GlobalConfig {

user/config/config_hook.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,10 @@ func (this *ProbeConfig) Check() error {
6060

6161
func (this *ProbeConfig) GetFilter() StackFilter {
6262
filter := StackFilter{
63-
uid: uint32(this.Uid),
64-
pid: uint32(this.Pid),
63+
uid: uint32(this.Uid),
64+
pid: uint32(this.Pid),
65+
tid_blacklist_mask: this.TidBlacklistMask,
66+
tid_blacklist: this.TidBlacklist,
6567
}
6668
return filter
6769
}

user/config/config_target.go

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package config
22

33
type TargetConfig struct {
4-
Name string
5-
Uid uint64
6-
Pid uint64
7-
LibraryDirs []string
8-
DataDir string
9-
Abi string
4+
Name string
5+
Uid uint64
6+
Pid uint64
7+
TidBlacklist [MAX_TID_BLACKLIST_COUNT]uint32
8+
TidBlacklistMask uint32
9+
LibraryDirs []string
10+
DataDir string
11+
Abi string
1012
}
1113

1214
func NewTargetConfig() *TargetConfig {

user/config/iconfig.go

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package config
22

3+
const MAX_TID_BLACKLIST_COUNT = 5
4+
35
type StackFilter struct {
4-
uid uint32
5-
pid uint32
6+
uid uint32
7+
pid uint32
8+
tid_blacklist_mask uint32
9+
tid_blacklist [MAX_TID_BLACKLIST_COUNT]uint32
610
}
711

812
type SyscallFilter struct {
@@ -18,12 +22,14 @@ type IConfig interface {
1822
}
1923

2024
type SConfig struct {
21-
Uid uint64
22-
Pid uint64
23-
UnwindStack bool
24-
ShowRegs bool
25-
RegName string
26-
Debug bool
25+
Uid uint64
26+
Pid uint64
27+
TidBlacklistMask uint32
28+
TidBlacklist [MAX_TID_BLACKLIST_COUNT]uint32
29+
UnwindStack bool
30+
ShowRegs bool
31+
RegName string
32+
Debug bool
2733
}
2834

2935
func (this *SConfig) SetDebug(debug bool) {

0 commit comments

Comments
 (0)