2012-05-12 5 views
12

MacOSX에서 일부 C++ 프로그램의 프로필을 작성하려고합니다. 그래서 google-perftools을 작성하고, -g 컴파일러 플래그로 MacPorts g ++ 4.7을 사용하여 컴파일하고, libprofiler에 링크 된 프로그램을 작성했습니다. 그럼 난 실행 : MacOSX의 Google Perftools CPU 프로파일 러의 행 번호

CPUPROFILE=cpu.profile ./a.out 

는 다음 나는 출력을 생성하는 pprof를 실행 :

perftools이 이름을 작동하려면 주소를 변환하지 않는 것 같습니다
[hidden ~]$ pprof --text ./a.out cpu.profile 
Using local file ./a.out. 
Using local file cpu.profile. 
Removing __sigtramp from all stack traces. 
Total: 282 samples 
    107 37.9% 37.9%  107 37.9% 0x000000010d72229e 
     16 5.7% 43.6%  16 5.7% 0x000000010d721a5f 
     12 4.3% 47.9%  12 4.3% 0x000000010d721de8 
     11 3.9% 51.8%  11 3.9% 0x000000010d721a4e 
     9 3.2% 55.0%  9 3.2% 0x000000010d721e13 
     8 2.8% 57.8%  8 2.8% 0x000000010d721a64 
     7 2.5% 60.3%  7 2.5% 0x000000010d7222f0 
     6 2.1% 62.4%  6 2.1% 0x000000010d721a4c 
     6 2.1% 64.5%  6 2.1% 0x000000010d721b1f 
     6 2.1% 66.7%  6 2.1% 0x000000010d721e0c 
     5 1.8% 68.4%  5 1.8% 0x000000010d721fba 
    ...... 

.

내가 누락 된 부분을 아는 사람이 있습니까? 프로파일 러가 올바른 결과를 생성하도록하려면 어떻게해야합니까?

EDIT : 추가 정보 : pprof 또는 google-perftools의 문제는 아니지만 Instrument.app도 줄 번호 대신 주소를 표시하기 때문에 gcc 또는 macosx와 같은 것입니다. Mac OS X에서 디버그 기호가 작동하는 방식에 익숙하지 않아서 gcc 나 Mac OS X에서 버그가되는 대신 누락 된 것으로 생각합니다. 디버그 정보 작동 방법에 대한 힌트를 제공 할 수 있는지 궁금합니다. Mac OS X 용

+0

"프로필을 일부 C++ 프로그램으로 보내려고합니다."그런데 왜이 질문을 C로 태그합니까? –

+0

이 문제는 C++뿐만 아니라 C에만 국한된 것이 아닙니다. –

+0

OS X dev 또는 googleperf에 익숙하지 않지만 이전에 프로파일 링 라이브러리를 사용했고 디버깅을 위해 -g 플래그를 사용했습니다. 컴파일러 및 링커에 -p 플래그를 추가하여 프로파일 링 세부 사항을 얻으십시오. – fduff

답변

4

나는이 플랫폼에서 디버그 심볼은 .o 파일에 있다고 믿지만 실행 파일로 이동하지 않습니다. gdb 나 프로파일 러에서 기호를 얻으려면 .o 파일을 저장해야합니다. 이는 .o 파일을 보존하기 위해 응용 프로그램을 두 단계로 컴파일 (컴파일 후 링크)해야 함을 의미합니다.

자세한 내용은 this question을 참조하십시오.

pprof Perl 소스 코드를 보면 심볼 이름은 nmc++filt을 사용하여 얻을 수 있으므로 독립 실행 형으로 실행하고 왜 작동하지 않는지 파악할 수 있습니다. pprof 소스에서 nm의 여러 버전을 다루기 위해 다른 커맨드 라인 인수를 시도하는 것처럼 보입니다. 이것은 요약의 내용입니다.

nm [-D] -n [-f] [--demangle] object-file 2>/dev/nul [| cpp + filt]

대괄호로 묶은 부분은 플랫폼 및 nm 및 C++ filt에 필요한 경우 런타임에 스크립트가 결정하는 부분입니다. 위의 모든 조합을 시도하고 어떤 효과가 있는지 확인하십시오. 그런 다음 pprof 스크립트가 수행하는 작업을 살펴보십시오. 어쩌면 일부 printfs를 추가하여 수행 할 수 있습니다.

행운을 빈다.

+0

도움이되지 않습니다. .o 파일을 저장하려고했지만 pprof는 여전히 줄 번호 대신 주소를 인쇄합니다. –

+0

문제는 pprof가 아닙니다. gdb에서 이러한 심볼을로드하기 위해 작업 할 것이므로, 무슨 일이 일어나고 있는지 알 수 있습니다. 어쩌면 .o 파일이 예상보다 다른 디렉토리에있을 수 있습니다. – Miguel

+0

나는 이것에 대해 약간의 진전을 보았습니다 :'CPUPROFILE = cpu.profile gdb./a.out'을 사용하여 프로그램을 시작한 다음'gdb'에서'start'와'cont'를 사용하면 심볼을 올바르게 얻을 수 있습니다. 그래서 정상적으로 프로그램을 시작하면 기호를로드하지 않는 google-perftools의 문제일지도 모릅니다. 따라서 'cpu.profile'에 기록 된 주소가 올바르지 않습니다. 'gdb'는 꽤 느리고 매번 실행하기에는 실용적이지 않기 때문에'gdb'없이 프로그램을 정상적으로 시작할 필요가 있습니다. 내가 어떻게 작동하게 할 수 있니? 감사. –

6

이 내가 gperftools의 이슈 트래커에 issue #562을 제기 한 10.5

OS X에 도입 된 주소 공간 레이아웃 무작위 (ASLR)과 관련이있을 것으로 보인다. -Wl,-no_pie을 전달하여 ASLR을 사용 중지 할 수 있습니다.

또한 gperftools을 사용하지 않을 경우 Instruments (Xcode과 함께 제공)을 사용해 볼 가치가 있습니다.

+0

고마워, 이것이 바로 그 것이다. -Wl, -no_pie는 pprof가 Mac OS에서 "즉시"작동하도록 만듭니다. – Ogre