명령이나 프로세스가 중단되거나 정지되거나 충돌하는 것처럼 보일 때 현재 뒤에서 무엇을 하고 있는지 조사할 수 있는 방법이 있습니까?
충돌이 발생하는지 아니면 시간이 오래 걸리는 작업을 수행하는 것인지 확인하는 데 특히 유용합니다. 예상대로 작동하지 않는 경우 문제를 해결하는 데 도움이 될 수 있습니다. 감사해요.
답변1
이를 수행하기 위해 2개의 하위 수준 도구를 사용할 수 있습니다: strace
및 gdb
. 가용성은 strace
Linux 또는 Linux가 실행되는 운영 체제를 사용하고 있다고 가정합니다. 다른 운영 체제의 경우 truss
, 또는 이 있을 수 있지만 dtrace
기술은 비슷합니다.
스트레스
따라서 strace
에 비해 사용하기가 더 쉽고 gdb
일반적으로 "이 앱의 기능은 무엇인가요?"라는 질문에 잘 대답합니다. (저에게) 일반적인 사용법은 다음과 같습니다.
strace -f -tt -s 200 -p $PID
필요한 유일한 실제 옵션은 입니다 -p $PID
. 다른 옵션은 출력 줄에 더 많은 정보를 추가할 뿐 실제로는 필요하지 않습니다.
그것이 하는 일은 애플리케이션이 만드는 모든 시스템 호출을 보여주는 것입니다. 애플리케이션이 표시 이외의 작업을 수행할 수 있는 유일한 방법은 strace
순전히 계산적인 경우입니다. 숫자 등을 처리하는 것을 의미합니다. 파일 읽기/쓰기, 패킷 보내기, 현재 시간 가져오기 등과 같은 작업에는 모두 시스템 호출이 필요하며 표시됩니다.
데이터 베이스
gdb
아래 수준에는 strace
애플리케이션 gdb
이 실제로 실행되는 코드 줄이 표시됩니다. 그러나 여기에는 몇 가지 문제가 있습니다. 가장 중요한 것은 애플리케이션에 디버깅 기호가 필요하다는 것입니다. 이는 일반적으로 배포판에서 제공하는 패키지에서 제거됩니다. 그러나 RedHat 파생물과 같은 배포판에서는 일반적으로 pkgfoo-debuginfo-1.2.3.rpm
. 또 다른 점은 strace
시간이 지남에 따라 애플리케이션이 수행하는 작업을 어디에서 표시할 것인지, gdb
검사하는 동안 프로세스를 정지시키기 때문에 해당 애플리케이션이 현재 수행 중인 작업을 표시할 수 있다는 것입니다.
어쨌든 사용법은 다음과 같습니다.
gdb -p $PID
...이렇게 하면 다음 명령을 실행할 수 있는 대화형 셸로 이동됩니다.
where
또는
info threads
gdb
응용 프로그램의 복잡성에 따라 복잡해질 수 있고 인터넷에 많은 가이드가 있으므로 사용 방법에 대해 자세히 설명하지 않겠습니다 .
프로세스 탐색을 마치고 다시 시작하려면 quit
또는 CTRL+ 를 사용하세요 D.
답변2
추가 플래그를 통해 자세한 출력을 사용하여 터미널 창에서 대부분의 프로세스를 시작할 수 있습니다 -v
. 이렇게 하면 터미널 창이 정지된 것처럼 보일 때 터미널 창에서 무슨 일이 일어나고 있는지 확인할 수 있습니다.
top
또한 htop
메모리 및 CPU 사용량에 대한 업데이트된 정보와 매우 유용한 요약 정보를 포함하여 실행 중인 프로세스에 대한 유용한 정보를 제공합니다.
ps
명령 문서를 볼 수도 있습니다 man ps
.