为什么 "echo l > /proc/sysrq-trigger" 调用跟踪输出总是相似?
Why is "echo l > /proc/sysrq-trigger" call trace output always similar?
根据 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
and CPU #1 backtrace 显示它处于 IDLE 状态(通过 cpuidle_enter_state()
函数判断):
cpuidle_enter_state+0x40/0xc0
cpu_startup_entry+0x2f8/0x400
start_secondary+0x20f/0x2d0
尝试非常密集地加载您的系统,然后执行您的 sysrq 命令以获取新的回溯。您会看到一个 CPU 正在执行您的 sysrq 命令,第二个 CPU 不再处于空闲状态,而是在执行一些实际工作。
用户-space 回溯
至于 user-space 在内核回溯上的函数:尽管 system call is executing (in kernel space) on behalf of user-space process (see Comm: bash
in your backtrace for CPU0), it's not possible to print user-space process backtrace using standard kernel backtrace mechanism (which implemented in dump_stack() 函数)。问题是 内核堆栈 不包含任何用户-space 进程调用(这就是为什么您只能在回溯中看到内核函数)。
User-space 进程调用可以在相应进程的 user-space 堆栈中找到。为此,我建议您使用 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
根据 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
and CPU #1 backtrace 显示它处于 IDLE 状态(通过 cpuidle_enter_state()
函数判断):
cpuidle_enter_state+0x40/0xc0
cpu_startup_entry+0x2f8/0x400
start_secondary+0x20f/0x2d0
尝试非常密集地加载您的系统,然后执行您的 sysrq 命令以获取新的回溯。您会看到一个 CPU 正在执行您的 sysrq 命令,第二个 CPU 不再处于空闲状态,而是在执行一些实际工作。
用户-space 回溯
至于 user-space 在内核回溯上的函数:尽管 system call is executing (in kernel space) on behalf of user-space process (see Comm: bash
in your backtrace for CPU0), it's not possible to print user-space process backtrace using standard kernel backtrace mechanism (which implemented in dump_stack() 函数)。问题是 内核堆栈 不包含任何用户-space 进程调用(这就是为什么您只能在回溯中看到内核函数)。
User-space 进程调用可以在相应进程的 user-space 堆栈中找到。为此,我建议您使用 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