我正在尝试远程调试Linux的内核。我已经创建了一个VM (使用VMware),并使用gdb从我的PC连接到它,一切正常。
问题是gdb无法加载vmlinux-gdb.py脚本。我尝试使用
命令,得到以下错误:
Traceback (most recent call last):
File "~/workspace/kernels/default-kernel/scripts/gdb/vmlinux-gdb.py", line 28, in
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,并使用以下命令添加了路径
..。此外,linux下的所有文件都具有正确的权限。
有什么想法吗?
发布于 2020-04-17 21:30:33
简短回答
切勿使用...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):
任一:在没有构建二进制目录的情况下就地构建
如果你在编译你的内核时,.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脚本和可选的内核源代码)中获取所有内容。
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 ...)
发布于 2021-02-26 17:33:26
对于最新的内核,您需要构建gdb脚本:
:
编写脚本
_
地理数据库
完成后,将在内核源代码的根目录下创建vmlinux-gdb.py的符号链接。然后:
:gdb vmlinux
:add-auto-load-safe-path root-of-kernel-source vmlinux-gdb.py
https://stackoverflow.com/questions/60803129
复制相似问题