- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试创建硬链接(hard link),直接从 Systemtap 嵌入式 C 代码调用 sys_link。基本上,代码如下所示:
function sys_link:long(oldname, newname) %{ /* pure */
int error;
mm_segment_t old_fs;
old_fs = get_fs();
set_fs(get_ds());
error = psys_link(STAP_ARG_oldname, STAP_ARG_newname);
set_fs(old_fs);
STAP_RETURN(error);
%}
sys_link 未由内核导出,因此 psys_link 在初始化时使用 kallsyms_lookup_name() 解析,我可以测试地址是否正确解析。似乎正在调用系统调用,但它永远不会返回。
*我知道从内核空间调用系统调用不是最好的主意,但相信我,我需要这样做 ;) *
另一方面,我做了另一个更简单的测试,调用由内核导出的filp_open,它甚至不是系统调用,它只是一个内核函数,来创建一个同样不成功的文件结果:
function myopen:long(newname) %{ /* pure */
struct file *file;
mm_segment_t old_fs = get_fs();
set_fs(get_ds());
file = filp_open(STAP_ARG_newname, O_WRONLY|O_CREAT, 0644);
set_fs(old_fs);
STAP_RETURN(1);
%}
内核被卡住的任何线索?
更新:系统调用和函数在 syscall.open.return 探测的上下文中调用。正如其中一条评论中所讨论的,Systemtap 返回探测器是使用 kretprobe 实现的......它取代了 trampoline 的函数返回地址......这 AFAIU 意味着系统调用例程已经完成,这应该已经释放了与文件系统本身相关的任何锁,但我可能遗漏了一些东西。
此时调试内核给我以下回溯显然,死锁在 kprobe 锁中。
>>> info threads
Id Target Id Frame
* 1 Thread 1 (CPU#0 [running]) __loop_delay () at arch/arm/lib/delay-loop.S:42
2 Thread 2 (CPU#1 [running]) __loop_delay () at arch/arm/lib/delay-loop.S:42
3 Thread 3 (CPU#2 [running]) __loop_delay () at arch/arm/lib/delay-loop.S:42
4 Thread 4 (CPU#3 [running]) arch_spin_lock (lock=<optimised out>) at ./arch/arm/include/asm/spinlock.h:91
>>> thread 4
[Switching to thread 4 (Thread 4)]
#0 arch_spin_lock (lock=<optimised out>) at ./arch/arm/include/asm/spinlock.h:91
91 wfe();
>>> bt
#0 arch_spin_lock (lock=<optimised out>) at ./arch/arm/include/asm/spinlock.h:91
#1 do_raw_spin_lock_flags (flags=<optimised out>, lock=<optimised out>) at ./include/linux/spinlock.h:155
#2 __raw_spin_lock_irqsave (lock=<optimised out>) at ./include/linux/spinlock_api_smp.h:121
#3 _raw_spin_lock_irqsave (lock=0xc1541f80 <kretprobe_table_locks+2240>) at kernel/locking/spinlock.c:159
#4 0xc0412d18 in kretprobe_table_lock (flags=<optimised out>, hash=<optimised out>) at kernel/kprobes.c:1113
#5 kprobe_flush_task (tk=0xed165b00) at kernel/kprobes.c:1158
#6 0xc03814f8 in finish_task_switch (prev=0xed165b00) at kernel/sched/core.c:2783
#7 0xc0c19c38 in context_switch (cookie=..., next=<optimised out>, prev=<optimised out>, rq=<optimised out>) at kernel/sched/core.c:2902
#8 __schedule (preempt=<optimised out>) at kernel/sched/core.c:3402
#9 0xc0c1a1a4 in schedule () at kernel/sched/core.c:3457
#10 0xc0c1a54c in schedule_preempt_disabled () at kernel/sched/core.c:3490
#11 0xc03a23dc in cpu_idle_loop () at kernel/sched/idle.c:273
#12 cpu_startup_entry (state=<optimised out>) at kernel/sched/idle.c:302
#13 0xc031206c in secondary_start_kernel () at arch/arm/kernel/smp.c:412
#14 0x60301dec in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)
注意:这是一个 ARM 机器回溯,但在 i386 中会出现相同的结果。
最佳答案
Systemtap 探测处理程序通常在原子上下文中运行,这意味着抢占和/或中断被禁用。如果您设法从这样的上下文中调用内核函数,则目标函数最好是类似的“原子”函数,即永远不要获取任何新的锁或 block 。
关于linux - Systemtap - 从内核空间调用系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943718/
好吧,我正尝试在 SDT 标记上探索我自己的应用程序。我写了一个 systemtap 脚本来探测它,但是 systemtap 在第 5 次之前没有显示任何错误,然后在第 5 次(开始运行)之后,它就什
我想访问从 glibc 的“打开”函数返回的数据,例如文件名或文件描述符 我试试 probe process("/lib*/libc.so.*").function("open") { fd =
我想访问从 glibc 的“打开”函数返回的数据,例如文件名或文件描述符 我试试 probe process("/lib*/libc.so.*").function("open") { fd =
以下 systemtap 脚本无法编译: probe process("myexe").function("myFun").return { print("hi mom\n") } 它说: seman
我正在尝试在我的 GT-i9300 上加载一个简单的 Systemtap 模块 我得到了错误 Error inserting module '/sdcard/systemtap/modules/mon
我想知道如何在 systemtap 中添加对用户空间应用程序的支持。当我尝试跟踪任何用户空间程序时,它显示 CONFIG_UTRACE 未设置。 最佳答案 也许您的内核中没有设置 utrace 工具。
我正在尝试执行一个 systemtap 脚本。但是在执行过程中我遇到了以下语义错误。 stap -v -g netfilter.stp Pass 1: parsed user script and 9
我正在尝试找出这些写入我的闪存驱动器的原因。 deathstar> while true > do > dmesg|grep sdc|grep WRITE > sleep 3 > done [1796
我正在考虑使用 SystemTap 来监控生产服务器上的文件系统事件。 如何将数据从 SystemTap 生成的内核模块传输到另一个应用程序?我只看到 printf 作为从 SystemTap 脚本输
我有一个简单的 ST 脚本,它计算每个文件的进程 io 大小: global fds, counts probe syscall.open.return { if ( ( pid()
我想使用 systemtap 来提取我的 linux 生产服务器的详细信息。我的 systemtap 脚本是 global bt; global quit = 0 probe begin {
我想编写一个 SystemTap 脚本,它可以确定探测调用中当前 PID 的实际线程数。此时该数字应与/proc/4711/status 输出中显示的数字相同。 我的第一个方法是计算 kprocess
我正在尝试使用 systemtap 调试内核中的一些代码。我需要在该函数中打印局部变量的值,但看起来 systemtap 只能看到函数参数,而看不到该函数中定义的局部变量。这是我的探测脚本。 prob
我正在尝试创建硬链接(hard link),直接从 Systemtap 嵌入式 C 代码调用 sys_link。基本上,代码如下所示: function sys_link:long(oldname,
我正在寻找一些关于 systemtap 对性能影响的真实信息。我知道静态内核探测记录在他们网站的某处(带有统计信息),但是用户空间探测呢? 我在他们的邮件列表 (http://sourceware.o
我的系统是 Ubuntu,uname -r = 4.15.0-23-generic。我已经为内核安装了调试符号。 我的问题是: I am trying to use socket(AF_PACKET,
我想使用 systemtap 从远程访问中提取我的 linux 生产服务器的详细信息。对此,我有一些疑问: linux生产服务器和linux开发服务器是否有必要使用相同的内核。如果没有,那么如何添加对
我正在尝试运行此脚本,但它显示没有 tcp 连接有什么想法吗?操作系统:centos 6.3 #! /usr/bin/env stap probe begin { printf("%6s %16s
我想用 SystemTap 分析内核模块的缓存行为(#cache 引用、#cache 未命中等)。有一个在线示例脚本,展示了如何使用 SystemTap 读取性能事件和计数器,包括与缓存相关的事件和计
我的目标是分析内核模块中每个函数的执行时间。使用我在网上看到的示例脚本,我想出了以下脚本来满足我的需要。但偶尔我会得到计算延迟的负值。虽然,它们很少发生,但我想这表明我的脚本有问题。谁能帮我解决这个问
我是一名优秀的程序员,十分优秀!