tools/perf: Fix the string match for "/tmp/perf-$PID.map" files in dso__load
Perf test for perf probe of function from different CU fails as below: ./perf test -vv "test perf probe of function from different CU" 116: test perf probe of function from different CU: --- start --- test child forked, pid 2679 Failed to find symbol foo in /tmp/perf-uprobe-different-cu-sh.Msa7iy89bx/testfile Error: Failed to add events. --- Cleaning up --- "foo" does not hit any event. Error: Failed to delete events. ---- end(-1) ---- 116: test perf probe of function from different CU : FAILED! The test does below to probe function "foo" : # gcc -g -Og -flto -c /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.c -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.o # gcc -g -Og -c /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.c -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.o # gcc -g -Og -o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-foo.o /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile-main.o # ./perf probe -x /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile foo Failed to find symbol foo in /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7/testfile Error: Failed to add events. Perf probe fails to find symbol foo in the executable placed in /tmp/perf-uprobe-different-cu-sh.XniNxNEVT7 Simple reproduce: # mktemp -d /tmp/perf-checkXXXXXXXXXX /tmp/perf-checkcWpuLRQI8j # gcc -g -o test test.c # cp test /tmp/perf-checkcWpuLRQI8j/ # nm /tmp/perf-checkcWpuLRQI8j/test | grep foo 00000000100006bc T foo # ./perf probe -x /tmp/perf-checkcWpuLRQI8j/test foo Failed to find symbol foo in /tmp/perf-checkcWpuLRQI8j/test Error: Failed to add events. But it works with any files like /tmp/perf/test. Only for patterns with "/tmp/perf-", this fails. Further debugging, commit 80d496be89ed ("perf report: Add support for profiling JIT generated code") added support for profiling JIT generated code. This patch handles dso's of form "/tmp/perf-$PID.map" . The check used "if (strncmp(self->name, "/tmp/perf-", 10) == 0)" to match "/tmp/perf-$PID.map". With this commit, any dso in /tmp/perf- folder will be considered separately for processing (not only JIT created map files ). Fix this by changing the string pattern to check for "/tmp/perf-%d.map". Add a helper function is_perf_pid_map_name to do this check. In "struct dso", dso->long_name holds the long name of the dso file. Since the /tmp/perf-$PID.map check uses the complete name, use dso___long_name for the string name. With the fix, # ./perf test "test perf probe of function from different CU" 117: test perf probe of function from different CU : Ok Fixes: 56cbeacf1435 ("perf probe: Add test for regression introduced by switch to die_get_decl_file()") Signed-off-by: Athira Rajeev <atrajeev@linux.vnet.ibm.com> Reviewed-by: Chaitanya S Prakash <chaitanyas.prakash@arm.com> Reviewed-by: Adrian Hunter <adrian.hunter@intel.com> Cc: akanksha@linux.ibm.com Cc: kjain@linux.ibm.com Cc: maddy@linux.ibm.com Cc: disgoel@linux.vnet.ibm.com Cc: linuxppc-dev@lists.ozlabs.org Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240623064850.83720-1-atrajeev@linux.vnet.ibm.com
This commit is contained in:
parent
ff16aeb9b8
commit
b0979f008f
@ -1652,3 +1652,15 @@ int dso__strerror_load(struct dso *dso, char *buf, size_t buflen)
|
||||
scnprintf(buf, buflen, "%s", dso_load__error_str[idx]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool perf_pid_map_tid(const char *dso_name, int *tid)
|
||||
{
|
||||
return sscanf(dso_name, "/tmp/perf-%d.map", tid) == 1;
|
||||
}
|
||||
|
||||
bool is_perf_pid_map_name(const char *dso_name)
|
||||
{
|
||||
int tid;
|
||||
|
||||
return perf_pid_map_tid(dso_name, &tid);
|
||||
}
|
||||
|
@ -809,4 +809,8 @@ void reset_fd_limit(void);
|
||||
u64 dso__find_global_type(struct dso *dso, u64 addr);
|
||||
u64 dso__findnew_global_type(struct dso *dso, u64 addr, u64 offset);
|
||||
|
||||
/* Check if dso name is of format "/tmp/perf-%d.map" */
|
||||
bool perf_pid_map_tid(const char *dso_name, int *tid);
|
||||
bool is_perf_pid_map_name(const char *dso_name);
|
||||
|
||||
#endif /* __PERF_DSO */
|
||||
|
@ -1799,7 +1799,8 @@ int dso__load(struct dso *dso, struct map *map)
|
||||
const char *map_path = dso__long_name(dso);
|
||||
|
||||
mutex_lock(dso__lock(dso));
|
||||
perfmap = strncmp(dso__name(dso), "/tmp/perf-", 10) == 0;
|
||||
perfmap = is_perf_pid_map_name(map_path);
|
||||
|
||||
if (perfmap) {
|
||||
if (dso__nsinfo(dso) &&
|
||||
(dso__find_perf_map(newmapname, sizeof(newmapname),
|
||||
|
Loading…
x
Reference in New Issue
Block a user