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

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

但是我想知道是否有可能列出从Linux用户空间到内核空间的ioctl调用。

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

使用LTTng 。 如果您使用的是Ubuntu,Fedora,Arch Linux,Debian或openSUSE,那么这是一个现代Linux内核跟踪程序(也可以在用户用户中运行),在几秒钟内安装(可作为软件包提供)。 否则, 获取压缩包并遵循安装程序仍然很容易。

追踪

你创建一个这样的轨迹:

 $ 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 

然后做你的正常的东西。 所有的系统调用,包括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 

尽管在这里destroy听起来不太好,但实际上并没有破坏跟踪文件。 它只需刷新一切,并释放到文件的任何链接。

由于您正在跟踪内核事件,所以到处都需要sudo 。 您不希望任何用户出于安全原因显示所有系统调用及其参数。

查看跟踪

现在有两个主要的观众。 Babeltrace会给你一个所有捕获的事件的文本输出。 你应该可以使用apt-getbabeltrace )来获得它,否则只要获得最新的tarball 。 然后使用grep从巨大的转储Babeltrace输出中提取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 } ... 

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

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

  1. 转到eclipse.org的下载页面
  2. 进入开发者版本 (在Eclipse Juno几天之内发布之前),获取适用于C / C ++开发人员的Eclipse IDE
  3. 解压缩并启动它

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

然后,您可以创建一个新的跟踪项目并导入跟踪。 如果您打开“ 跟踪”透视图,则可以访问有用的视图来查看事件。 以下是“ 直方图”和“ 事件”视图的示例:

Eclipse LTTng查看器

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