Also the binary need to be still running when doing symbolization.
On Wed, Aug 16, 2017 at 3:14 PM, Y Song via iovisor-dev < iovisor-dev@lists.iovisor.org> wrote: > > > > // always fails, with errno = 2 > > procmap = fopen(procmap_filename, "r"); > > > > errno 2 (ENOENT) means file does not exist. You can add additional > print to check whether the file truly exists or not. > > On Sat, Aug 12, 2017 at 5:14 AM, Fenggang Wu via iovisor-dev > <iovisor-dev@lists.iovisor.org> wrote: > > Hi there, > > > > I am trying out bcc tools from http://github.com/iovisor/bcc, more > > specificaly profile.py and offcputime.py. However in the tracing result, > > user functions are shown as "[unknown]", whereas kernel functions such as > > "sys_*" are interpreted well. Any ideas? > > > > Thank you very much! > > Fenggang > > > > ====== > > > > Here are more details (I use profile.py as the example). If there are > more > > details that are necessary please feel free to let me know. > > > > 1) how to reproduce the issue: > > #~> cat Makefile > > all: > > g++ -o spin spin.cc > > objcopy --only-keep-debug spin spin.debug > > objcopy --add-gnu-debuglink=spin.debug spin > > > > > > clean: > > rm spin spin.debug > > #~> cat spin.cc > > #include<iostream> > > using namespace std; > > void myfunc() { > > int i, j, cnt; > > cout << "my func" << endl; > > for (i = 0; i < 4; i++) { > > for ( j = 0; j < 500000000; j++) { > > cnt ^= i + j; > > } > > cout << i << " " << cnt; > > } > > } > > > > int main() { > > cout << "hello" << endl; > > myfunc(); > > } > > #~> cat test_profile.sh > > #!/bin/bash > > sudo make > > > > sudo -- bash -c "./spin & PID=\$!; echo PID=\$PID; cat /proc/\$PID/maps; > > (trap - SIGINT; profile -U -p \$PID > spin.profile)& wait \$PID;"; sudo > kill > > -SIGINT `pgrep -x profile`; sleep 1; cat spin.profile; > > sleep 1 > > sudo make clean > > > > #~>./test_profile.sh > > > > Here, in my server, spin.profile cannot resolve user-level symbols (i.e. > > symbols in spin.cc). It only shows userland symbol names as "[unknown]". > > > > I am using Ubuntu 16.04.3 LTS with Linux Kernel ver. 4.10.0-28-generic. > I've > > tried both installing by apt-get or building from source (latest pull > from > > github). the results are the same: user-land functions names cannot be > > resolved. > > > > 2) What I've tried/found: > > > > - perf_event works well under my environment in resolving both the kernel > > and userspace symbols. > > - bcc/test/python/test_debuginfo.py pass all tests. Showing that > build-id > > and debug-link both methods work in bcc. > > - [MAJOR PROBLEM] I found the failed statement: > > src/cc/bcc_proc.c:78: > > int bcc_procutils_each_module(int pid, bcc_procutils_modulecb callback, > void > > *payload) { > > > > ... > > // always fails, with errno = 2 > > procmap = fopen(procmap_filename, "r"); > > ... > > > > } > > > > - Afterwards, I've written a similar little c++ program to read > > "/proc/pid/maps", and it can open/read the proc map file successfully. > > Besides, I can also cat the proc map file in the shell, the file can be > read > > successfully too. > > > > the little testing c++ program to open and read the procmap file is as > > follows (very similar to bcc_procutils_each_module): > > > > #~> cat read-proc-map.cc > > #include <iostream> > > #include <cstring> > > #include <stdio.h> > > #include <errno.h> > > > > int main(int argc, char*argv[]) { > > char procmap_filename[128]; > > FILE *procmap; > > int ret; > > > > printf("%d\n", argc); > > > > if (argc != 2) return -1; > > > > printf("mytest\n"); > > > > snprintf(procmap_filename, sizeof(procmap_filename), > > "/proc/%s/maps", argv[1]); > > procmap = fopen(procmap_filename, "r"); > > > > printf("mytest: fopen <%s>\n", procmap_filename); > > > > if (!procmap) { > > printf("mytest: ... failed errno=%d\n", errno); > > return -1; > > } > > > > printf("mytest: ... success <%s>\n", procmap_filename); > > > > > > do { > > char endline[4096]; > > char perm[8], dev[8]; > > long long begin, end, size, inode; > > > > ret = fscanf(procmap, "%llx-%llx %s %llx %s %lld", &begin, &end, > perm, > > &size, dev, &inode); > > > > if (!fgets(endline, sizeof(endline), procmap)) > > break; > > > > if (ret == 6) { > > char *mapname = endline; > > char *newline = strchr(endline, '\n'); > > > > if (newline) > > newline[0] = '\0'; > > > > while (isspace(mapname[0])) mapname++; > > > > printf("%s, %llx, %llx\n", mapname, begin, end); > > } > > } while (ret && ret != EOF); > > > > fclose(procmap); > > printf("mytest: fclosed %s\n", procmap_filename); > > return 0; > > } > > > > ==== > > > > _______________________________________________ > > iovisor-dev mailing list > > iovisor-dev@lists.iovisor.org > > https://lists.iovisor.org/mailman/listinfo/iovisor-dev > > > _______________________________________________ > iovisor-dev mailing list > iovisor-dev@lists.iovisor.org > https://lists.iovisor.org/mailman/listinfo/iovisor-dev >
_______________________________________________ iovisor-dev mailing list iovisor-dev@lists.iovisor.org https://lists.iovisor.org/mailman/listinfo/iovisor-dev