Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
libbpf-tools/trace_helpers: Fix incorrect DSO information in stacktrace
offcputime may display inaccurate DSO information in the stacktrace. Here's an example of the issue: It shows the same DSO offset for different addresses, which is incorrect. $ ./offcputime -v .. iovisor#14 0x00007f8b912a8c (/usr/lib/libcbe.so_0x22afa8c) iovisor#15 0x000044000a3ee0 (/usr/lib/libcbe.so_0x22afa8c) iovisor#16 0x000044001fc56c (/usr/lib/libcbe.so_0x22afa8c) This is why syms__map_addr_dso simply returns NULL when syms__find_dso also returns NULL. In that case, the values of dso_name and dso_offset are not changed. If the dso_name and dso_offset variables have a garbage value before calling syms__map_addr_dso, those garbage values are maintained after calling syms__map_addr_dso. To ensure consistent usage of DSO info and symbol info, the prototype of syms__map_addr_dso has been modified to be similar to dladdr[1]. This is the prototype of dladdr: int dladdr(void *addr, Dl_info *info); The information is returned in a Dl_info structure. If no symbol matching addr could be found, then dli_sname and dli_saddr are set to NULL. typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Base address at which shared object is loaded */ const char *dli_sname; /* Name of symbol whose definition overlaps addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info; Similarly, if no symbol matching the addr could be found, then sym_name and sym_offset are set to NULL in syms__map_addr_dso of this patch. Also, apply the modified API usage to offcputime, futexctn, and memleak. [1] https://man7.org/linux/man-pages/man3/dladdr.3.html
- Loading branch information