linux - gdb - 使用物理内存转储文件调试内核

标签 linux debugging gdb crash-dumps

我有一个物理内存转储文件和一个符号文件(vmlinux),我想在gdb中分析转储文件和符号文件的内容。例如,查看物理内存转储时init_task的状态:

(gdb) print &init_task
=> show the address of init_task in physical memory dump file, said 0xc0XXXXXX

(gdb) print ((struct task_struct *) 0xc0XXXXXX)->tasks
=> show the content of init_task.tasks in physical memory dump file)

我刚刚尝试了 gdb 命令“restore”和“target core”,两者都不起作用。 “restore”需要在正在运行的进程上使用,“target core”需要在核心文件(ELF 64位LSB核心文件)中作为输入。

(gdb) restore binary physical-memory-dump-file
You can't do that without a process to debug.

(gdb) target core physical-memory-dump-file
"physical-memory-dump-file" is not a core dump: File format not recognized

有什么想法吗?谢谢。

更新1: 嗨帕万,谢谢你的提醒;由于我在特殊平台上工作,因此在内核因 panic /糟糕而重新启动后,其上的引导加载程序会将完整的物理内存保存到转储文件中。因此,物理内存转储文件将与物理RAM具有相同的大小,并且可以从其第一个字节开始映射到内核中的0xc000:0000。

最佳答案

物理内存转储和核心文件并不完全相同。核心文件只是映射到地址空间的可执行镜像;当内核发生紧急情况时,它应该在内存中的某个位置留下一个 ELF 文件,其中的硬编码地址指向镜像的其他部分。在 GDB 接受它并匹配您拥有的符号之前,您可能必须从内存转储中提取 ELF 镜像(去掉未使用的部分)。

关于linux - gdb - 使用物理内存转储文件调试内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10033221/

相关文章:

c++ - Visual Studio 代码调试 : source and then launch on same shell

c - 如何查看多个用户组?

ajax - 任何脚本语言都可以读取 AJAX/Java 脚本吗? (Linux)

debugging - 较高堆栈帧上的条件断点

arrays - 使用 gdb 时,如何在 Pascal 中打印数组中的部分值

assembly - 切换到 gdb 中的汇编

c++ - 当存在多个相同名称的类型时,在 gdb 中按名称指定正确的类型

linux - Bash - 从数据库值递归重命名文件

linux - Linux 中这是什么调用约定?

Java 未知格式转换异常