STRACE를 사용하여 Linux 시스템 호출을 모니터링하는 방법

Jun 23, 2025
리눅스
[삼]
Fatmawati Achmad Zaenuri / Shutterstock.com

리눅스 프로그램은 다음과 같은 것을 요청합니다 핵심 그들을 위해 몇 가지 일을하십시오. NS 특히 명령은 이러한 시스템 호출을 나타냅니다. 프로그램이 어떻게 작동하는지, 때로는, 왜 그렇지 않은지를 이해하는 데 사용할 수 있습니다.

커널 및 시스템 호출

그들이 할 수있는만큼 똑똑한 것처럼 컴퓨터 프로그램은 모든 것을 스스로 할 수 없습니다. 그들은 특정 기능을 수행하기 위해 요청을해야합니다. 이러한 요청은 Linux 커널로 이동합니다. 일반적으로 프로그램이 호출되는 라이브러리 또는 기타 소프트웨어 인터페이스가 있으며 라이브러리는 라이브러리를 시스템 호출을 커널로 호출합니다.

프로그램이 이루어진 시스템 호출을 볼 수 있으며 응답이 귀하가 귀하의 관심있는 프로그램의 내부 작동을 이해하는 데 도움이 될 수 있습니다. 이것은 뭐라고 요 특히 하다 ...에 문제를 해결하고 병목 현상을 찾는 데 도움이 될 수 있습니다.

이것은과 같지 않습니다 응용 프로그램 디버깅 도구와 함께 Gdb. ...에 디버깅 프로그램을 사용하면 프로그램의 내부 작동을 실행할 수 있습니다. 프로그램의 논리를 단계별로 연결하고 메모리 및 가변 값을 검사 할 수 있습니다. 비교해 보면, 특히 프로그램이 실행중인 시스템 호출 정보를 캡처하는 것입니다. 추적 된 프로그램이 종료되면, 특히 터미널 창에 시스템 호출 정보를 나열합니다.

시스템 호출은 파일에 대한 읽기 및 쓰기 작업, 프로세스를 종료하는 등의 모든 종류의 로우 레벨 기능을 제공합니다. 수백 개의 시스템 호출 목록이 있습니다. syscalls 남자 페이지 ...에

관련된: GDB와 디버깅 : 시작하기

Strace 설치

만약에 특히 컴퓨터에 아직 설치되어 있지 않으면 매우 쉽게 설치할 수 있습니다.

Ubuntu 에서이 명령을 사용하십시오.

 Sudo APT 설치 Strace 

Fedora 에서이 명령을 입력하십시오.

 Sudo DNF 설치 Strace 

Manjaro 에서이 명령은 다음과 같습니다.

 Sudo Pacman -sy Strace 

Strace와의 첫 단계

우리는 소규모 프로그램을 사용하여 시연 할 것입니다 특히 ...에 그것은 많이하지 않습니다. 파일을 열고 텍스트 줄을 씁니다. 오류 검사가 없습니다. 우리가 함께 사용할 무언가를 가지고 있기 때문에 빠른 해킹 일뿐입니다. 특히 ...에

#include & lt; stdio.h & gt; INT 메인 (int argc, char argv []) { // 파일 핸들 파일 * filegeek; // "strace_demo.txt"라는 파일을 엽니 다. filegeek = fopen ( "strace_demo.txt", "w"); // 파일에 텍스트를 씁니다 fprintf (filegeek, "파일에이를 씁니다."); // 파일을 닫습니다 FClose (filegeek); // 프로그램에서 나와 있습니다 반환 (0); } // 메인 끝

우리는 이것을 "file-io.c"라는 파일로 저장하고 컴파일했습니다. GCC. 실행 가능한 실행 파일로 스튜어 , " 경주 앰플."

 GCC -O STEX 파일 -IO.C 

우리는 전화 할게 특히 명령 행에서 우리가 추적하고자하는 프로세스로 새로운 실행 파일의 이름을 전달하십시오. 우리는 Linux 명령이나 다른 바이너리 실행 파일을 쉽게 추적 할 수 있습니다. 우리는 두 가지 이유로 우리의 작은 프로그램을 사용하고 있습니다.

첫 번째 이유는 그 것이다 특히 자세한 것이다. 많은 출력이있을 수 있습니다. 당신이 사용할 때 훌륭합니다 특히 분노로, 그러나 그것은 처음에는 압도적 일 수 있습니다. 제한이 있습니다 특히 우리의 작은 프로그램을위한 출력. 두 번째 이유는 우리의 프로그램이 기능이 제한적이며 소스 코드는 짧고 직선적이라는 것입니다. 이렇게하면 출력의 어떤 섹션이 프로그램의 내부 작업의 다른 부분을 참조하는지를 쉽게 식별 할 수 있습니다.

 strace ./stex

우리는 분명히 볼 수 있습니다 쓰다 시스템 호출 텍스트를 "파일에 씁니다"를 열었던 파일과 exit_group. 시스템 호출. 이렇게하면 응용 프로그램의 모든 스레드가 종료되고 반환 값을 셸로 다시 전송합니다.

출력 필터링

우리의 간단한 데모 프로그램을 사용하더라도 꽤 많은 출력이 있습니다. 우리는 그를 사용할 수 있습니다 -이자형 (표현식) 옵션. 우리가보고 싶은 시스템 호출의 이름을 통과 할 것입니다.

 strace -e write ./stex

쉼표로 구분 된 목록으로 추가하여 여러 시스템 호출을보고 할 수 있습니다. 시스템 호출 목록에 공백을 포함하지 마십시오.

 Strace -e 닫기, 쓰기 ./stex

출력을 파일로 보냅니다

출력을 필터링하는 이점은 출력을 필터링하는 문제점이기도합니다. 당신은 당신이 보려는 것을 알고 있지만 다른 것을 보지 못합니다. 그리고 그 일부 다른 출력은 당신이 보려는 물건보다 더 유용 할 수 있습니다.

때로는 모든 것을 캡처하고 전체 결과 집합을 검색하고 스크롤하는 것이 더 편리합니다. 그렇게하면 실수로 중요한 것을 제외하지는 않습니다. NS -영형 (출력) 옵션을 사용하면 출력을 특히 텍스트 파일에 대한 세션.

 strace -o trace-output.txt ./stex

그런 다음 할 수 있습니다 사용 더 적은 명령 목록을 스크롤하고 시스템 호출을 검색하거나 다른 이름으로 검색하십시오.

 덜 추적 - 출력 .TXT 

이제 모든 것을 사용할 수 있습니다 더 적은 출력을 조사하기위한 검색 기능.

관련된: Linux에서 less 명령을 사용하는 방법

타임 스탬프 추가

여러 가지 다른 시간 소인을 출력에 추가 할 수 있습니다. NS -NS (상대 타임 스탬프) 옵션은 각 연속 시스템 호출의 시작 간의 시간차를 보여주는 시간 소인을 추가합니다. 이러한 시간 값에는 이전 시스템 호출에서 소요 된 시간과 다음 시스템이 호출하기 전에 프로그램이 수행하는 다른 것들이 포함됩니다.

 strace -r ./stex

타임 스탬프는 각 출력 행의 시작 부분에 표시됩니다.

각 시스템 호출에서 소요되는 시간을 보려면 다음을 사용하십시오. -NS (syscall-times) 옵션. 각 시스템 호출 내부에서 소요되는 시간 기간을 보여줍니다.

 strace -t ./stex

시간 기간은 각 시스템 통화 회선의 끝에 표시됩니다.

각 시스템 호출이 호출되는 시간을 보려면 다음을 사용하십시오. ...의 (절대 시간 소인) 옵션. 이것은 마이크로 초 해상도로 "벽 클럭"시간을 보여줍니다.

 strace -tttt ./stex

시간은 각 행의 시작 부분에 표시됩니다.

실행중인 프로세스 추적

추적 할 프로세스가 이미 실행 중이면 여전히 첨부 할 수 있습니다. 특히 그것에. 이렇게하려면 프로세스 ID를 알아야합니다. 너는 할 수있어 사용하다 추신 ~와 함께 grep. 이것을 찾으려면. 우리는 Firefox가 실행 중입니다. 그 이름의 ID를 찾으려면 파이어 폭스 프로세스, 우리는 사용할 수 있습니다 추신 그리고 그것을 통해 파이프 grep. ...에

 PS -E | grep firefox 

우리는 프로세스 ID가 8483 인 것을 볼 수 있습니다. 우리는 -NS (프로세스 ID) 옵션을 알려줍니다 특히 어떤 과정을 부착 할 수 있습니다. 사용할 필요가 있습니다 Sudo. :

 Sudo Strace -P 8483 

알림이 표시됩니다 특히 프로세스에 자신을 첨부 한 다음 시스템 추적 호출이 일반적으로 터미널 창에 표시됩니다.

보고서 작성

NS -씨 (요약 만 해당) 옵션 원인 특히 보고서를 인쇄하려면. 추적 프로그램이 수행 한 시스템 호출에 대한 정보는 테이블을 생성합니다.

 strace -c ./stex

열은 다음과 같습니다.

  • % 시각 : 각 시스템 호출에 소요 된 실행 시간의 백분율.
  • 초월 : 각 시스템 호출에서 초 단위로 표시되는 총 시간과 마이크로 초를 표시합니다.
  • USECS / Call. : 평균 시간은 각 시스템 호출에서 소비 된 마이크로 초입니다.
  • 전화 : 각 시스템 호출이 실행 된 횟수입니다.
  • 오류 : 각 시스템 호출에 대한 오류 수입니다.
  • syscall. : 시스템 호출의 이름입니다.

이 값은 실행 및 종료하는 사소한 프로그램에 대한 0을 신속하게 보여줍니다. 데모 응용 프로그램보다 더 의미있는 것을하는 프로그램에 대한 실제 가치가 표시됩니다.

깊은 통찰력, 쉽게

NS 특히 출력은 시스템 호출이 이루어지는 시스템을 보여줄 수 있으며, 어떤 실행 시간이 커널 사이드 코드 안에 얼마나 많은 실행 시간을 보냈는지 보여줍니다. 훌륭한 정보입니다. 종종 코드 내부에서 무슨 일이 일어나는지 이해하려고 할 때 바이너리가 많은 기능을 수행하기 위해 커널과 거의 비주주를 상호 작용하는 것이 쉽습니다.

사용하여 특히 , 당신은 완전한 그림을 본다.


리눅스 - 가장 인기있는 기사

Linux에서 SQLite 용 DB 브라우저를 사용하는 방법

리눅스 Dec 16, 2024

[삼] Fatmawati Achmad Zaenuri / Shutterstock. SQLite 용 DB 브라우저 Linux에서 SQLite 데이터베이스를보고 편집 할 수 있습니다. �..


Linux에 신호 데스크탑을 설치하는 방법

리눅스 Jan 22, 2025

[삼] 엘리 쥬 가이슬러 / Shutterstock.com 신호 ~이다 개인 정보 보호에 초점을 맞춘 스마트 폰 메시징 응용 프로그램 모�..


SystemD가없는 최고의 리눅스 배포판

리눅스 Feb 24, 2025

[삼] bmj / shutterstock.com 지배적 인 리눅스 배포판이 채택되었을 때 시스템 반대자들은 분포를 분배하고 새로운 프�..


리눅스에서 bash에서 "여기 문서"를 사용하는 방법

리눅스 Mar 31, 2025

[삼] Fatmawati Achmad Zaenuri / Shutterstock. 이상하게 지명 된 "여기서 문서"는 Linux에서 Bash 스크립트 내에서 입력 / 아웃 리디렉�..


고유 한 기능을 갖는 특수 리눅스 배포판

리눅스 Jul 20, 2025

[삼] 기존 리눅스 배포판의 만화적으로 긴 목록을 통해 읽는 것은 일광욕적 인 맛과 오프 슈트가 모두 흐리게 시작됩니다. 치료법을 치르기 위�..


Linux에서 fsck 명령을 사용하는 방법

리눅스 Aug 18, 2025

[삼] Pixza Studio / Shutterstock. 모든 중요한 데이터는 한 유형 또는 다른 유형의 파일 시스템에 있으며 파일 시스템 문제가 해..


M1 Apple Silicon Mac에 Linux를 설치할 수 있습니까?

리눅스 Nov 12, 2024

[삼] [삼] 모든 사람이 Mac을 만드는 Mac을 구입하지는 않습니다. 나쁜 소식은 2021 년 11 월 현재 Apple Silicon의 네이티브 리눅스 지원이 가능하지 않�..


Linux에서 DNS를 플러시하는 방법

리눅스 Nov 14, 2024

Linux 장치에서 인터넷 브라우징 경험이 느려지거나 구식 또는 잘못된 웹 사이트를 방문하고 있습니까? Linux에서 DNS 캐시를 플러시하고 실제로 필�..


카테고리