为什么“echo l> / proc / sysrq-trigger”调用跟踪输出始终类似?

时间:2015-05-05 17:39:15

标签: linux linux-kernel call backtrace sysctl

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

1 个答案:

答案 0 :(得分:4)

相同的回溯解释

在您的情况下,您的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不再处于IDLE状态,而是执行一些实际工作。

用户空间回溯

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

用户空间进程调用可以在相应进程的用户空间堆栈中找到。为此,我建议您使用OProfile profiler。当然,它只会给你一个二进制堆栈。为了获得实际的函数名称,您需要向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