c - 如何阅读、理解、分析和调试 Linux 内核 panic ?

标签 c linux debugging linux-kernel panic

考虑以下 Linux 内核转储堆栈跟踪;例如,您可以通过调用 panic("debugging a Linux kernel panic");:

从内核源代码触发 panic
[<001360ac>] (unwind_backtrace+0x0/0xf8) from [<00147b7c>] (warn_slowpath_common+0x50/0x60)
[<00147b7c>] (warn_slowpath_common+0x50/0x60) from [<00147c40>] (warn_slowpath_null+0x1c/0x24)
[<00147c40>] (warn_slowpath_null+0x1c/0x24) from [<0014de44>] (local_bh_enable_ip+0xa0/0xac)
[<0014de44>] (local_bh_enable_ip+0xa0/0xac) from [<0019594c>] (bdi_register+0xec/0x150)
  • unwind_backtrace+0x0/0xf8+0x0/0xf8代表什么?
  • 如何查看unwind_backtrace+0x0/0xf8的C代码?
  • 如何解读 panic 的内容?

最佳答案

这只是一个普通的回溯,那些函数以相反的顺序调用(第一个被调用的被前一个调用,依此类推):

unwind_backtrace+0x0/0xf8
warn_slowpath_common+0x50/0x60
warn_slowpath_null+0x1c/0x24
ocal_bh_enable_ip+0xa0/0xac
bdi_register+0xec/0x150

bdi_register+0xec/0x150 是符号 + 偏移量/长度,Understanding a Kernel Oops 中有更多信息以及如何调试内核 oops。在 Debugging the Kernel 上还有这个出色的教程

注意:正如 Eugene 下面的建议,您可能想尝试 addr2line首先,它仍然需要一个带有调试符号的图像,例如

addr2line -e vmlinux_with_debug_info 0019594c(+offset)

关于c - 如何阅读、理解、分析和调试 Linux 内核 panic ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468286/

相关文章:

c - 使用时间函数时出现段错误(核心转储)错误

java - 关闭日志文件

c - libc 检测到 *** ./textfileread.exe : realloc(): invalid next size: 0x08643008

visual-studio - 如何在不停止进程的情况下停止调试(或分离进程)?

C 为什么变量没有被使用?

c - 仅在树莓派上使用 libxml2 访问 xmlNode 时出现段错误

c - while 循环(和 for 循环)出现 scanf 错误,永远扫描

linux - 在管道之后无法在源脚本中更改 bash 变量?

java - 获取局部变量

c - 如何打印所有奇数?