Linux 内核调试:尝试在 gdb 中使用帮助程序脚本时"Python Exception <class 'gdb.error'> There is no member named



我一直在按照本指南使用 gdb 和 VMWare 设置一个 Linux 内核调试环境。 一切都进行得很顺利,直到那部分:

将 GDB 连接到调试对象
我们还无法从加载的内核模块中看到符号。我们将加载帮助程序脚本,然后运行 lx 符号,这将探测加载的模块并适当地配置 GDB:
(gdb) source home/alambert/kernel/source/linux-4.13.0/debian/build/build-generic/vmlinux-gdb.py
(gdb) lx-symbols

在我的系统上运行它时,我收到以下python错误:
pwndbg> source /home/user/kernel/source/linux-4.4.0/debian/build/build-generic/vmlinux-gdb.py pwndbg> lx-symbols loading vmlinux Python Exception <class 'gdb.error'> There is no member named module_core.: Error occurred in Python command: There is no member named module_core.


我的设置

调试器和调试对象计算机都是虚拟机,调试对象是 Ubuntu 16.04,调试器是 Ubuntu 18.04。

调试对象:
$ cat /proc/version Linux version 4.4.0-134-generic (buildd@lgw01-amd64-033) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #160-Ubuntu SMP Wed Aug 15 14:58:00 UTC 2018

调试器:
$ cat /proc/version Linux version 4.15.0-34-generic (buildd@lgw01-amd64-047) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #37-Ubuntu SMP Mon Aug 27 15:21:48 UTC 2018 $ gdb --version GNU gdb (GDB) 8.2 Copyright (C) 2018 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. $ python -V Python 2.7.15rc1


我最初认为这是一个 python3/2 兼容性问题,所以我用 python 2.7 重新编译了 gdb,但得到了完全相同的错误。

我还验证了这不是一个pwndbg问题 - 我用香草 gdb 尝试了这个,效果完全相同。

我已经验证了python帮助程序脚本是在编译调试内核的过程中创建的。我实际上让整个构建过程完成,而不是像指南建议的那样在创建脚本后停止它 - 只是为了确保所有脚本都到位。

我尝试在线查找错误,但似乎没有任何提及。

有人遇到过这个问题吗?

在对脚本和 Linux 内核的来源进行一些挖掘后,我设法解决了这个问题。

问题在于此提交,它将module_core指针替换为include/linux/module.h标头中的module_layout结构。该更改显然已拉入内核 4.4.0,但直到更高版本才在帮助程序脚本中考虑。

这在一段时间后得到了处理(特别是 - 在此提交中(,因此 4.4.0 和 4.6-rc1 之间的所有内核版本都会有此错误。

解决方案是从上述提交中下载脚本并将它们放在相关目录中。

这当然是一个罕见的边缘情况,但我希望这个答案有一天会对某人有所帮助。

最新更新