如何解读Linux内核栈追踪中的各类输出信息?
Linux内核崩溃调用栈解读疑问解答
先看你给出的调用栈示例:
Call Trace: ? show_cpuinfo+0x1/0x3f1 ? seq_read+0x157/0x435 proc_reg_read+0x3e/0x60 __vfs_read+0x1b/0x34 vfs_read+0x99/0x152 ksys_read+0x61/0xd2 __x64_sys_read+0x1a/0x1c do_syscall_64+0x60/0x1cb entry_SYSCALL_64_after_hwframe+0x170/0x0
针对你的疑问逐一解答:
1. +0x61/0xd2这类后缀的含义
- 斜杠前的
+0x61是指令指针相对于函数符号起始地址的偏移量(十六进制),表示触发问题时程序执行到该函数内的这个位置。 - 斜杠后的
0xd2是该函数的总长度(十六进制字节数),可以用来判断当前执行点在函数中的大致位置(比如接近开头、中间还是末尾)。
2. 栈帧前?符号的含义
?表示内核对这个栈帧的回溯结果不可靠,常见原因包括:
- 栈空间被破坏(比如缓冲区溢出覆盖了栈帧数据);
- 该函数编译时没有生成帧指针(如开启了
-fomit-frame-pointer优化),导致回溯无法准确追踪; - 缺少足够的调试符号,无法确认栈帧的正确性。
除了?,偶尔还会看到!符号,它表示栈帧是通过启发式方法回溯得到的,同样存在准确性存疑的情况。没有符号的栈帧则表示内核可以确定该回溯结果是可靠的。
3. 连续出现两组------------[ cut here ]------------分隔块的原因(已解决)
第一组分隔块是由WARN_ON_ONCE()宏打印的警告级调用栈,属于内核的非致命警告;第二组才是系统最终崩溃时触发的致命错误调用栈。
如果需要将这类严重警告直接触发系统崩溃,可以执行以下命令修改内核参数:
sudo /sbin/sysctl kernel.panic_on_warn=1
内容的提问来源于stack exchange,提问作者Grigory Rechistov
相关产品推荐
相关产品推荐

