可能是我的问题听起来更天真了。
但是我想知道是否有可能列出从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-get
( babeltrace
)来获得它,否则只要获得最新的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查看器。 简单的步骤是:
从Eclipse Juno开始,Linux Tools嵌入到用于C / C ++开发人员的Eclipse IDE中。
然后,您可以创建一个新的跟踪项目并导入跟踪。 如果您打开“ 跟踪”透视图,则可以访问有用的视图来查看事件。 以下是“ 直方图”和“ 事件”视图的示例:
在这里,我使用“事件”视图仅保留了ioctl
调用,并且您可以清楚地看到内容和时间戳与Babeltrace输出相匹配。