programing

gprof : 메인 프로그램과 연동되는 공유 라이브러리의 함수에 대한 호출 그래프 생성 방법

muds 2023. 11. 2. 22:11
반응형

gprof : 메인 프로그램과 연동되는 공유 라이브러리의 함수에 대한 호출 그래프 생성 방법

저는 리눅스 환경 관련 일을 하고 있습니다.나는 두 개의 'C' 소스 패키지 트레인과 test_train을 가지고 있습니다.

  1. 컴파일 시 train package가 libtrain.so 을 생성
  2. test_train 링크를 libtrain.so 에 연결하고 실행 가능한 train-test를 생성합니다.

이제 저는 gprof를 사용하여 libtrain.so 내부의 함수뿐만 아니라 메인 프로그램의 함수들의 호출 순서를 보여주는 호출 그래프를 생성하고자 합니다.

두 패키지 모두 -pg 옵션으로 컴파일하여 링크하고 있으며 디버깅 레벨은 o0입니다.내가 기차 테스트를 하고 나면, gmon.out이 생성됩니다.그 다음에 합니다.

$ gprof -q ./train-test gmon.out

여기서 출력은 열차 시험에서는 함수의 호출 그래프를 보여주지만 libtrain.so 에서는 보여주지 않습니다.

무엇이 문제일까요?

gprof작동이 안 돼요, 당신이 사용해야 해요.sprof대신.다음 링크가 도움이 된다는 것을(를)

두 번째 링크의 요약:

  1. 공유 라이브러리(libmylib)를 컴파일합니다.디버그(-g) 모드로 설정합니다.아니요 -pg.
  2. LD_Profile_OUTPUT='pwd' 내보내기
  3. LD_PROFILE=libmylib.so 내보내기
  4. rm -f $LD_Profile.profile
  5. libmylib.so 을 로드하는 프로그램을 실행합니다.
  6. PATH-TO-LIB/$의 스프롭LD_Profile $LD_Profile.profile -p >log
  7. 로그를 봅니다.

2단계에서 기존 디렉토리여야 합니다. 그렇지 않으면 유용한 경고가 표시됩니다.그리고 3단계에서 라이브러리를 다음과 같이 지정해야 할 수도 있습니다.libmylib.so.X(어쩌면 심지어).X.Y, 확실하지 않음) -- 그렇지 않으면 경고를 전혀 받지 못합니다.

파이썬에서 라이브러리를 로드하고 있는데 운이 없었습니다.sprof. 대신에 제가.oprofile, 적어도 페도라 저장소에는 다음과 같은 것들이 있었습니다.

operf --callgraph /path/to/mybinary

응용프로그램이 완료될 때까지 기다리거나 Ctl-c를 수행하여 프로파일링을 중지합니다.이제 프로파일 요약을 생성해 보겠습니다.

opreport --callgraph --symbols

이를 해석하려면 설명서를 참조하십시오.좀 엉망진창입니다.생성된 보고서에서 각 기호는 자신의 블록에 나열됩니다.블록의 주요 기호는 움푹 패이지 않은 것입니다.그 위에 있는 것들은 그 기능을 호출하는 기능이고, 그 아래에 있는 것들은 그 기능에 의해 호출되는 것들입니다.아래 섹션의 백분율은 해당 호출자에서 보낸 시간의 상대적인 양입니다.

만약 당신이 리눅스에 있지 않다면(솔라리스의 나처럼), 당신은 단지 운이 없는 것입니다.sprof라이브러리의 소스를 가지고 있다면 정적 라이브러리를 링크하고 프로파일링을 이진 파일로 만들어서 문제를 해결할 수 있습니다.공유 라이브러리에 대한 호출을 추적하는 또 다른 방법은truss. 옵션으로-u [!]lib,...:[:][!]func, ...통화 내역을 잘 파악할 수 있습니다.프로파일링과 완전히 동일한 것은 아니지만 일부 시나리오에서는 매우 유용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1838989/gprof-how-to-generate-call-graph-for-functions-in-shared-library-that-is-linke

반응형