问题标签 [ftrace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - 我尝试跟踪打开的系统调用,但跟踪记录全是关于 SyS_read
我尝试使用此代码跟踪开放系统调用。
我用它编译了它
并开始Ftrace。
而我得到cat trace
的只是关于..与..SyS_read
没有任何关系SyS_open
(我用 cat set_graph_function 检查如下:
并确认SyS_open
没有错过。)
为什么SyS_read
即使我用 编写代码也只有open()
?
我试图删除缓存并再次执行此操作,但结果完全相同。
而且我也知道为什么会SyS_read
出现,尽管我只使用了open()
.
c - 如何获取调用系统函数的程序的进程ID
我正在编写一个小型内核驱动程序,它的作用是充当蜜罐并监视对系统上特定文件执行的操作。首先,我使用了这个存储库中的代码,然后为了简单起见,我对其进行了一些修改,使其仅适用于一个系统调用sys_open
:
现在我需要为运行该系统调用以打开此文件的进程和用户收集信息,但我找不到任何方法来做到这一点。我认为我可以使用文件描述符来识别哪个进程拥有它,但在与我的大学教授讨论后,他告诉我文件描述符在系统范围内不是唯一的,而只是在进程范围内。
总而言之,有没有办法可以给我隐式调用的进程的PID sys_open
?
linux - 为什么linux(Swapper)的空闲任务在禁用抢占的情况下运行?
两个证据表明,Linux 交换器任务(空闲)在禁用预谋的情况下运行:
1:使用INIT_PREEMPT_COUNT初始化的抢占计数对象,值为“1”,表示禁用抢占。
2.从irqsoff的ftrace中,preempt-depth设置为1,表示禁止抢占。
那么,为什么要这样设计呢?
linux - 从 ftrace 原始文件读取时 splice(2) 返回“无效参数”
我想尝试 splice syscall,trace-cmd 使用它来零复制 off ftrace 的原始文件。
以下是 splice 无法读取的 ftrace 原始文件的部分列表:
/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe_raw
/sys/kernel/debug/tracing/per_cpu/cpo0/snapshot_raw
/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe_raw
/sys/kernel/debug/tracing/per_cpu/cpo1/snapshot_raw
这里还有一些其他文件(拼接处理得很好):
/sys/kernel/debug/tracing/per_cpu/cpo0/trace_pipe
/sys/kernel/debug/tracing/per_cpu/cpo0/snapshot
/sys/kernel/debug/tracing/per_cpu/cpo1/trace_pipe
/sys/kernel/debug/tracing/per_cpu/cpo1/snapshot
什么有效:
- 使用 read() 系统调用非常适合从原始 ftrace 文件中读取。
- 使用 cat() 系统调用将显示原始 ftrace 文件。
- 使用 trace-cmd 工具,它是 ftrace 的 CLI 前端。
这是我的代码:
笔记:
对 /sys/kernel/debug/tracing 的所有访问都是使用 sudo 完成的
linux-kernel - 如何跟踪修复进程的唤醒延迟?
我想使用 ftrace 来跟踪修复进程的唤醒延迟。但是,ftrace 只会记录最大延迟。而且, set_ftrace_pid 没用。
有人知道该怎么做吗?
非常感谢。
linux - 当我使用 linux 跟踪事件触发器时,我无法转储堆栈跟踪
内核文档“跟踪:跟踪事件触发器”说,只要触发事件被触发,我就可以使用 stacktrace cmd 将堆栈跟踪转储到跟踪缓冲区。但我得到的只是一个简单的字符串“stacktrace”。这是我的配置:
cd /sys/kernel/debug/tracing/events/sched/sched_switch
回声 1 > 启用
回声“堆栈跟踪”> 触发器
猫触发器
堆栈跟踪:无限
当我查看“跟踪”输出时,我看到的是:
如何使堆栈跟踪转储所有堆栈跟踪。
android - 如何正确地将“带寄存器的动态 ftrace”支持移植到 Pixel 3a ARM64 内核?
我目前正在努力集成 ARM64 ftrace 补丁,以实现对“带寄存器的动态 ftrace”的全面支持。具体来说,我正在为 Pixel 3a (sargo) 开发 4.9.200 内核版本,我所指的补丁如下:
- https://patchwork.kernel.org/patch/9275617/ <- 基于 4.8.x 内核版本
- https://patchwork.kernel.org/patch/10657431/ <- 基于 4.20.x 内核版本
上述补丁需要支持'-fpatchable-function-entry=2' GCC 8.x 编译选项,我将支持集成到 GCC 9.1 以构建内核的原因。使用此选项编译内核会在每个可跟踪函数的序言中正确插入 2 条 ARM64 NOP 指令。
问题是使用移植的“带寄存器的动态 ftrace”补丁(4.8.x 和 4.20.x 非常相似)编译的内核在从内核态到用户态的转换过程中崩溃,特别是在调用 'do_execve ()' 产生'/init'。崩溃内核中的 ftrace 初始化和整个初始引导序列与正确引导的内核相同(例如,具有“在没有寄存器的情况下启用动态 ftrace”支持的内核)。
详细日志('debug'、'ignore_loglevel'、'initcall_debug' 和增加的日志缓冲区移位)已启用,并且崩溃实际上并未显示失败的原因(例如无效指令执行、无效内存访问)。
已尝试启用完整的 KASAN+KCOV 支持,但由于生成的 LZ4 图像太大而无法由 Pixel 3a 引导加载程序加载,导致“失败(远程:'错误验证收到的 boot.img: Buffer Too Small')" fastboot 错误。可以刷新引导映像,但在崩溃后设备进入引导循环阶段,在该阶段无法从“/sys/fs/pstore”获取日志,因为工作引导映像的新闪存导致崩溃日志刷新.
作为额外的尝试,4.8.x 补丁已移植到 4.9.x 内核,4.20.x 补丁已移植到 HiKey620 板(基于 ARM64)的 4.19.x 内核,从而在两者中都成功启动案例(使用从“master”分支编译的最新 AOSP)并且可以通过内核模块中的 API 使用“带寄存器的动态 ftrace”。在这一点上,我一直想知道 HiKey620 板和 Pixel 3a 的 4.9.x 内核之间可能有什么区别。
我也一直在使用内核选项“CONFIG_DEBUG_RODATA”来禁用只读内存强制(例如这个老问题https://github.com/raspberrypi/linux/issues/2166暗示 ARM 内核在 ftrace 时崩溃启用,结果是只读内存问题);在我的情况下,完整的启动顺序工作正常,所以我排除了它作为可能的原因。
为了确保'/init'(实际上是'/system/bin/init')二进制文件根本不被执行,我在入口点('int main(..) '的'init / main.cpp'文件)并且引导过程显然没有达到那个点,所以这导致我排除了'第一'和'第二'初始化用户级阶段的设置功能的问题。
以下链接指向崩溃内核(带有“带寄存器的动态 ftrace”的 4.9.200)和引导内核(带有“不带寄存器的动态 ftrace”的 4.9.200)的详细日志:
- https://pastebin.com/Y4zR4dyu
Pixel 3a - Crashing Log
- https://pastebin.com/HubM6Cw9
Pixel 3a - Booting Log
调试问题的最佳方法是什么?是否有任何明显的问题导致我失踪?
更新 1
在使用 Clang10 编译内核并启用使用 -Os 编译标志来缩小内核映像大小的“CONFIG_CC_OPTIMIZE_FOR_SIZE”选项后,我设法让 KASAN+KCOV 构建工作。启用“CONFIG_GZIP”会进一步减小大小,使 fastboot 能够正确引导内核而无需闪烁。Clang10 已从源代码编译,现在包含对“-fpatchable-function-entry”选项的完全支持。即使在这种情况下,所获得的崩溃日志也没有暗示任何特定的事情(例如,没有 KASAN 崩溃或警告)。
在寻找类似问题时,我遇到了看起来非常相似的问题,但没有解决方案:https ://unix.stackexchange.com/questions/243515/why-cant-the-kernel-run-init 。
更新 2
静态编译“/system/bin/init”二进制文件可以正确执行 FirstStageMain 函数(其日志与正确启动的内核相同)。现在,崩溃从前面提到的“do_execve()”调用转移到 FirstStageMain 函数真正末尾的“execv()”调用,该函数应该再次执行“/system/bin/init”二进制文件(使用2SI ramdisk SAR 引导逻辑),但使用不同的 argv[1] = "selinux_setup" 参数。
linux - 如何使用 ftrace 捕获所有生成的事件而不会造成任何损失
我目前正在做一些实验,我需要像这样记录在执行正常的stress-ng执行周期期间产生的所有事件/usr/bin/stress-ng -c 80 -t 30 --times --exec 50 --exec-ops 50
,特别是与exec(sched:sched_process_exec
和syscalls:sys_enter_execve
)相关的事件。
不幸的是,在分析跟踪文件时,我得到了一些没有生成任何进程sys_execve
但被 捕获的进程sched_process_exec
,这对我来说毫无意义。
即使没有事件丢失,也会发生这种情况(在跟踪文件中,缓冲区/写入的条目是相同的,并且 trace-cmd 不会警告事件丢失)。
鉴于这种情况,我无法理解为什么会发生这种情况,我能给出的唯一解释是这些事件没有被记录下来。任何帮助,将不胜感激。
这是我得到的跟踪文件的参考示例
为了清楚我所说的,这些行应该是规范:
既产生sys_execve
事件又产生sched_process_exec
事件的过程。
而这个:
sys_execve
这是链接中文件的最后一个,是没有关联事件的过程示例。
额外的问题:我还需要syscalls:sys_enter_fork
使用 fork-ops(或等效的东西)进行压力执行来记录等效的 fork 事件(即),但我无法这样做,无论是从 trace-cmd 还是手动来自 Ftrace。我在互联网上读到在处理分叉进程时有一些特殊情况,但不明白要做什么才能特别记录这个事件。
对此问题的任何帮助也将不胜感激。
linux - 在linux中使用ftrace了解nvme linux驱动
我是 linux 新手。我正在尝试使用 ftrace 来了解 linux nvme 驱动程序代码流。根据 net 中的文章,一旦我的 nvme 设备被挂载,我将发出以下命令来获取跟踪
- cd /sys/内核/调试/跟踪
- cat /dev/nvme0n1 > trace (sudo nvme list 显示 nvme 设备 nvme0n1)
- echo nvme_queue_rq > set_graph_function (当我们发出 IO 时调用来自 nvme 驱动程序的 nvme_queue_rq )
- echo function_graph > current_tracer
- 回声 1 > tracking_on
- nvme write /dev/nvme0n1 -s0 -c63(使用 nvme cli 发出 write cmd)
- 回声 0 > tracking_on
- 猫 /dev/nvme0n1 > 跟踪
- 猫踪迹
但是没有任何东西附加到跟踪文件中。我需要做些什么来确保正确捕获函数调用。有没有其他方法可以捕获 linux nvme 驱动程序的函数调用?
提前致谢
linux-kernel - ftrace:通过GPIO输出
我正在做一些研究,需要在一定的时间跨度内收集所有内核函数调用,例如 60 秒。我正在使用树莓派 4B。我尝试使用函数跟踪器ftrace
并阅读trace_pipe
通过
这种方法似乎太慢了,并且由于缓冲区过满而丢失了太多数据:大约。50-60M 数据点丢失,我只得到大约 3M 数据点。所以这不是一个好的统计数据。
我也尝试使用trace-cmd
:
大约有trace-cmd
20 M 数据点丢失,这要好得多,但仍然不足以建立良好的统计数据。此外,我得到的文件
大约 5-6 Gb,需要几分钟才能写入。我不打算让这个文件更小(我认为这是不可能的)。但我就是不能等这么久。我还担心保存如此大的跟踪文件会给系统带来过多的开销。是这样吗?
我想知道,是否可以将 trace_pipe(或其他跟踪文件)的输出定向到某个 I/O 引脚,以便我可以将一些逻辑分析仪连接到该引脚并通过其他一些读取数据流设备?这样就不需要将跟踪文件保存在树莓本身上。我也希望我可以减少丢失的数据量。