Skip to content

Commit e392454

Browse files
committed
Fix tracefs bugs for handling non standard mount points and improve
error messages Signed-off-by: Daniel Hodges <[email protected]>
1 parent 6e1c704 commit e392454

File tree

4 files changed

+39
-20
lines changed

4 files changed

+39
-20
lines changed

events.go

Lines changed: 31 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ const (
2121
// corresponding list of available events.
2222
func AvailableEvents() (map[string][]string, error) {
2323
events := map[string][]string{}
24-
// BUG(hodgesds): this should ideally check mounts for debugfs
25-
rawEvents, err := fileToStrings(TracingDir + "/available_events")
26-
// Events are colon delimited by type so parse the type and add sub
27-
// events appropriately.
24+
tracefsMount, err := TraceFSMount()
25+
if err != nil {
26+
return events, err
27+
}
28+
rawEvents, err := fileToStrings(tracefsMount + "/available_events")
2829
if err != nil {
2930
return events, err
3031
}
32+
// Events are colon delimited by type so parse the type and add sub
33+
// events appropriately.
3134
for _, rawEvent := range rawEvents {
3235
splits := strings.Split(rawEvent, ":")
3336
if len(splits) <= 1 {
@@ -46,13 +49,16 @@ func AvailableEvents() (map[string][]string, error) {
4649
// AvailableSubsystems returns a slice of available subsystems.
4750
func AvailableSubsystems() ([]string, error) {
4851
subsystems := []string{}
49-
// BUG(hodgesds): this should ideally check mounts for debugfs
50-
rawEvents, err := fileToStrings(TracingDir + "/available_events")
51-
// Events are colon delimited by type so parse the type and add sub
52-
// events appropriately.
52+
tracefsMount, err := TraceFSMount()
53+
if err != nil {
54+
return subsystems, err
55+
}
56+
rawEvents, err := fileToStrings(tracefsMount + "/available_events")
5357
if err != nil {
5458
return subsystems, err
5559
}
60+
// Events are colon delimited by type so parse the type and add sub
61+
// events appropriately.
5662
for _, rawEvent := range rawEvents {
5763
splits := strings.Split(rawEvent, ":")
5864
if len(splits) <= 1 {
@@ -65,22 +71,34 @@ func AvailableSubsystems() ([]string, error) {
6571

6672
// AvailableTracers returns the list of available tracers.
6773
func AvailableTracers() ([]string, error) {
68-
return fileToStrings(TracingDir + "/available_tracers")
74+
tracefsMount, err := TraceFSMount()
75+
if err != nil {
76+
return []string{}, err
77+
}
78+
return fileToStrings(tracefsMount + "/available_tracers")
6979
}
7080

7181
// CurrentTracer returns the current tracer.
7282
func CurrentTracer() (string, error) {
73-
res, err := fileToStrings(TracingDir + "/current_tracer")
83+
tracefsMount, err := TraceFSMount()
84+
if err != nil {
85+
return "", err
86+
}
87+
res, err := fileToStrings(tracefsMount + "/current_tracer")
7488
return res[0], err
7589
}
7690

7791
// GetTracepointConfig is used to get the configuration for a trace event.
7892
func GetTracepointConfig(subsystem, event string) (uint64, error) {
79-
res, err := fileToStrings(
80-
TracingDir + fmt.Sprintf("/events/%s/%s/id", subsystem, event))
93+
tracefsMount, err := TraceFSMount()
8194
if err != nil {
8295
return 0, err
8396
}
97+
res, err := fileToStrings(
98+
tracefsMount + fmt.Sprintf("/events/%s/%s/id", subsystem, event))
99+
if err != nil {
100+
return 0, fmt.Errorf("Failed to get tracepoint config for %s:%s: %q", subsystem, event, err)
101+
}
84102
return strconv.ParseUint(res[0], 10, 64)
85103
}
86104

@@ -113,7 +131,7 @@ func ProfileTracepoint(subsystem, event string, pid, cpu int, opts ...int) (BPFP
113131
eventOps,
114132
)
115133
if err != nil {
116-
return nil, err
134+
return nil, fmt.Errorf("Failed to open perf event for PerfEventAttr %+v: %q", eventAttr, err)
117135
}
118136

119137
return &profiler{

fs_utils.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,10 @@ var (
4242
func TraceFSMount() (string, error) {
4343
mounts, err := GetFSMount(TraceFS)
4444
if err != nil {
45-
return "", err
45+
return "", fmt.Errorf("Failed to get tracefs mount: %s", err.Error())
4646
}
4747
if len(mounts) == 0 {
48-
return "", ErrNoMount
48+
return "", fmt.Errorf("Mount for tracefs not mounted")
4949
}
5050
return mounts[0], nil
5151
}
@@ -54,10 +54,10 @@ func TraceFSMount() (string, error) {
5454
func DebugFSMount() (string, error) {
5555
mounts, err := GetFSMount(DebugFS)
5656
if err != nil {
57-
return "", err
57+
return "", fmt.Errorf("Failed to find debugfs mount: %q", err)
5858
}
5959
if len(mounts) == 0 {
60-
return "", ErrNoMount
60+
return "", fmt.Errorf("Mount for debugfs not mounted")
6161
}
6262
return mounts[0], nil
6363
}
@@ -67,7 +67,7 @@ func GetFSMount(mountType string) ([]string, error) {
6767
mounts := []string{}
6868
file, err := os.Open(ProcMounts)
6969
if err != nil {
70-
return mounts, err
70+
return mounts, fmt.Errorf("Failed to find mount type %s: %q", mountType, err)
7171
}
7272
scanner := bufio.NewScanner(file)
7373
for scanner.Scan() {

group_profiler.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func NewGroupProfiler(pid, cpu, opts int, eventAttrs ...unix.PerfEventAttr) (Gro
6464
opts,
6565
)
6666
if err != nil {
67-
return nil, err
67+
return nil, fmt.Errorf("Failed to open perf event with PerfEventAttr %+v %q", eventAttr, err)
6868
}
6969
fds[i] = fd
7070
continue
@@ -82,6 +82,7 @@ func NewGroupProfiler(pid, cpu, opts int, eventAttrs ...unix.PerfEventAttr) (Gro
8282
opts,
8383
)
8484
if err != nil {
85+
err = fmt.Errorf("Failed to open perf event with PerfEventAtter %+v: %q", eventAttr, err)
8586
// cleanup any old Fds
8687
for ii, fd2 := range fds {
8788
if ii == i {

process_profile.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ func NewProfiler(profilerType uint32, config uint64, pid, cpu int, opts ...int)
227227
eventOps,
228228
)
229229
if err != nil {
230-
return nil, err
230+
return nil, fmt.Errorf("Failed to open perf event for PerfEventAttr %+v: %q", eventAttr, err)
231231
}
232232

233233
return &profiler{

0 commit comments

Comments
 (0)