首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >尽管-fno-省略-框架指针编译,但仍缺少带有perf _event的perf报告的堆栈符号

尽管-fno-省略-框架指针编译,但仍缺少带有perf _event的perf报告的堆栈符号
EN

Unix & Linux用户
提问于 2016-04-13 13:23:06
回答 2查看 15K关注 0票数 10

尽管我阅读了许多关于这个主题的教程,并且做了(我认为)所有必要的事情,我还是很难让perf_events给我提供符号的堆栈跟踪。可能我在本地安装的perf (下面的详细信息)不知怎么搞砸了?总之,我是这么做的:

main.cpp是一个简单的C++程序,它调用在同一个文件中定义的几个函数,分配一些内存并释放它,并打印出一些东西。

编译命令:

代码语言:javascript
复制
gcc -std=c++11 -lstdc++ main.cpp -Og -fno-omit-frame-pointer -fno-inline -o arr_test

配置文件命令:

代码语言:javascript
复制
perf record -a -g -- ./arr_test && perf report --stdio

我确实收到了关于内核符号的以下警告,但我认为这不重要,因为我现在只关心应用程序中的符号:

代码语言:javascript
复制
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.052 MB perf.data (~2285 samples) ]
[kernel.kallsyms] with build id e22966849c48748782a1be4fe0ce94db6838b806 not found, continuing without symbols
[kernel.kallsyms] with build id e22966849c48748782a1be4fe0ce94db6838b806 not found, continuing without symbols
Warning:
Kernel address maps (/proc/{kallsyms,modules}) were restricted.

Check /proc/sys/kernel/kptr_restrict before running 'perf record'.

As no suitable kallsyms nor vmlinux was found, kernel samples
can't be resolved.

Samples in kernel modules can't be resolved as well.

下面是输出的片段:

代码语言:javascript
复制
# Overhead   Command      Shared Object
# ........  ........  .................
#
    83.27%  arr_test  arr_test         
            |          
            |--34.12%-- 0x400908
            |          0x7fe72b381ec5
            |          
            |--10.48%-- 0x400903
            |          0x7fe72b381ec5
            |          
            |--10.08%-- 0x4008b8
            |          0x7fe72b381ec5
            |          
            |--9.22%-- 0x4008e5
            |          0x7fe72b381ec5
            |          
            |--9.05%-- 0x4008da
            |          0x7fe72b381ec5
            |          
            |--8.49%-- 0x4008f0
            |          0x7fe72b381ec5
            |          
            |--6.87%-- 0x4008d5
            |          0x7fe72b381ec5
            |          
            |--6.23%-- 0x4008c2
            |          0x7fe72b381ec5
            |          
            |--4.76%-- 0x4008fd
            |          0x7fe72b381ec5
             --0.70%-- [...]

     8.02%  arr_test  [kernel.kallsyms]
            |          
            |--4.87%-- 0xffffffff81140b64
            |          0xffffffff81146646
            |          0xffffffff81182751
            |          0xffffffff811829eb
            |          0xffffffff8173317d
            |          0x7fe72bab86a7
            |          0x7fe72baa7e00

文件信息(显示“未剥离”):

代码语言:javascript
复制
$ file arr_test 
arr_test: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, not stripped

perf安装的详细信息(这些警告是否阻止我看到堆栈中的符号?)

代码语言:javascript
复制
Auto-detecting system features:
...                     backtrace: [ on  ]
...                         dwarf: [ OFF ]
...                fortify-source: [ on  ]
...                         glibc: [ on  ]
...                          gtk2: [ on  ]
...                  gtk2-infobar: [ on  ]
...                      libaudit: [ OFF ]
...                        libbfd: [ OFF ]
...                        libelf: [ OFF ]
...             libelf-getphdrnum: [ OFF ]
...                   libelf-mmap: [ OFF ]
...                       libnuma: [ on  ]
...                       libperl: [ on  ]
...                     libpython: [ on  ]
...             libpython-version: [ on  ]
...                      libslang: [ on  ]
...                     libunwind: [ OFF ]
...                       on-exit: [ on  ]
...                stackprotector: [ on  ]
...            stackprotector-all: [ on  ]
...                       timerfd: [ on  ]

config/Makefile:264: No libelf found, disables 'probe' tool, please install elfutils-libelf-devel/libelf-dev
config/Makefile:329: No libunwind found, disabling post unwind support. Please install libunwind-dev[el] >= 1.1
config/Makefile:354: No libaudit.h found, disables 'trace' tool, please install audit-libs-devel or libaudit-dev

我怎样才能在perf中找到我的符号?

EN

回答 2

Unix & Linux用户

发布于 2017-08-10 04:57:46

我正在使用更多的调试选项进行编译:

代码语言:javascript
复制
-Og -ggdb3 -fno-omit-frame-pointer

然后,当我记录不使用-a选项(应该监视所有系统进程)时,我使用的是

代码语言:javascript
复制
perf record -e cycles -g --call-graph fp -- ./your_app your_args

最后,为了显示我正在使用的结果

代码语言:javascript
复制
perf report -g graph

并且输出看起来是预期的(注意,我使用debian 9,perf报告输出是基于ncurses的)

代码语言:javascript
复制
-   92.18%     0.00%  stsm     stsm                  [.] main                                                                                                ◆
   - main                                                                                                                                                    ▒
      - 91.77% STSM::run                                                                                                                                     ▒
         + 56.86% STSM::generateCandidates                                                                                                                   ▒
         - 25.22% STSM::detectBlocksOfAllSolidSequences                                                                                                      ▒
            + 23.42% STSM::detectSolidSequenceBlocksFromSolidSequence                                                                                        ▒
              0.81% Segment::unify                                                                                                                           ▒
         + 5.25% STSM::updateKernelsOfAllCandidates                                                                                                          ▒
           1.80% RangedSequence::range                                                                                                                       ▒
         + 1.45% STSM::updateMatchingPositions                                                                                                               ▒
           0.99% Segment::intersects                                                                                                                         ▒
+   92.18%     0.00%  stsm     libc-2.24.so          [.] __libc_start_main                                                                                   ▒
+   92.18%     0.00%  stsm     [unknown]             [k] 0x4d96258d4c544155                                                                                  ▒
+   91.77%     0.00%  stsm     stsm                  [.] STSM::run                                                                                           ▒
+   56.86%     6.74%  stsm     stsm                  [.] STSM::generateCandidates                                                                            ▒
+   49.99%    49.99%  stsm     stsm                  [.] Segment::intersects                                                                                 ▒
+   25.22%     0.00%  stsm     stsm                  [.] STSM::detectBlocksOfAllSolidSequences 
票数 7
EN

Unix & Linux用户

发布于 2019-09-17 11:19:54

这是一个古老的话题,但我确信它仍然发生在数百人身上,而且由于这个StackExchange问题在Google的结果中仍然很突出,我在StackOverflow上分享的答案是:https://stackoverflow.com/questions/33137543/linux-perf-top-kernel-symbol-not-found

基本上:

启动perf记录

之前的

echo 0 > /proc/sys/kernel/kptr_restrict

也可能需要设置这些

RHEL/CentOS/Fedora/等

yum install -y elfutils-libelf-devel libunwind-devel audit-libs-devel slang-devel

或Debian/Ubuntu/等

apt-get install libelf-dev libunwind-dev libaudit-dev libslang-dev

票数 4
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/276179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档