内核调试-vmlinux-gdb.py无法在gdb上运行

9fkzdhlc  于 2023-11-17  发布在  Linux
关注(0)|答案(2)|浏览(125)

我正在尝试远程调试一个Linux的内核,我已经创建了一个虚拟机(使用VMware),并使用gdb从我的PC连接到它,一切正常。
问题是gdb无法加载vmlinux-gdb.py脚本。我尝试在gdb上使用source命令添加它,得到以下错误:

Traceback (most recent call last):
  File "~/workspace/kernels/default-kernel/scripts/gdb/vmlinux-gdb.py", line 28, in <module>
ImportError: No module named 'linux'

字符串
目录树:

drwxr-xr-x  2 iofek iofek 4096 Mar 22 19:59 linux
-rwxr-xr-x  1 iofek iofek  577 Mar 22 19:43 Makefile
-rwxrwxr-x  1 iofek iofek    0 Mar 22 19:43 modules.order
-rwxr-xr-x  1 iofek iofek  759 Mar 22 20:00 vmlinux-gdb.py


现在我不明白为什么模块找不到Linux目录。我已经更新了PYTHONPATH,并使用sys.path.append添加了路径。另外,linux下的所有文件都有正确的权限。
有什么想法吗?

a6b3iqyw

a6b3iqyw1#

简短回答

不要使用. linux./scripts/gdb/vmlinux-gdb.py。使用vmlinux-gdb.py文件,该文件位于内核构建输出的根目录中,与vmlinux文件一起使用。
如果此文件不存在,则需要:

Activate CONFIG_GDB_SCRIPTS in your kernel configuration

字符串

长教程

首先确保gdb-scripts将在内核构建期间创建:

make menuconfig
Enable CONFIG_GDB_SCRIPTS
make


然后找出你的内核构建是否使用了一个单独的构建输出文件夹,然后按照以下章节之一(xor)进行操作:

Either:就地构建,不使用构建二进制目录

如果你编译内核时.o和.ko文件混杂在源代码中(这是Ubuntu在wiki.ubuntu.com上推荐的方式),你可以cd到源代码根文件夹中,让我们假设你在文件夹~/gdbenv中构建,从那里启动gdb,然后加载应该是可以开箱即用的:

cd ~/gdbenv
gdb ./vmlinux
(gdb) add-auto-load-safe-path ~/gdbenv
(gdb) source ~/gdbenv/vmlinux-gdb.py

或者:当你构建内核的方式在单独的构建目录中输出二进制文件时

例如,在Yocto构建中,所有的二进制文件最终都在不同的文件夹中,而不是与源文件夹混合在一起。在这种环境中,您需要将所有内容都放在一个环境中(vmlinux,gdb-scripts和可选的内核源代码)。

tar -xf ~/Downloads/linux-blabla.tgz -C ~/gdbenv       (optional)
cp .../build/vmlinux-gdb.py ~/gdbenv
mkdir ~/gdbenv/scripts
cp -r .../build/scripts/gdb ~/gdbenv/scripts
cp .../build/vmlinux ~/gdbenv

Then procede like in the preceeding chapter (cd ~/gdbenv, gdb ./vmlinux ...)

bmvo0sr5

bmvo0sr52#

对于最新的内核,您需要构建gdb脚本:
make scripts_gdb
创建后,将在内核源代码的根目录下创建一个vmlinux-gdb.py的符号链接。然后:
gdb vmlinux
add-auto-load-safe-path根目录内核源
来源vmlinux-gdb.py

相关问题