列出从用户空间到内核空间的ioctl调用

cod*_*eak 5 linux ioctl linux-kernel

可能是我的问题听起来更天真.

但我想知道是否可以在Linux中列出从用户空间到内核空间的ioctl调用.

eep*_*epp 8

使用LTTng.这是一个现代的Linux内核示踪剂(工作在用户空间太)在秒钟(可作为包)安装,如果你使用Ubuntu,Fedora的,Arch Linux的,Debian或者openSUSE的.否则,获取tarball并遵循安装过程仍然很容易.

追踪

您创建这样的跟踪:

$ sudo lttng create mySession
Session mySession created.
Traces will be written in /home/user/lttng-traces/mySession-20120619-103600
$ sudo lttng enable-event -k -a --syscall
All kernel system calls are enabled in channel channel0
$ sudo lttng start
Tracing started for session mySession
Run Code Online (Sandbox Code Playgroud)

然后做你正常的事情.所有系统调用,包括ioctl,由LTTng记录/捕获有趣的参数.正在将跟踪写入/home/user/lttng-traces/mySession-20120619-103600目录.完成录制后,请执行以下操作:

$ sudo lttng stop
Tracing stopped for session mySession
$ sudo lttng destroy
Session mySession destroyed at /home/ephipro
Run Code Online (Sandbox Code Playgroud)

虽然destroy这里听起来不太好,但它实际上并没有破坏跟踪文件; 它只是刷新所有内容并释放任何文件链接.

sudo因为您正在跟踪内核事件,所以无处不在.出于明显的安全原因,您不希望任何用户看到所有系统调用及其参数.

查看跟踪

现在有两位主要观众.Babeltrace将为您提供所有捕获事件的文本输出.您应该能够使用apt-get(babeltrace)获取它,否则只需获取最新的tarball.然后只是用来从巨大的转储Babeltrace输出中grep提取ioctl调用:

$ sudo babeltrace /home/user/lttng-traces/mySession-20120619-103600 | grep ioctl
[10:36:41.795425690] (+0.000001403) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 0 }
[10:36:41.795435996] (+0.000000610) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.795573431] (+0.000008840) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 4096 }
[10:36:41.795591089] (+0.000000854) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38520960 }
[10:36:41.795595956] (+0.000000434) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.796125261] (+0.000006110) sys_ioctl: { 1 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.796185722] (+0.000000947) sys_ioctl: { 1 }, { fd = 18, cmd = 62981, arg = 38530304 }
[10:36:41.796192688] (+0.000000628) sys_ioctl: { 1 }, { fd = 18, cmd = 2148070920, arg = 139928632507464 }
[10:36:41.797155511] (+0.000003280) sys_ioctl: { 0 }, { fd = 18, cmd = 62982, arg = 0 }
[10:36:41.797202362] (+0.000001995) sys_ioctl: { 0 }, { fd = 18, cmd = 62981, arg = 38529760 }
...
Run Code Online (Sandbox Code Playgroud)

你在这里看到的是事件发生的时间,事件名称及其所有参数和值.

Eclipse还在Linux Tools插件项目中提供了完整的LTTng查看器.简单的步骤是:

  1. 转到eclipse.org的下载页面
  2. 进入开发人员构建(直到Eclipse Juno在几天内发布),获取适用于C/C++开发人员的Eclipse IDE
  3. 提取并启动它

从Eclipse Juno开始,Linux Tools嵌入到Eclipse IDE中,用于C/C++开发人员.

然后,您可以创建新的跟踪项目并导入跟踪.如果打开" 跟踪"透视图,则可以访问有用的视图以显示事件.以下是直方图和事件视图的示例:

Eclipse LTTng查看器

在这里,我使用"事件"视图仅保留ioctl调用,您可以清楚地看到内容和时间戳与Babeltrace输出相匹配.


J-1*_*DiZ 2

你试过了吗strace?它列出了所有系统调用。