Hi Wenxian,

I've tried -g, -ggdb, -gdwarf, -no-omit-frame-pointer (per the DEBUGGING
section of the profile(8) man page.) to compile spin respectively, as well
as a various combination of them. But still no luck.

Thanks!
-Fenggang

Fenggang WU (吴凤刚)
Ph.D. Student
Department of Computer Science and Engineering <http://www.cs.umn.edu/>
College of Science and Engineering <http://cse.umn.edu/>
University of Minnesota, Twin Cities <http://www.umn.edu/>
Email: fengg...@cs.umn.edu
Homepage: www.cs.umn.edu/~fenggang

On Sat, Aug 12, 2017 at 7:31 AM, wenxian li <wofa...@gmail.com> wrote:

> Have you tried to compile spin.cc with -g para?
>
> Thanks,
> Wenxian
>
>
> On Sat, Aug 12, 2017 at 8:14 PM, 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

Reply via email to