考虑以下 Linux 内核转储堆栈跟踪;例如,您可以通过调用 panic("debugging a Linux kernel 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 代码? - 如何解读恐慌的内容?
原文由 0x90 发布,翻译遵循 CC BY-SA 4.0 许可协议
这只是一个普通的回溯,这些函数以相反的顺序调用(第一个调用被前一个调用,依此类推):
bdi_register+0xec/0x150
是符号 + 偏移量/长度,在 Understanding a Kernel Oops 以及如何调试内核oops 中有更多信息。还有这个关于 调试内核 的优秀教程注意:正如 Eugene 下面的建议,您可能想先尝试 addr2line ,但它仍然需要带有调试符号的图像,例如
addr2line -e vmlinux_with_debug_info 0019594c(+offset)