如何在 root shell 中监控何时触发系统调用?

如何在 root shell 中监控何时触发系统调用?

我试图通过监视何时触发系统调用来调试我的嵌入式设备。截至目前,我已经有一个连接到设备的 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=ioctlto strace(归功于 @aviro 的评论)来进行跟踪,并且通过添加参数,-f它也可以跟踪创建的任何子进程。完整的命令可能如下所示:

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

省略最后一个命令以简单地将 ioctl 输出到标准输出。交换echo -e \bnotify-send您偏好的通知创建者或任何其他通知创建者,每次发生新的 ioctl 时都会调用该通知创建者。

相关内容