linux-kernel - 使用 GDB vmlinux /proc/kcore 读取内存
问题描述
我正在尝试使用 gdb 从 vmlinux 读取内存。确切的语法是
sudo gdb vmlinux-4.18.0-rc1+ /proc/kcore
我使用这个文件是因为 vmlinux 是这个文件的符号链接。结果如下
Reading symbols from vmlinux-4.18.0-rc1+...(no debugging symbols found)...done.
warning: core file may not match specified executable file.
[New process 1]
Core was generated by `root=/dev/mapper/rcs--power9--talos--vg-root ro console=hvc0 quiet'.
#0 0x0000000000000000 in ?? ()
(gdb) x/4xb 0xfffffff0
0xfffffff0: Cannot access memory at address 0xfffffff0
(gdb) print &sys_call_table
No symbol table is loaded. Use the "file" command.
(gdb)
文件 vmlinux-4.18.0-rc1+ 位于 /boot。文件类型如下:
root@rcs-power9-talos:/boot# 文件 vmlinux-4.18.0-rc1+ vmlinux-4.18.0-rc1+:ELF 64 位 LSB 可执行文件,64 位 PowerPC 或 cisco 7500,版本 1 (SYSV),静态链接, BuildID[sha1]=a1c9f3fe22ff5cbf419787657c878c8a07e559b2, 剥离
我修改了 config-4.18.0-rc1+ 文件,使得每个 CONFIG_DEBUG 选项都设置为 yes。然后我重新启动了系统。我的问题是:
- 我是否需要做其他任何事情才能使我对 /boot/config-4.18.0-rc1+ 所做的更改生效?
- 根据 vmlinux-4.18.0-rc1+ 的文件类型,这个文件是否应该可以用于调试?
我没有自己构建内核。它是 Raptor Computer Systems 的定制版本。
解决方案
您修改的 config-* 文件仅供参考 - 所有这些选项都已编译到内核中,因此更改它们不会有任何效果。
但是,您可以通过两个步骤获得所需的任何符号:
查阅 /proc/kallsyms(例如 grep sys_call_table /proc/kallsyms)。获取地址。请注意,这可能显示为 0x00000000 - 可以通过将 /proc/sys/kernel/kptr_restrict 设置为 0 来修复
然后使用上面的地址作为直接参数。您仍然会遇到一些小问题(例如,“打印”不知道它是什么数据类型,但 x/20x 可以工作),但这些可以通过一些 gdb 脚本或提供外部 dwarf 文件来解决。
推荐阅读
- python - Web抓取python:IndexError:列表索引超出范围
- javascript - 为什么 Safari 中没有出现下拉菜单?
- ios - 快速设置初始视图控制器
- javascript - 如何在数据库中保存密码 - Firebase?
- python - 在 IMDB.com 上为搜索栏中的第一个下拉项查找 Xpath 链接
- python - 将 PowerShell Post 命令转换为 Python Post API 调用
- java - 3个快速for循环整数作业题
- python - 如何修复“没有名为 cv2 的模块”?
- r - R 中不推荐使用 append_data(tmaptools 包)
- presto - 如何在当前日期的修复时间和 presto 中的 interver -10days 之间进行搜索