저는 perf record -g
프로그램 프로파일링을 위해 x86-64 Linux를 사용하고 있습니다. libc 또는 libstdc++의 여러 기호를 0
상위 기호로 사용합니다(예: __GI___strcmp_ssse3
(libc) 및 (libstdc++)). strcmp@plt
(실제로 디버거에서 이러한 기호를 분석하여 역추적을 얻을 수 있습니다.)
이러한 함수의 주요 호출자가 무엇인지, 왜 기록되지 않는지 알고 싶습니다. libc와 libstdc++에 x86_64에 프레임 포인터가 없기 때문입니까? 그리고 좀 더 현실적으로 이 문제를 해결할 수 있는 방법이 있을까요?
답변1
이것은 오래된 질문이지만 이제 --call-graph dwarf
매뉴얼 페이지에서 해결할 수 있습니다.
-g
Enables call-graph (stack chain/backtrace) recording.
--call-graph
Setup and enable call-graph (stack chain/backtrace) recording, implies -g.
Allows specifying "fp" (frame pointer) or "dwarf"
(DWARF's CFI - Call Frame Information) as the method to collect
the information used to show the call graphs.
In some systems, where binaries are build with gcc
--fomit-frame-pointer, using the "fp" method will produce bogus
call graphs, using "dwarf", if available (perf tools linked to
the libunwind library) should be used instead.
나는 이것이 최신 Linux 커널(>=3.9? 확실하지 않음)이 필요하다고 생각합니다. 배포판의 성능 패키지가 libdw 또는 libunwind 와 연결되어 있는지 확인할 수 있습니다 readelf -d $(which perf) | grep -e libdw -e libunwind
. Fedora 20에서는 perf가 libdw와 연결되어 있습니다.
답변2
perf
시스템 호출의 경과 시간을 표시하는 커널 도구입니다. 당신은 GNU gprof를 찾고 있습니다. "gprof - 호출 그래프 프로필 데이터 표시". gprof를 사용하려면 스위치를 사용하여 소스 코드를 컴파일해야 합니다 -pg
.
이 외에도 eclipse-cdt-profiling-framework
.