한 동료는 리눅스에서 모든 것이 디버깅에 실패했을 때 마지막 옵션은 strace 를 사용하는 것이라고 나에게 말했다 .
나는이 이상한 도구 뒤에 과학을 배우려고 노력했지만 시스템 관리자 전문가가 아니며 실제로 결과를 얻지 못했습니다.
그래서,
- 정확히 무엇이며 무엇을합니까?
- 어떻게 그리고 어떤 경우에 사용해야합니까?
- 결과를 어떻게 이해하고 처리해야합니까?
간단히, 간단한 단어에서 어떻게이 물건 작동합니까?
답변
Strace 개요
strace는 간단한 디버거로 볼 수 있습니다. 이를 통해 프로그래머 / 사용자는 프로그램이 OS와 상호 작용하는 방식을 빠르게 찾을 수 있습니다. 시스템 호출 및 신호를 모니터링하여이를 수행합니다.
사용
잘 사용하면 소스 코드가 없거나 정말 그것을 통해 이동을 방해하지 않으려는 경우에 대해.
또한 GDB를 열고 싶지는 않지만 외부 상호 작용을 이해하는 데 관심이 있다면 자신의 코드에 유용합니다.
며칠 전에 사용을 시작하기 위해이 소개를 살펴본 좋은 소개 : strace hello world
답변
간단히 말해서, strace는 프로그램이 발행 한 모든 시스템 호출과 리턴 코드를 추적합니다. 파일 / 소켓 작업 및 훨씬 더 모호한 작업과 같은 것을 생각하십시오.
여기서 시스템 호출은 표준 C 라이브러리 호출을보다 정확하게 나타낼 수 있으므로 C에 대한 실무 지식이있는 경우 가장 유용합니다.
프로그램이 / usr / local / bin / cough라고 가정 해 봅시다. 간단히 사용하십시오 :
strace /usr/local/bin/cough <any required argument for cough here>
또는
strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>
‘out_file’에 쓸 수 있습니다.
모든 strace 출력은 stderr로 이동합니다 (순서 볼륨은 종종 파일로의 리디렉션을 요구합니다). 가장 간단한 경우, 프로그램은 오류와 함께 중단되며 strace 출력에서 OS와의 마지막 상호 작용이 무엇인지 확인할 수 있습니다.
자세한 내용은 다음을 참조하십시오.
man strace
답변
strace는 적용된 프로세스에 의해 수행 된 모든 시스템 호출을 나열합니다 . 시스템 호출이 무엇을 의미하는지 모른다면, 많은 마일리지를 얻을 수 없습니다.
그럼에도 불구하고 문제에 파일이나 경로 또는 환경 값이 관련된 경우 문제가있는 프로그램에서 strace를 실행하고 출력을 파일로 리디렉션 한 다음 해당 파일을 경로 / 파일 / env 문자열에 대고 grep하면 프로그램이 실제로 무엇을 시도하고 있는지 확인할 수 있습니다. 기대했던 것과는 달리
답변
Strace는 디버거에서 이러한 프로그램을 실행할 여유가없는 프로덕션 시스템을 조사하기위한 도구입니다. 특히 다음 두 가지 상황에서 strace를 사용했습니다.
- 프로그램 foo가 교착 상태에 있고 응답하지 않습니다. 이것은 gdb의 대상이 될 수 있습니다. 그러나 우리는 항상 소스 코드를 가지고 있지 않았거나 때로는 디버거에서 간단하게 실행되지 않는 스크립트 언어를 처리하고있었습니다. 이 경우 이미 실행중인 프로그램에서 strace를 실행하면 시스템 호출 목록이 표시됩니다. 클라이언트 / 서버 응용 프로그램 또는 데이터베이스와 상호 작용하는 응용 프로그램을 조사 할 때 특히 유용합니다
- 왜 프로그램이 느린 지 조사. 특히, 우리는 방금 새로운 분산 파일 시스템으로 옮겼으며 시스템의 새로운 처리량은 매우 느 렸습니다. 각 시스템 호출에 소요 된 시간을 알려주는 ‘-T’옵션으로 strace를 지정할 수 있습니다. 이것은 파일 시스템으로 인해 속도가 느려지는 이유를 확인하는 데 도움이되었습니다.
strace를 사용하여 분석하는 예는 이 질문에 대한 내 대답을 참조하십시오 .
답변
권한 문제를 디버깅하기 위해 항상 strace를 사용합니다. 기술은 다음과 같습니다.
$ strace -e trace=open,stat,read,write gnome-calculator
gnome-calculator
실행할 명령은 어디에 있습니까 ?
답변
strace -tfp PID는 PID 프로세스의 시스템 호출을 모니터하므로 프로세스 / 프로그램 상태를 디버그 / 모니터 할 수 있습니다.
답변
Strace는 디버깅 도구 또는 기본 프로파일 러로 사용할 수 있습니다.
디버거로서 주어진 시스템 호출의 호출, 실행 및 반환 내용을 확인할 수 있습니다. 프로그램이 실패한 것뿐만 아니라 프로그램이 실패한 이유를 알 수 있기 때문에 이것은 매우 중요합니다. 일반적으로 프로그램의 모든 가능한 결과를 포착하지 못하는 형편없는 코딩의 결과입니다. 다른 경우에는 파일 경로를 하드 코딩 한 것입니다. strace없이 당신은 어디서 그리고 어떻게 잘못되었는지 추측 할 수 있습니다. strace를 사용하면 syscall을 분석 할 수 있습니다. 보통 반환 값을 보면 많은 것을 알 수 있습니다.
프로파일 링은 또 다른 용도입니다. 각 syscall의 실행 시간을 개별적으로 또는 집계로 사용할 수 있습니다. 이것이 문제를 해결하기에 충분하지는 않지만 잠재적 인 용의자 목록을 적어도 좁힐 것입니다. 단일 파일에 많은 fopen / close 쌍이 있으면 루프 외부에서 파일을 열고 닫는 대신 루프를 실행할 때마다 파일을 불필요하게 열고 닫을 수 있습니다.
Ltrace는 strace의 가까운 사촌이며 매우 유용합니다. 병목 현상이있는 위치를 차별화하는 법을 배워야합니다. 총 실행이 8 초이고 시스템 호출에 0.05 초만 소비하는 경우 프로그램을 추적하는 것이 그리 좋지 않을 것입니다. 문제는 코드에 있습니다. 일반적으로 논리 문제이거나 프로그램에 실제로 필요합니다. 그렇게 오래 걸립니까
strace / ltrace의 가장 큰 문제는 출력을 읽는 것입니다. 호출 방법 또는 적어도 syscall / 함수 이름을 모른다면 의미를 해독하기가 어려울 것입니다. 함수가 무엇을 반환하는지 아는 것도 특히 다른 오류 코드에 매우 유용 할 수 있습니다. 해독하는 것은 고통 스럽지만 때로는 때로는 지식의 진주를 돌려줍니다. 일단 inode가 부족하지만 여유 공간이 부족한 상황을 보았으므로 모든 일반적인 유틸리티가 나에게 경고를주지 않았으므로 새 파일을 만들 수 없었습니다. strace의 출력에서 오류 코드를 읽으면 올바른 방향으로 나에게 지적되었습니다.