我试图通过监视何时触发系统调用来调试我的嵌入式设备。截至目前,我已经有一个连接到设备的 root shell。当我执行$ top
命令时,我可以看到我的可执行文件/system/bin/main
正在运行,但在此文件中我有多个 ioctl 调用。我想做的是“收到通知”或监视这些系统调用何时实际被实时触发。例如,我知道我可以通过向摄像头发送请求来触发 ioctl 调用,但我不知道如何在 root shell 中查看它。我只在此文件中使用 ioctl。
答案1
有一个名为 的实用程序strace
,它正是执行此操作:附加到程序并显示其系统调用。您可以像这样使用它strace <program>
,但它会与正常的程序输出混合并干扰它。更好的方法(尽管需要 root 访问权限)是首先运行程序,然后pgrep <program>
获取其 PID 或通过手动找到它top
,然后在单独的 shell 中以 root 身份运行strace -p <pid>
。然后,您可以在那里 grepioctl()
并通过管道将其发送到notify-send
或通过响铃回显,xargs
以便每次都能收到通知。此外,可以ioctl()
通过传递-e trace=ioctl
to strace
(归功于 @aviro 的评论)来进行跟踪,并且通过添加参数,-f
它也可以跟踪创建的任何子进程。完整的命令可能如下所示:
strace -f -e trace=ioctl -p <pid> &>&1 | tee ioctl.log | tee >(xargs -L1 echo -e \b)
省略最后一个命令以简单地将 ioctl 输出到标准输出。交换echo -e \b
为notify-send
您偏好的通知创建者或任何其他通知创建者,每次发生新的 ioctl 时都会调用该通知创建者。