2012-01-27 2 views
8

나는 callgrind를 사용하여 Linux 멀티 스레드 응용 프로그램을 프로파일 링했으며 대부분 잘 작동합니다. 나는 계측기를 끄기 시작하고 (--instr-atstart = no) 일단 설정이 완료되면 callgrind_control -i on으로 켜십시오. 그러나 특정 구성을 변경하여 앱의 다른 부분을 프로파일 링하려고 시도하면 계측을 켜기 전에 매우 느리게 실행되기 시작합니다. 기본적으로 정상 작동으로 몇 초가 걸릴 코드의 일부는 callgrind (계장 꺼짐)로 1 시간 이상 걸립니다. 그 이유와 디버깅/느려짐 해결 방법에 대한 아이디어가 있습니까?계측 기능이 꺼져있는 callgrind가 느림

+0

"앱의 다른 부분을 프로파일 링하려고하는 특정 구성"은 무엇입니까? – jpalecek

+0

user779, [valgrind의 도구] (http://valgrind.org/docs/manual/nl-manual.html) 및 [valgrind의 Lackey 도구] (http : //valgrind.org/docs/manual/lk-manual.html)? – osgx

+0

@jpalecek : 모든 것은 사용자가 설정에 따라 기능을 사용/사용 중지 할 수 있으며 일부 기능을 사용하도록 설정할 수 있다는 것을 의미합니다 (오브젝트 세트에 대한 자세한 내용을 보려면 반복적으로 드릴을 실행하므로 더 많은 계산이 필요함) 크롤링을 시작합니다. . – naumcho

답변

10

콜그린드는 valgrind를 기반으로하는 도구입니다. Valgrind는 기본적으로 동적 바이너리 변환기 (libVEX, valgrind의 일부)입니다. 모든 명령어를 디코드하고 JIT를 컴파일하여 동일한 CPU의 일부 명령어 스트림으로 컴파일합니다.

이미 알고 있듯이, 이미 실행중인 프로세스에 대해 valgrind 구현에서이 변환을 활성화 할 방법이 없기 때문에 동적 시작은 프로그램 시작부터 항상 활성화됩니다. 그것은 또한 끌 수 없습니다.

도구는 계측 코드를 추가하여 valgrind에서 작성됩니다. "Nul"도구 (nulgrind)는 계측을 추가하지 않는 도구입니다. 그러나 모든 도구는 valgrind를 사용하며 동적 변환은 항상 활성화되어 있습니다. callgrind를 켜고 끄는 것은 추가 계측을 켜고 끄는 것입니다.

Valgrind가 구현 한 가상 CPU가 제한적이며 불완전한 목록이 있습니다. http://valgrind.org/docs/manual/manual-core.html#manual-core.limits 제한 사항은 대부분 부동 소수점 연산에 관한 것이며 잘못된 것으로 에뮬레이트 될 수 있습니다.

변경 사항이 부동 소수점 연산과 연결되어 있습니까? 또는 다른 제한 사항이 있습니까?

또한 "Valgrind는 실행시 하나의 스레드 만이"으로 실행되도록 직렬화합니다. (동일한 페이지 manual-core.html에서)

+0

추신 : nulgrind (libVEX 기본 계측) 오버 헤드가 큽니다. Nulgrind는 원시 코드보다 2-10 배 정도 느린 것으로 추정됩니다 (예 : http://os.inf.tu-dresden.de/papers_ps/vee08-pohle.pdf). vlagrind의 다른 도구는 누그라 인트보다 느립니다. 끄기 모드 인 Callgrind는 Nulgrind의 속도로 실행됩니다. callgrind가 켜지면 몇 배 느리게 실행됩니다. – osgx