linux - 为什么 "echo l >/proc/sysrq-trigger"调用跟踪输出总是相似的?

标签 linux linux-kernel call backtrace sysctl

根据 the official kernel.org documentation echo l >/proc/sysrq-trigger 应该给我所有 CPU 的当前调用跟踪。但是当我这样做几次并查看 dmesg 之后,调用跟踪看起来完全相似。这是为什么?

最佳答案

同样的回溯解释

在您的情况下,您的 CPU #0 回溯显示它正在执行您的 sysrq 命令(通过 write_sysrq_trigger() 函数判断):

delay_tsc+0x1f/0x70
arch_trigger_all_cpu_backtrace+0x10a/0x140
__handle_sysrq+0xfc/0x160
write_sysrq_trigger+0x2b/0x30
proc_reg_write+0x39/0x70
vfs_write+0xb2/0x1f0
SyS_write+0x42/0xa0
system_call_fast_compare_end+0x10/0x15

CPU #1 回溯显示它处于IDLE 状态(通过cpuidle_enter_state() 函数判断):

cpuidle_enter_state+0x40/0xc0
cpu_startup_entry+0x2f8/0x400
start_secondary+0x20f/0x2d0

尝试非常密集地加载您的系统,然后执行您的 sysrq 命令以获取新的回溯。您会看到一个 CPU 正在执行您的 sysrq 命令,而第二个 CPU 不再处于空闲状态,而是在执行一些实际工作。

用户空间回溯

至于内核回溯上的用户空间函数:虽然 system call正在代表用户空间进程执行(在内核空间中)(请参阅 CPU0 回溯中的 Comm: bash),不可能打印用户空间进程回溯使用标准内核回溯机制(在 dump_stack() 函数中实现)。问题在于内核堆栈 不包含任何用户空间进程调用(这就是为什么您只能在回溯中看到内核函数)。

用户空间进程调用可以在相应进程的用户空间堆栈中找到。为此,我建议您使用 OProfile剖析器。当然,它只会给你一个二进制堆栈。为了获得实际的函数名称,您需要向 gdb 提供符号信息。

详细信息:

[1] kernel stack and user-space stack

[2] how to dump kernel stack in syscall

[3] How to print the userspace stack trace in linux kernelspace

关于linux - 为什么 "echo l >/proc/sysrq-trigger"调用跟踪输出总是相似的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30059696/

相关文章:

linux-kernel - Linux 调度器

linux - 来自内核模块的用户进程的已用堆大小

call - 如何在使用 CallKit 接听电话后保持 iOS 原生通话 UI

linux - 复制大量文件 xargs

c - 在 linux 内核中持有互斥量时 sleep

python - Python 中的类型对象

javascript - JavaScript 中的 call() 函数

linux - 如何在linux中用c++调用 "unlimit"

linux - 如何在 linux 上安装 lua 模块

linux - 连接 Oracle DB sqlplus/as sysdba 的问题(未设置 TWO_TASK)