Linux内核调试:“Python异常 当尝试在gdb中使用帮助程序脚本时,没有名为module_core的成员

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux内核调试:“Python异常 当尝试在gdb中使用帮助程序脚本时,没有名为module_core的成员相关的知识,希望对你有一定的参考价值。

我一直在关注this guide,用gdb和VMWare建立一个Linux内核调试环境。一切都顺利进行,直到那部分:

将GDB连接到调试对象 我们将无法从加载的内核模块中看到符号。我们将加载帮助程序脚本,然后运行lx-symbols,它将探测已加载的模块并适当地配置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.


我的设置

调试器和debugee机器都是VM,debugee是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问题 - 我尝试使用vanilla gdb达到完全相同的效果。

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

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

有没有人遇到过这个问题?

答案

在深入挖掘脚本和linux内核的来源后,我设法解决了这个问题。

问题在于this commitmodule_core标题中的module_layout结构取代了include/linux/module.h指针。这个变化显然被引入内核4.4.0,但直到更高版本才在助手脚本中解释。

这已经过了一段时间(特别是在this commit),所以4.4.0和4.6-rc1之间的所有内核版本都会有这个bug。

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

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

以上是关于Linux内核调试:“Python异常 当尝试在gdb中使用帮助程序脚本时,没有名为module_core的成员的主要内容,如果未能解决你的问题,请参考以下文章

跟踪调试Linux内核的启动过程

Linux内核分析——第十八章 调试

用 kGDB 调试 Linux 内核

利用QEMU+GDB搭建Linux内核调试环境

[架构之路-29]:目标系统 - 系统软件 - Linux OS内核以及内核驱动的调试技术

RK3399平台开发系列讲解(内核调试篇)常用Linux内核调试手段介绍 - 视频介绍