Skip to content

Commit 759fc7a

Browse files
Asphalttbrb
authored andcommitted
Fix broken --filter-trace-tc
It fails to run with --filter-trace-tc: ```bash 2024/09/24 12:59:02 Attaching tc-bpf progs... 2024/09/24 12:59:02 failed to trace TC progs: failed to trace bpf progs: failed to find address for function entry2 of bpf prog SchedCLS(entry2)#28 ``` Then, I fix it by matching prog ksym with prog tag. And avoid `addr - 1` for `--filter-trace-{tc,xdp}`. ```bash 2024/09/25 13:57:00 Attaching tc-bpf progs... 2024/09/25 13:57:00 Attaching kprobes (via kprobe-multi)... 49 / 49 [--------------------------------------------------------------------------------------------------------------------------------------] 100.00% ? p/s 2024/09/25 13:57:00 Attached (ignored 0) 2024/09/25 13:57:00 Listening for events.. SKB CPU PROCESS NETNS MARK/x IFACE PROTO MTU LEN TUPLE FUNC 0xffff8e151d39be00 6 <empty>:0 4026531840 0 ens33:2 0x0800 1500 98 192.168.241.1:0->192.168.241.133:0(icmp) bpf_prog_e20a685998fd41c8_entry1[bpf](tc) 0xffff8e151d39a500 6 <empty>:0 4026531840 0 ens33:2 0x0800 1500 98 192.168.241.1:0->192.168.241.133:0(icmp) bpf_prog_e20a685998fd41c8_entry1[bpf](tc) 0xffff8e151d39bd00 6 <empty>:0 4026531840 0 ens33:2 0x0800 1500 98 192.168.241.1:0->192.168.241.133:0(icmp) bpf_prog_e20a685998fd41c8_entry1[bpf](tc) 0xffff8e151d39a200 6 <empty>:0 4026531840 0 ens33:2 0x0800 1500 98 192.168.241.1:0->192.168.241.133:0(icmp) bpf_prog_e20a685998fd41c8_entry1[bpf](tc) 0xffff8e151d39a800 6 <empty>:0 4026531840 0 ens33:2 0x0800 1500 98 192.168.241.1:0->192.168.241.133:0(icmp) bpf_prog_e20a685998fd41c8_entry1[bpf](tc) ^C2024/09/25 14:02:16 Received signal, exiting program.. 2024/09/25 14:02:16 Detaching kprobes... 3 / 3 [---------------------------------------------------------------------------------------------------------------------------------------] 100.00% 50 p/s ``` Signed-off-by: Leon Hwang <[email protected]>
1 parent 81b7b62 commit 759fc7a

File tree

4 files changed

+23
-20
lines changed

4 files changed

+23
-20
lines changed

internal/pwru/bpf_prog.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,31 +42,35 @@ func listBpfProgs(typ ebpf.ProgramType) ([]*ebpf.Program, error) {
4242
return progs, nil
4343
}
4444

45-
func getEntryFuncName(prog *ebpf.Program) (string, string, error) {
45+
func getBpfProgInfo(prog *ebpf.Program) (entryFuncName, progName, tag string, err error) {
4646
info, err := prog.Info()
4747
if err != nil {
48-
return "", "", fmt.Errorf("failed to get program info: %w", err)
48+
err = fmt.Errorf("failed to get program info: %w", err)
49+
return
4950
}
5051

5152
_, ok := info.BTFID()
5253
if !ok {
5354
// FENTRY/FEXIT program can only be attached to another program
5455
// annotated with BTF. So if the BTF ID is not found, it means
5556
// the program is not annotated with BTF.
56-
return "", "", errNotFound
57+
err = errNotFound
58+
return
5759
}
5860

5961
insns, err := info.Instructions()
6062
if err != nil {
61-
return "", "", fmt.Errorf("failed to get program instructions: %w", err)
63+
err = fmt.Errorf("failed to get program instructions: %w", err)
64+
return
6265
}
6366

6467
for _, insn := range insns {
6568
sym := insn.Symbol()
6669
if sym != "" {
67-
return sym, info.Name, nil
70+
return sym, info.Name, info.Tag, nil
6871
}
6972
}
7073

71-
return "", "", errNotFound
74+
err = errNotFound
75+
return
7276
}

internal/pwru/ksym.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ func ParseKallsyms(funcs Funcs, all bool) (Addr2Name, BpfProgName2Addr, error) {
5858
scanner := bufio.NewScanner(file)
5959
for scanner.Scan() {
6060
line := strings.Split(scanner.Text(), " ")
61-
name, isBpfProg := extractBpfProgName(line[2])
61+
name := strings.ReplaceAll(line[2], "\t", "")
6262
if all || (funcs[name] > 0) {
6363
addr, err := strconv.ParseUint(line[0], 16, 64)
6464
if err != nil {
@@ -73,7 +73,7 @@ func ParseKallsyms(funcs Funcs, all bool) (Addr2Name, BpfProgName2Addr, error) {
7373
if all {
7474
a2n.Addr2NameSlice = append(a2n.Addr2NameSlice, sym)
7575
}
76-
if isBpfProg {
76+
if isBpfProg := strings.HasSuffix(name, "[bpf]"); isBpfProg {
7777
n2a[name] = addr
7878
}
7979
}
@@ -88,7 +88,3 @@ func ParseKallsyms(funcs Funcs, all bool) (Addr2Name, BpfProgName2Addr, error) {
8888

8989
return a2n, n2a, nil
9090
}
91-
92-
func extractBpfProgName(name string) (string, bool) {
93-
return strings.ReplaceAll(name, "\t", ""), strings.HasSuffix(name, "[bpf]")
94-
}

internal/pwru/output.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ func getAddrByArch(event *Event, o *output) (addr uint64) {
254254
switch runtime.GOARCH {
255255
case "amd64":
256256
addr = event.Addr
257-
if !o.kprobeMulti {
257+
if !o.kprobeMulti && event.Type == eventTypeKprobe {
258258
addr -= 1
259259
}
260260
case "arm64":
@@ -365,8 +365,10 @@ func getOutFuncName(o *output, event *Event, addr uint64) string {
365365
return outFuncName
366366
}
367367

368-
var maxTupleLengthSeen int
369-
var maxFuncLengthSeen int
368+
var (
369+
maxTupleLengthSeen int
370+
maxFuncLengthSeen int
371+
)
370372

371373
func fprintWithPadding(writer *os.File, data string, maxLenSeen *int) {
372374
if len(data) > *maxLenSeen {
@@ -412,7 +414,6 @@ func (o *output) Print(event *Event) {
412414
fprintWithPadding(o.writer, outFuncName, &maxFuncLengthSeen)
413415
fmt.Fprintf(o.writer, " %s", o.addr2name.findNearestSym(event.CallerAddr))
414416
} else {
415-
416417
fmt.Fprintf(o.writer, " %s", outFuncName)
417418
}
418419

internal/pwru/tracing.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func (t *tracing) traceProg(spec *ebpf.CollectionSpec,
6464
opts *ebpf.CollectionOptions, prog *ebpf.Program, n2a BpfProgName2Addr,
6565
tracingName string,
6666
) error {
67-
entryFn, name, err := getEntryFuncName(prog)
67+
entryFn, progName, tag, err := getBpfProgInfo(prog)
6868
if err != nil {
6969
if errors.Is(err, errNotFound) {
7070
log.Printf("Skip tracing bpf prog %s because cannot find its entry function name", prog)
@@ -80,11 +80,13 @@ func (t *tracing) traceProg(spec *ebpf.CollectionSpec,
8080
// distinguish which exact bpf prog is called.
8181
// -- @jschwinger233
8282

83-
addr, ok := n2a[entryFn]
83+
progKsym := fmt.Sprintf("bpf_prog_%s_%s[bpf]", tag, entryFn)
84+
addr, ok := n2a[progKsym]
8485
if !ok {
85-
addr, ok = n2a[name]
86+
progKsym = fmt.Sprintf("bpf_prog_%s_%s[bpf]", tag, progName)
87+
addr, ok = n2a[progKsym]
8688
if !ok {
87-
return fmt.Errorf("failed to find address for function %s of bpf prog %v", name, prog)
89+
return fmt.Errorf("failed to find address for function %s of bpf prog %v", progName, prog)
8890
}
8991
}
9092

0 commit comments

Comments
 (0)