궤도[sh]디버깅 목적으로?

궤도[sh]디버깅 목적으로?

나는 때때로 죽은 프로세스를 생성하는 대규모 응용 프로그램(C++로 작성)을 가지고 있습니다. 나는 응용 프로그램이 내부적으로 많은 Linux 명령을 사용한다는 것을 알고 있습니다. 존재하지 않는 sh 프로세스에서 어떤 Linux 명령을 호출했는지 알아야 합니다. 찾을 수 있나요? 또는 내 애플리케이션이 Linux 명령을 호출할 때 Linux를 설정하고 일종의 로그를 얻을 수 있습니까?

감사해요.
루크

답변1

~에서위키피디아:

데드 프로세스는 실행이 완료되었지만 여전히 프로세스 테이블에 항목이 있는 프로세스입니다. 이 항목은 (현재 좀비) 프로세스를 시작한 프로세스가 종료 상태를 읽을 수 있도록 허용하는 데 여전히 필요합니다.

C++ 코드가 호출을 수행하고 있습니까 wait()? wait()만료된 프로세스를 호출하여 종료 상태를 얻은 경우 해당 프로세스는 사라져야 합니다.

답변2

popen이 대규모 애플리케이션은 유사한 라이브러리 기능을 사용하여 셸을 통해 외부 명령을 실행합니다. 애플리케이션이 호출하지 않기 때문에 중간 쉘은 좀비("죽은 프로세스")로 남아 있습니다.wait그 아이들을 "수확"합니다. 좀비 프로세스는 완전히 무해합니다(B 영화에서 무엇을 믿더라도). 좀비 프로세스가 소비하는 유일한 리소스는 프로세스 테이블의 항목입니다.

다음을 실행하여 애플리케이션에서 실행된 명령을 추적할 수 있습니다.

strace -f -s99999 -v -eexecve -o big-application.strace ./big-application

이로 인해 프로그램 속도가 약간 느려질 수 있습니다. 프로세스 수명 동안 추적을 켜거나 끌 수 있습니다. 추적을 시작하려면 다음을 실행하세요.

strace -f -s99999 -v -eexecve -o big-application.strace -p 12345

여기서 12345는 추적하려는 프로세스 ID입니다. 추적을 중지하려면 strace프로세스를 종료합니다 (예: Ctrl+ 누르기).C

관련 정보