libc 및 libstdc++ 기호에 대해 Linux "성능 로깅"이 작동하도록 하려면 어떻게 해야 합니까?

libc 및 libstdc++ 기호에 대해 Linux "성능 로깅"이 작동하도록 하려면 어떻게 해야 합니까?

저는 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.

관련 정보