そのトピックに関する多くのチュートリアルを読み、必要なことをすべて行ったにもかかわらず、シンボルを含むスタックトレースを提供するperf_eventsを取得することはまだ困難です。ローカルにインストールされたパフォーマンス(詳細については以下を参照)にどのような方法で障害が発生する可能性がありますか?とにかく、私がしたことは次のとおりです。
main.cppは、同じファイルで定義されたいくつかの関数を呼び出し、いくつかのメモリを割り当てて解放し、何かを印刷する単純なC ++プログラムです。
コンパイルコマンド:
gcc -std=c++11 -lstdc++ main.cpp -Og -fno-omit-frame-pointer -fno-inline -o arr_test
設定ファイルコマンド:
perf record -a -g -- ./arr_test && perf report --stdio
カーネルシンボルには次の警告が表示されますが、今はアプリケーションのシンボルにのみ興味があるので問題にはならないと思います。
[ 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.
以下は出力の一部です。
# 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
ファイル情報(「削除されていません」と表示):
$ 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
私のパフォーマンスインストールの詳細(これらの警告のためにスタックのシンボルは表示されませんか?)
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で私のシンボルをどうやって見つけることができますか?
ベストアンサー1
より多くのデバッグオプションを使用してコンパイルしています。
-Og -ggdb3 -fno-omit-frame-pointer
その後、ログに-aオプションを使用せず(すべてのシステムプロセスを監視する必要があります)、次のものを使用しています。
perf record -e cycles -g --call-graph fp -- ./your_app your_args
最後に、私が使用している結果を示すために
perf report -g graph
出力は期待どおりに見えます(参考までに私はdebian 9を使用しており、パフォーマンスレポートの出力はncursesに基づいています)。
- 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