저는 Debian 10을 실행하고 있으며 약 2주 동안 PDF 리더 Atril(Evince의 포크)을 시작하는 데 25초가 걸립니다. 이전에는 거의 즉시 시작되었습니다. 이제 지연의 원인이 무엇인지 알아보려고 합니다. 소스 패키지를 다운로드하고 프로파일링이 활성화된 상태로 빌드 및 설치했습니다.
cd "$HOME/.local/src"
apt source atril
cd atril-1.20.3
./autogen.sh
./configure CFLAGS=-pg LDFLAGS=-pg --prefix="$HOME/.local" --disable-caja
make V=1
make install
그런데 실행하면 "$HOME/.local/bin/atril"
해당 파일이 생성되지 않습니다. gmon.out
make 명령의 verbose 모드를 통해 컴파일 및 링크 명령에 V=1
이 옵션이 추가된 것을 확인할 수 있습니다 . -pg
어떤 단서가 있나요? 무엇이 빠졌나요? 간단한 정적으로 링크된 예제 프로그램을 분석하는 방법을 보여주는 인터넷 튜토리얼이 있지만 "실제" 애플리케이션을 어떻게 분석합니까?
편집하다:gmon.out이 내 홈 디렉토리에 생성된 것으로 나타났습니다. 그러나 gprof를 통해 Atril을 실행하면 응용 프로그램이 다중 스레드이기 때문에 출력에 많은 내용이 표시되지 않습니다.
답변1
나는 개인적으로 그렇게 깊이 파고 들지 않을 것입니다. 나는 추천하고 싶다아니요자신만의 atril을 구축하되 debian atril을 사용하십시오(이것이 나중에 사용하게 될 것이고 debian은 디버깅 기호를 제공하기 때문입니다).
복잡성을 기준으로 정렬:
- atril이 시작될 때 실행됩니다
top
(또는 더 나은 방법:htop
설정에서 "사용자 영역 프로세스 스레드 숨기기"를 비활성화). 프로세스가 CPU를 많이 사용합니까?perf
또는 로 이동합니다gdb
. gdb
일반적으로 다음과 같은 경우에 충분합니다.- atril용 디버깅 기호를 설치합니다. 참조데비안 위키
- gdb를 시작하고 atril을 로드합니다. (
gdb atril
팁: gdb에서는 일부 디버깅 기호가 누락되었음을 알려줄 수 있습니다. 역추적이 현재 atril에 없을 때 더 쉽게 해독할 수 있도록 이러한 기호를 설치할 수도 있습니다.) (gdb)
껍질 에는 이렇게 적혀 있어요run
- 지루함을 느끼는 15초 동안 ctrl+를 누르세요 c. 그러면 gdb의 실행이 중단됩니다.
- Atril은 다중 스레드일 수 있으므로
info threads
각 스레드가 멈췄는지 표시됩니다. - 다음을 입력하여 숫자 N으로 가장 흥미로운 스레드를 선택하세요.
thread N
- 추적을 받으세요:
bt
.당신이 어디서 왔는지 알 수 있습니다.
- CPU 자체를 사용하지 않는 경우 시스템 호출이 완료될 때까지 기다리는 것이 거의 확실합니다.
strace atril
실시간 통화를 디스플레이에 알려줍니다. 최근에 받은 전화 몇 통은 무엇입니까? 자고 싶은 건 아닐까? - CPU에 바인딩된 경우 일반적으로
perf
linux-base 패키지의 명령이 훌륭합니다.sudo sysctl -w kernel.perf_event_paranoid=-1
그러면perf record -ag atril
실행이 중단되는 위치를 주기적으로 샘플링합니다(그러나 모든 프로세스를 살펴보므로 브라우저를 닫고 집에서 접는 등의 작업을 수행합니다). ), 그러면perf report -g
동일한 디렉터리에서 찾아볼 수 있는 통계가 표시됩니다. 디버깅 기호가 설치되어 있으면 더욱 유용해집니다.