我在gdb中使用python特有的命令时遇到了一个问题,我已经得到了python的一般支持,包括:
(gdb) python print(True)
True
我已经安装了标准脚本:
$ ls /usr/share/gdb/python/gdb/
command FrameDecorator.py FrameIterator.py frames.py function __init__.py printer printing.py prompt.py __pycache__ types.py unwinder.py xmethod.py
我确保加载已启用所有路径,我可以:
$ cat ~/.gdbinit
add-auto-load-safe-path /usr/share/gdb/python/gdb/
add-auto-load-safe-path /usr/share/gdb/python/
add-auto-load-safe-path /usr/share/gdb/
set auto-load python-scripts on
但出于某种原因,广发银行仍然不喜欢这样:
(gdb) info auto-load
gdb-scripts: No auto-load scripts.
guile-scripts: No auto-load scripts.
libthread-db: No auto-loaded libthread-db.
local-gdbinit: Local .gdbinit file was not found.
python-scripts: No auto-load scripts.
我希望在加载gdb
后让py-bt
命令正常工作。
3条答案
按热度按时间yks3o0rb1#
py-bt
和相关命令通常在GDB脚本文件python*-gdb.py
中定义,而python*-gdb.py
通常出现在/usr/share/gdb/auto-load/usr/bin/
中。如果在调试Python对象文件时这些命令在GDB中不可用,则意味着包含它们的脚本没有自动加载。要找出原因,请启用
auto-load
调试:并尝试加载Python可执行文件:
您应看到类似以下内容的输出:
GDB查找
auto-load
脚本的规则如下所述:https://sourceware.org/gdb/current/onlinedocs/gdb/Auto_002dloading-extensions.html
在简化的形式中,它在遵循符号链接之后获取加载的目标文件的绝对文件路径,向其附加
-gdb.(gdb|py|scm)
扩展名,并尝试查找路径以auto-load
scripts-directory
目录之一开始并以构造的脚本名称结束的文件。如果找不到这样的脚本,检查哪些脚本在您的系统上是可用的。可能您正在调试
python3
可执行文件,它是python3.6
的符号链接,而您系统的GDB安装可能只提供python3.5
可执行文件的GDB脚本。由于脚本名的构造方式,可执行文件的名称实际上很重要。另外,检查GDB是否使用了适当的脚本目录:
并在必要时更新它们。当加载启用了
auto-load
调试的目标文件时,以下行:显示
scripts-directory
的展开值。最后,检查
auto-load
安全路径的值:并且如果必要的话还更新它。
顺便说一句,在
~/.gdbinit
文件中可能不需要任何额外的add-auto-load-scripts-directory
或add-auto-load-safe-path
命令,因为默认的auto-load
脚本目录和安全路径通常包括$datadir/auto-load
,它通常扩展到/usr/share/gdb/auto-load
,这通常是系统范围的GDB脚本的默认位置,在那里最有可能找到usr/bin/python*-gdb.py
文件。drkbr07n2#
如果自动加载失败,请使用source命令显式加载相关脚本。例如:
9nvpjoqh3#
在Debian 11上也有同样的问题。使用
我发现gdb试图在/usr/share/gdb/auto-load/usr/bin中查找python3.9d-gdb.py,但实际文件名是python3.9m-gdb.py。修复方法是添加另一个链接: