strace 명령 시작

3520 단어
1、strace:trace system calls and signals
1) 소개:strace는 프로세스가 호출한 시스템 호출과 프로세스가 받은 신호를 차단하고 기록한다.그것은 매우 유용한 프로그램 진단과 디버깅 도구다.
2) 사용법:
(1) 예 1:
int main()
{
    std::cout << "hello world" << std::endl;
    return 0;
}

a.out으로 컴파일한 후 strace -T -tt./a.out >/dev/null(a.out과strace의 출력이 혼동되지 않도록 방지), 다음은 출력입니다.
12:38:36.908803 execve("./a.out", ["./a.out"], [/* 28 vars */]) = 0 <0.000285>
12:38:36.909372 brk(0)                  = 0x1127000 <0.000062>
12:38:36.909528 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f6ce17d9000 <0.000089>
12:38:36.909784 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) <0.000076>
... ...
12:38:36.918265 write(1, "hello world
", 12) = 12 <0.000055> 12:38:36.918434 exit_group(0) = ? 12:38:36.918573 +++ exited with 0 +++

시스템 호출에 대한 줄마다 이름, 매개 변수, 반환 값이 인쇄됩니다. (오류가 발생했을 때 해당하는 오류 문자열도 있습니다.)strace는 기본적으로 표준 오류에 이 정보를 인쇄합니다.
옵션: - T: 시스템 호출에 소요된 시간을 표시합니다. -t: 줄마다 시간을 추가합니다.
strace-c./실행a.out >/dev/null, 출력은 다음과 같습니다.
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 34.50    0.000069           4        17           mmap
 24.00    0.000048          10         5           open
 16.00    0.000032           3        10           mprotect
  8.00    0.000016           4         4           read
  6.00    0.000012           2         6           fstat
  5.50    0.000011           2         5           close
  4.00    0.000008           8         1         1 access
  1.00    0.000002           2         1           execve
  0.50    0.000001           1         1           write
  0.50    0.000001           1         1           brk
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0         1         1 ioctl
  0.00    0.000000           0         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000200                    54         2 total

옵션:-c: 모든 시스템이 호출되는 총 횟수, 총 소모 시간과 총 오류 횟수 등을 통계하고 프로그램이 종료될 때 출력합니다.Linux에서 이 시간은 시스템 시간(system time, 즉 CPU가 핵에서 실행되는 시간)이다.
(2) 예 2:
int main()
{
    sleep(100);
    return 0;
}

a.out으로 컴파일한 후 터미널 A에서 실행;터미널 B에서 strace -p`pidof a.out`을 실행합니다.터미널 A에서 a.out 프로세스를 백그라운드(Ctrl-z)로 자른 다음 다시 커팅(fg)하면 터미널 B의 출력(프로세스가 받은 신호에 대한 정보)을 볼 수 있습니다.
Process 8885 attached
restart_syscall(<... resuming interrupted call ...>
) = ? ERESTART_RESTARTBLOCK (Interrupted by signal)
--- SIGTSTP {si_signo=SIGTSTP, si_code=SI_KERNEL, si_value={int=3722471000, ptr=0x7f6fdde06658}} ---
--- stopped by SIGTSTP ---
--- SIGCONT {si_signo=SIGCONT, si_code=SI_USER, si_pid=2455, si_uid=0} ---
restart_syscall(<... resuming interrupted call ...>

strace는 지정한 PID 프로세스에 -p 옵션을 사용합니다. (여러 개의 -p는 여러 프로세스에 attach할 수 있습니다.)
 
 
 
 
끊임없이 공부하는 중...

좋은 웹페이지 즐겨찾기