ftrace:通过 echo 从 function_graph 更改 current_tracer 时系统崩溃

2024-02-10

我最近一直在使用 ftrace 来监控我系统的一些行为特征。我一直在通过一个小脚本来打开/关闭跟踪。运行脚本后,我的系统会崩溃并自行重新启动。最初,我认为脚本本身可能有错误,但后来我确定崩溃和重新启动是由于echo将一些跟踪器添加到 /sys/kernel/debug/tracing/current_tracer 时current_tracer设置为 function_graph。

也就是说,以下命令序列将导致崩溃/重新启动:

echo "function_graph" > /sys/kernel/debug/tracing/current_tracer
echo "function" > /sys/kernel/debug/tracing/current_tracer

由上述原因引起的崩溃后重新启动时echo语句,我看到很多输出内容如下:

清除孤立的 inode<inode>

我尝试通过替换来重现这个问题current_tracer从 function_graph 到 C 程序中其他内容的值:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>

int openCurrentTracer()
{
        int fd = open("/sys/kernel/debug/tracing/current_tracer", O_WRONLY);
        if(fd < 0)
                exit(1);

        return fd;
}

int writeTracer(int fd, char* tracer)
{
        if(write(fd, tracer, strlen(tracer)) != strlen(tracer)) {
                printf("Failure writing %s\n", tracer);
                return 0;
        }

        return 1;
}

int main(int argc, char* argv[])
{
        int fd = openCurrentTracer();

        char* blockTracer = "blk";
        if(!writeTracer(fd, blockTracer))
                return 1;
        close(fd);

        fd = openCurrentTracer();
        char* graphTracer = "function_graph";
        if(!writeTracer(fd, graphTracer))
                return 1;
        close(fd);

        printf("Preparing to fail!\n");

        fd = openCurrentTracer();
        if(!writeTracer(fd, blockTracer))
                return 1;
        close(fd);

        return 0;
}

奇怪的是,C 程序并没有使我的系统崩溃。

我最初在使用 Ubuntu(Unity 环境)16.04 LTS 时遇到了这个问题,并确认这是 4.4.0 和 4.5.5 内核上的问题。我还在运行 Ubuntu(Mate 环境)15.10、4.2.0 和 4.5.5 内核的机器上测试了这个问题,但无法重现该问题。这只会让我更加困惑。

谁能让我了解正在发生的事情?具体来说,为什么我能够write()但不是echo到/sys/kernel/debug/tracing/current_tracer?

Update

正如维尔梅蒂指出的那样,其他人也遇到了类似的问题(如所见here https://lkml.org/lkml/2016/5/13/327).

The ftrace_disable_ftrace_graph_caller()修改 jmp 指令ftrace_graph_call假设它是 jmp (e9) 附近的 5 个字节。 然而,它是一个短 jmp,仅包含 2 个字节 (eb )。和ftrace_stub()位于正下方ftrace_graph_caller所以 上面的修改破坏了指令,导致内核错误 这ftrace_stub()无效操作码如下:

该补丁(如下所示)解决了echo问题,但我还是不明白为什么echo之前被打破时write()不是。

diff --git a/arch/x86/kernel/mcount_64.S b/arch/x86/kernel/mcount_64.S
index ed48a9f465f8..e13a695c3084 100644
--- a/arch/x86/kernel/mcount_64.S
+++ b/arch/x86/kernel/mcount_64.S
@@ -182,7 +182,8 @@ GLOBAL(ftrace_graph_call)
    jmp ftrace_stub
  #endif

 -GLOBAL(ftrace_stub)
 +/* This is weak to keep gas from relaxing the jumps */
 +WEAK(ftrace_stub)
    retq
  END(ftrace_caller)

via https://lkml.org/lkml/2016/5/16/493 https://lkml.org/lkml/2016/5/16/493


看来您不是唯一注意到此行为的人。我懂了

  • https://lkml.org/lkml/2016/5/13/327 https://lkml.org/lkml/2016/5/13/327

作为问题报告,以及

  • https://lkml.org/lkml/2016/5/16/493 https://lkml.org/lkml/2016/5/16/493

作为解决该问题的内核补丁。通读整个线程,问题似乎出在一些编译器优化上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ftrace:通过 echo 从 function_graph 更改 current_tracer 时系统崩溃 的相关文章

随机推荐

  • 在 CakePhp 测试中,testAction() 函数在 debug() 上返回 null

    我试图学习如何在 CakePhp 中使用单元测试 我正在尝试编写控制器测试 我读到了有关 testAction 和 debug 函数的信息 但它对我不起作用 我的意思是 测试方法通过了 但 debug 返回 null 因为 testActi
  • 如何将 MPI 派生数据类型用于 3D 数组?

    我想编写一个适用于 3D 矩阵的并行代码 其中每个进程都有自己的子矩阵 但为了完成其工作 它们需要一些有关相邻进程子矩阵的信息 只是边界平面 我通过点对点通信发送这些信息 但我知道对于大型矩阵来说这不是一个好主意 因此我决定使用派生数据类型
  • Linux:如何在fork上将文件描述符标记为不可继承? [复制]

    这个问题在这里已经有答案了 是否可以在子进程中将特定文件描述符标记为不可继承或关闭它fork 被调用 不会 所有文件描述符都是在 fork 中继承的 但是 您可以将 fd 设置为在 exec 上关闭 方法是使用fcntl fd F SETF
  • 双指针如何用于二维矩阵?

    我正在通过实施康威的生命游戏来尝试 C 语言 我正在尝试动态构建两个网格 int矩阵 一个用于当前 一个用于下一代 因此在确定下一代的样子后 我只需交换指针 起初 我绝望地尝试定义指向网格的指针 例如int grid 您不能使用第二组括号作
  • 如何对 pandas 列中的列表执行 One Hot Encoding?

    假设我有一个数据框 其中一列是一个列表 未知值和长度 例如 df pd DataFrame messageLabels Good Other Bad Bad Terrible 我遇到了这个解决方案 但这不是我正在寻找的 如何最好地将包含列表
  • IE 11 找不到运行 Applet 的 Java 插件

    我使用 Java Applets 构建了应用程序 它在带有 IE 9 的 Windows 7 上运行良好 现在我正在尝试将其移动到另一个环境 有互联网浏览器 11 运行我正在使用的小程序Oracle 部署工具包脚本 http docs or
  • 为什么我们应该使用DataTemplate.DataType

    当我创建资源时 我们指定其中的数据类型
  • 源代码中字符串文字的字符编码问题

    logstring Invoke Command ComputerName filesServer ScriptBlock param logstring grp Klassenbuchordner KB grp Gruppe Gruppe
  • 使用 webpack 定义全局变量

    是否可以使用 webpack 定义一个全局变量来产生如下结果 var myvar 我看到的所有示例都使用外部文件require imports jquery file js 有几种方法可以处理全局变量 1 将变量放入模块中 Webpack
  • android中变量的全局声明

    我是android开发的新手 我正在通过SAX解析器解析xml文件并将解析的数据存储到字符串中 现在我需要在另一个类中使用该字符串 所以我需要知道如何在新类中调用该解析器 提前致谢 我总是创建一个包含所有全局变量的类 并将其称为 Const
  • OpenCV 中的照明标准化

    我正在做一个人脸识别项目 我有不同光照的图片 所以我需要进行光照标准化 我读了一篇声称可以进行照明归一化的论文 本文描述了以下功能和值 1 伽玛校正 伽玛 0 22 高斯差分 DOG 过滤 sigma 0 1 sigma 1 2 3 对比度
  • 如何使用函数创建二维数组?

    我正在尝试定义一个二维数组 但我想在函数中执行它 这是我的代码 int createArray int columns int rows int array rows for int i 0 i lt rows i array i new
  • 在 Fortran 中逐行读取逗号分隔的文本文件

    我是一名 Fortran 新手 我希望能够读取文本文件并将其内容保存在各个变量中 我发现了一个非常有用的 Fortran 教程 http www math hawaii edu hile fortran fort7 htm read htt
  • 向多个用户发送 Firebase 通知

    我正在尝试通过 Firebase 发送通知 但它不起作用 我只想将 Firebase ID 发送给所有注册用户 并将其存储在 MySQL 中 EDIT 这是下面的代码
  • 按钮可能会产生空指针异常(Android Studio)

    我是 Android Studio 的新手 我以为我做得还不错 但昨晚遇到了一个错误 尽管我尽了最大的努力 但我似乎无法修复该错误 我的一项活动上的按钮 可能会产生 java lang NullPointerException 但每次按下它
  • 如何在 Android 应用程序中使用 3G 互联网连接?

    我制作了一个应用程序 可以连接到我在服务器上运行的程序 但它似乎只适用于 WiFi 当我尝试使用 3G 时 却无法建立连接 为了使用 3G 我必须打开或设置什么特殊功能吗 在应用程序级别 您 通常 不必担心手机可以使用哪些数据连接 您是否研
  • Fragment popbackstack触发lifecyclescope收集

    情况 我提交数据setTripDeliver 收集工作正常 触发加载 然后触发成功 我按下一个按钮转到下一个片段 B 使用replace 之后 我按后退按钮 使用popbackstack 收集成功已触发 相关代码 这些代码位于Fragmen
  • 具有 iCloud 设计的核心数据

    我使用的是 iOS 7 想要通过 iCloud 使用核心数据 这运行良好 我想要一些输入的问题如下 我的一些核心数据对象具有相关的图像 大型文本文件 我将它们作为文件存储在文件系统上 并将这些项目的 url 设置为字符串属性 现在显然这不仅
  • 日志文件的大小会影响数据库的性能吗?如何缩小日志文件?

    我刚刚检查了我的日志文件 它几乎有 45GB 我有两个问题 它总体上会影响数据库的性能吗 如何用SQL查询缩小它 请举个例子 谢谢 在正常情况下 没有必要缩小事务日志文件 这通常意味着您处于完整恢复模式 而不是定期执行事务日志备份 日志文件
  • ftrace:通过 echo 从 function_graph 更改 current_tracer 时系统崩溃

    我最近一直在使用 ftrace 来监控我系统的一些行为特征 我一直在通过一个小脚本来打开 关闭跟踪 运行脚本后 我的系统会崩溃并自行重新启动 最初 我认为脚本本身可能有错误 但后来我确定崩溃和重新启动是由于echo将一些跟踪器添加到 sys