저는 작업 서버에서 작성한 프로그램을 분석하기 위해 perf를 사용하려고 합니다. sudo 권한이 있지만 이를 사용하여 수행할 수 있는 작업에는 제한이 있습니다.
$ rm perf.data
$ perf record ./catch-hedging stress_BS_EURUSD_03M_delta_gamma_n_2_1_1
WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,
check /proc/sys/kernel/kptr_restrict.
Samples in kernel functions may not be resolved if a suitable vmlinux
file is not found in the buildid cache or in the vmlinux path.
Samples in kernel modules won't be resolved at all.
If some relocation was applied (e.g. kexec) symbols may be misresolved
even with a suitable vmlinux or kallsyms file.
Lowering default frequency rate to 250.
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
Cannot read kernel map
Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.
Read 'results-gcc.txt', got 285 results. Took 0.000514 seconds
===============================================================================
All tests passed (1 assertion in 1 test case)
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.007 MB perf.data (143 samples) ]
성능 보고서를 실행하면 다음과 같은 항목이 표시됩니다.
10.79% catch-hedging [unknown] [k] 0xffffffff81614733
이제 sudo 권한이 있으므로 이것이 해결되지 않은 커널 기호 문제를 해결할 것이라고 생각합니다. 그래서 나는 다음을 실행합니다.
$ sudo perf record ./catch-hedging stress_BS_EURUSD_03M_delta_gamma_n_2_1_1
Lowering default frequency rate to 250.
Please consider tweaking /proc/sys/kernel/perf_event_max_sample_rate.
Read 'results-gcc.txt', got 285 results. Took 0.000942 seconds
===============================================================================
All tests passed (1 assertion in 1 test case)
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.020 MB perf.data (149 samples) ]
이것이 더 좋아 보이지만 내 코드에서 sudo perf report -f를 실행하면 기호가 해결되지 않는 것 같습니다.
17.13% catch-hedging catch-hedging [.] 0x000000000002eced
내 프로그램의 기호가 해석되지 않는 이유는 무엇입니까? 커널 기호와 프로그램의 기호를 동시에 해결하는 방법은 무엇입니까?
참고로 일반적인 컴파일 명령은 다음과 같습니다(일부 이름이 변경됨).
g++ -Wunused -pthread -std=c++17 -g -fno-omit-frame-pointer -O2 -pthread -std=c++17 -Wno-parentheses -Wsequence-point -Wconversion -Wuninitialized -Wunused -Wmissing-field-initializers -g -fno-omit-frame-pointer -O2 -Isome-include-directories-omitted -D__stdcall= -DWINAPI= '-D__declspec(X)=' -c -o file.o file.cpp
저는 g++ 8.1.0을 사용하고 있습니다.