시스템 호출이 트리거되는 시기를 모니터링하여 임베디드 장치를 디버깅하려고 합니다. 현재로서는 장치에 루트 셸이 연결되어 있습니다. 명령을 실행하면 $ top
실행 파일이 실행되는 것을 볼 수 있지만 /system/bin/main
이 파일 내에는 ioctl 호출이 여러 번 있습니다. 내가 원하는 것은 이러한 시스템 호출이 실제로 실시간으로 실행될 때 "알림"을 받거나 모니터링하는 것입니다. 예를 들어, 카메라에 요청을 보내 ioctl 호출을 실행할 수 있다는 것을 알고 있지만 루트 쉘에서 이를 보는 방법은 모릅니다. 이 파일에서는 ioctl만 사용합니다.
답변1
정확히 이 일을 하는 유틸리티가 있습니다 strace
: 프로그램에 연결하고 시스템 호출을 표시합니다. 이렇게 사용할 수 있지만 strace <program>
일반 프로그램 출력과 혼합되어 방해가 됩니다. 더 나은 접근 방식(루트 액세스가 필요하지만)은 먼저 프로그램을 실행한 다음 pgrep <program>
PID를 가져오거나 수동으로 찾은 top
다음 별도의 쉘에서 루트로 실행하는 것입니다 strace -p <pid>
. 그런 다음 거기에서 grep 하고 벨을 통해 ioctl()
파이프하거나 에코 하여 매번 알림을 받을 수 있습니다. 또한 (주석은 @aviro에게 제공) 에 전달하여 추적을 수행할 수 있으며 인수를 추가하면 생성된 모든 하위 프로세스도 추적할 수 있습니다. 전체 명령은 다음과 같습니다.notify-send
xargs
ioctl()
-e trace=ioctl
strace
-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