프로세스가 실행 중인 명령이 무엇인지 확인하는 방법은 무엇입니까?

프로세스가 실행 중인 명령이 무엇인지 확인하는 방법은 무엇입니까?

나는 strace와 ltrace를 이해하지만 이는 프로세스가 실행 중인 시스템 호출과 라이브러리 호출만 알려줍니다. 프로세스가 실행 중인 명령이 무엇인지 정확히 알고 싶습니다. 어셈블리이거나 C와 어셈블리 사이의 중간 지점입니다(가능한 경우). 바이너리가 디버깅 기호로 컴파일되지 않았다고 가정하므로 첫 번째 옵션이 선호될 가능성이 더 높습니다.

사용 사례: 프로세스가 중단된 것 같고 strace 또는 ltrace에서 출력이 없습니다. 프로세스가 "무언가"를 수행하고 있는지 확인합니다. 나는 이것이 정지 문제를 해결하는 것과 유사하다고 생각하기 때문에 이것이 정확히 파악하기 어려울 수 있다는 것을 알고 있습니다. 그러나 유용한 데이터를 수집하는 것은 가능할 수 있습니다.

두 번째 사용 사례: 호기심. 전체 어셈블리 지침 목록을 텍스트 목록으로 덤프하는 것은 흥미로울 것입니다.

내 생각엔 이 작업을 수행하기 위해 gdb를 사용할 수 있을 것 같지만, 이것이 내가 작성한 프로그램을 디버깅하는 것보다는 gdb를 사용하여 실행 중인 프로세스의 상태를 확인하는 것에 대한 자세한 내용이므로 잘 모르겠습니다.

운영체제는 CentOS 6입니다.

답변1

gdb: 명령을 사용하여 이 작업을 수행 ni하고 si한 번에 하나의 명령을 실행할 수 있습니다 . 대부분의 "next" 값에 대해 명령은 n다음 코드 줄을 실행합니다. n(및 이에 상응하는 ) 의 경우 s디버깅 기호가 실행 파일에 나타나도록 컴파일해야 합니다.

이 stackoverflow 답변시각적으로 이를 수행하는 여러 가지 방법이 제공됩니다.

Command gdb: display/i $pc실행하기 전에 지침을 보여줍니다. display $pc이전 코드 줄을 표시 n하거나 s실행합니다.

답변2

ps -l프로세스 ID를 실행 하고 S("상태") 열을 확인합니다. 상태가 이면 R프로세스가 코드를 실행하고 있는 것입니다. 프로세스가 상태를 유지 R하고 strace시스템 호출을 수행하지 않는 것으로 나타나면 프로세스는 매우 길고 무한한 계산에 갇히게 됩니다. 프로세스가 상태에 있고 계속 유지되면 D시스템 호출에서 차단됩니다. 프로세스 상태에 대한 자세한 내용은 다음을 참조하세요.이 프로세스의 STAT는 무엇을 의미합니까?,"중단 가능한 절전 모드" 상태는 무엇을 의미하나요?그리고"kill -9"가 작동하지 않으면 어떻게 되나요?.

프로세스가 긴 계산을 실행하는 경우 Gdb(또는 다른 디버거)를 사용하여 프로세스가 수행하는 작업을 확인할 수 있습니다. 실행 파일에 디버깅 정보가 부족한 경우(일반적으로 프로그램을 구체적으로 컴파일하지 않은 경우) 디버거는 실행 파일에 디버깅 정보가 포함된 경우에만 기계 명령어를 표시할 수 있으며 읽을 수 있습니다. 스택 추적 등에서 . Gdb를 프로세스에 연결하려면 gdb /path/to/executable 1234where 1234is the process ID를 실행하세요. 이 명령을 사용하면 s한 번에 하나의 명령을 실행할 수 있습니다. 당신이 프로그래머이고 당신의 프로그램이 무엇을 해야 하는지에 대해 어느 정도 익숙하지 않다면, 이 상황에서 Gdb로부터 유용한 정보를 얻는 것은 거의 불가능합니다.

관련 정보