루트 셸에서 시스템 호출이 트리거되는 시기를 모니터링하는 방법은 무엇입니까?

루트 셸에서 시스템 호출이 트리거되는 시기를 모니터링하는 방법은 무엇입니까?

시스템 호출이 트리거되는 시기를 모니터링하여 임베디드 장치를 디버깅하려고 합니다. 현재로서는 장치에 루트 셸이 연결되어 있습니다. 명령을 실행하면 $ top실행 파일이 실행되는 것을 볼 수 있지만 /system/bin/main이 파일 내에는 ioctl 호출이 여러 번 있습니다. 내가 원하는 것은 이러한 시스템 호출이 실제로 실시간으로 실행될 때 "알림"을 받거나 모니터링하는 것입니다. 예를 들어, 카메라에 요청을 보내 ioctl 호출을 실행할 수 있다는 것을 알고 있지만 루트 쉘에서 이를 보는 방법은 모릅니다. 이 파일에서는 ioctl만 사용합니다.

답변1

정확히 이 일을 하는 유틸리티가 있습니다 strace: 프로그램에 연결하고 시스템 호출을 표시합니다. 이렇게 사용할 수 있지만 strace <program>일반 프로그램 출력과 혼합되어 방해가 됩니다. 더 나은 접근 방식(루트 액세스가 필요하지만)은 먼저 프로그램을 실행한 다음 pgrep <program>PID를 가져오거나 수동으로 찾은 top다음 별도의 쉘에서 루트로 실행하는 것입니다 strace -p <pid>. 그런 다음 거기에서 grep 하고 벨을 통해 ioctl()파이프하거나 에코 하여 매번 알림을 받을 수 있습니다. 또한 (주석은 @aviro에게 제공) 에 전달하여 추적을 수행할 수 있으며 인수를 추가하면 생성된 모든 하위 프로세스도 추적할 수 있습니다. 전체 명령은 다음과 같습니다.notify-sendxargsioctl()-e trace=ioctlstrace-f

strace -f -e trace=ioctl -p <pid> &>&1 | tee ioctl.log | tee >(xargs -L1 echo -e \b)

ioctl을 표준 출력으로 간단히 인쇄하려면 마지막 명령을 생략하십시오. 선호하는 알림 생성자 또는 새 ioctl이 발생할 때마다 호출되는 다른 알림 생성자 echo -e \b로 바꾸십시오 .notify-send

관련 정보