strace가 쉘 기능을 찾지 못하고 "Can't stat" 오류를 발생시킵니다.

strace가 쉘 기능을 찾지 못하고 "Can't stat" 오류를 발생시킵니다.

funk_a사용자 정의 함수를 호출하려고 하는데 strace찾을 수 없는 것 같습니다. funk_a가 스스로 호출될 수 있음을 확인했습니다. 어떤 의견이라도 감사하겠습니다.

$ source ./strace_sample.sh 
$ funk_a
Earth, Wind, Fire and Water
$ funk_b
Get on up
strace: Can't stat 'funk_a': No such file or directory

$ dpkg -p strace|grep Vers
Version: 4.8-1ubuntu5
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.5 LTS
Release:        14.04
Codename:       trusty

strace_sample.sh

#!/bin/bash

function funk_a {
  echo "Earth, Wind, Fire and Water"
}

function funk_b {
  echo "Get on up"
  strace -o trace_output.txt -c -Ttt funk_a
}

감사해요.

답변1

stracestrace실행 파일 만 가능합니다 .

funk_a은 함수, 즉 쉘의 프로그래밍 구성이지 실행할 수 있는 것이 아닙니다.

추적할 수 있는 유일한 것은 strace함수 본문을 평가하는 새로운 셸입니다. 예를 들면 다음과 같습니다.

strace -o trace_output.txt -Ttt bash -c "$(typeset -f funk_a); funk_a"

-c( 의미가 없어 삭제했습니다 -Ttt.)

그러나 이 함수에 의해 수행된 시스템 호출 외에도 bash로드 및 초기화 중(그리고 정리 및 종료 후) 수행된 모든 시스템 호출도 볼 수 있습니다.writefunk_a

또는 strace쉘이 평가할 때 함수의 pid를 추적 할 수 있습니다 funk_a.

strace -o trace_output.txt -Ttt -p "$$" &
funk_a
kill "$!"

그러나 쉘의 PID 에 추가될 때쯤에는 strace쉘이 함수 해석을 완료했을 가능성이 높습니다. 다음과 같은 동기화를 시도해 볼 수 있습니다.

strace -o trace_output.txt  -Ttt -p "$$" &
tail -F trace_output.txt | read # wait for some output in trace_output.txt

funk_a
kill "$!"

그러나 이 경우에도 타이밍에 따라 trace_output.txt사용된 시스템 호출에 대한 일부 설명이 포함되거나 명령 추적을 출력 파일에 쓸 시간이 되기 전에 종료 tail|read될 수 있습니다 .killstraceecho

더 나은 접근 방식은 두 개의 식별 가능한 시스템 호출 간에 호출을 래핑하는 것입니다 funk_a.

strace -fo >(sed -n '1,\|open("///dev/null|d
                     \|open("/dev///null|q;p' > trace_output.txt
  ) -Ttt -p "$$" &
sleep 1 # give enough time for strace to start
exec 3<  ///dev/null # start signal
funk_a
exec 3< /dev///null # end signal

답변2

그걸 발견하고 나서 깨달았어요이 스레드strace실행 파일 만 호출할 수 있습니다.

위의 예를 다음과 같이 변경하면 작동합니다.

유용

#!/bin/bash
echo "Earth, Wind, Fire and Water"

strace_sample.sh

#!/bin/bash

function funk_b {
  echo "Get on up"
  #strace -o funk_a.out -c -Ttt funk_a
  strace -o util.out -c -Ttt ./util.sh
}

결과

$ funk_b
Get on up
Earth, Wind, Fire and Water
$ more util.out 
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
  0.00    0.000000           0         7           read
  0.00    0.000000           0         1           write
  0.00    0.000000           0        27        18 open
:

관련 정보