【问题标题】:Listing ioctl calls from userspace to kernelspace列出从用户空间到内核空间的 ioctl 调用
【发布时间】:2012-06-21 07:05:11
【问题描述】:

可能是我的问题听起来更幼稚。

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

【问题讨论】:

    标签: linux linux-kernel ioctl


    【解决方案1】:

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

    【讨论】:

    • 但是我有很多用户空间应用程序在用户空间中运行.. 使用 strace 我只能跟踪特定应用程序发出的系统调用吗?
    • 如果你想在系统范围内使用,请使用systemtap,参见示例页面中的para-callgraph.stp/
    【解决方案2】:

    使用LTTng。如果您使用的是 Ubuntu、Fedora、Arch Linux、Debian 或 openSUSE,这是一个现代 Linux 内核跟踪器(也适用于用户空间),可以在几秒钟内安装(作为软件包提供)。否则,getting the tarballs 并遵循安装程序仍然很容易。

    追踪

    您创建这样的跟踪:

    $ 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) 获得它,否则只需获得latest 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 工具插件项目中提供了一个完整的 LTTng 查看器。简单的步骤是:

    1. 转到eclipse.org's download page
    2. 进入 Developer Builds(直到几天后 Eclipse Juno 发布),获取 面向 C/C++ 开发人员的 Eclipse IDE
    3. 解压并启动

    从 Eclipse Juno 开始,Linux 工具被嵌入到 C/C++ 开发人员的 Eclipse IDE 中。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-11
      • 2011-07-17
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 2016-06-26
      • 2016-06-30
      • 1970-01-01
      相关资源
      最近更新 更多