我已经在 CentOS 6.5 机器上下载并编译了 Python 3.5。它工作没有问题。问题是我必须使用
gdb
来调试 python 程序执行期间涉及 cpu 过度使用的微妙错误。
从关于 gdb 扩展的官方 Python 文档中,他们说唯一要做的就是添加
add-auto-load-safe-path /path/to/dir/with/python-gdb.py
到
~/.gdbinit
。我用测试过
gdb --args /path/to/python3.5/binary
(gdb) py-bt
但我明白了
Undefined command: "py-bt"
gdb
是版本 7.2 并且启用了 python 支持。
基于博客文章使用 gdb 调试 CPython 进程 解决该问题的另一种方法是获取
python3.5-gdb.py
文件。
运行命令 info auto-load
检查文件是否已加载(如果有)
如果没有 - 手动加载它:
source /usr/share/gdb/auto-load/usr/bin/python3.5-gdb.py
(!路径可能不同)。
然后
py-bt
应该可以工作!
已编辑:更改了 py 版本
找到了!您必须将
/PATH_TO_PYTHON_SRC/Tools/gdb
添加到 PYTHONPATH
,然后在 gdb
中您应该能够执行:
python import libpython
gdb 通过查看以 scripts-directory 搜索路径中的目录为根的目录树,自动加载 gdb CLI(或 Python 或 Scheme)脚本。对于加载的每个可执行文件或共享对象,gdb 都会查找名为
objfile-gdb.gdb
(或 objfile-gdb.py
或 objfile-gdb.scm
)的脚本。
自动加载
python
的 gdb 扩展的一种方法是将下载的 python-gdb.py
文件放置在脚本目录路径中的某个目录下。例如,Ubuntu 上的 python2.7-dbg
软件包会安装这些文件:
-rwxr-xr-x /usr/lib/debug/usr/bin/python2.7-gdb.py
lrwxrwxrwx /usr/lib/debug/usr/lib/libpython2.7.so.1.0-gdb.py -> ../bin/python2.7-gdb.py
这是一个 gdb 会话,显示当我开始调试
python2.7-gdb.py
可执行文件时,如何自动加载 /usr/bin/python
脚本:
(gdb) show auto-load scripts-directory
List of directories from which to load auto-loaded scripts is $debugdir:$datadir/auto-load.
(gdb) set debug auto-load
(gdb) file /usr/bin/python
Reading symbols from /usr/bin/python...Reading symbols from /usr/lib/debug//usr/bin/python2.7...done.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Expanded $-variables to "/usr/lib/debug:/usr/share/gdb/auto-load".
auto-load: Searching 'set auto-load scripts-directory' path "$debugdir:$datadir/auto-load".
auto-load: Attempted file "/usr/share/gdb/auto-load/usr/lib/debug/usr/bin/python2.7-gdb.gdb" does not exist.
auto-load: Attempted file "/usr/lib/debug/usr/bin/python2.7-gdb.py" exists.
auto-load: Loading python script "/usr/lib/debug/usr/bin/python2.7-gdb.py" by extension for objfile "/usr/lib/debug/usr/bin/python2.7".
今天我花了相当多的时间让这个在 CentOS7 上运行。只是想保存/分享我最终如何让它发挥作用:
关注https://wiki.python.org/moin/DebuggingWithGdb。特别是(假设使用的是python3.6,否则最后一个包的名称可能不同):
sudo yum install yum-utils
sudo debuginfo-install glibc
sudo yum install gdb python3-debuginfo
启动
gdb
并将其附加到要调试的进程后运行:
source /usr/lib/debug/usr/lib64/libpython3.6m.so.1.0-3.6.8-18.el7.x86_64.debug-gdb.py
这显然会发生版本更改
可以选择将其添加到自动加载位置,正如其他答案所建议的那样,我没有这样做。
如果使用 Conda 和/或 CentOS 以及比 yum 包管理器可用的 Python 版本更新的 Python 版本,只需构建 python 的副本,
python-gdb.py
将出现在顶部构建文件夹中。然后可以在 gdb 中获取该文件。
$ tar xvf Python-3.8.17.tgz
$ cd Python-3.8.17
$ ./configure
$ make
$ conda activate myenv
$ gdb python -p 12345
(gdb) source ~/Python-3.8.17/python-gdb.py
(gdb) py-list
693
694 def Session_createHelper(parameters, eventHandlerFunc, dispatcher):
695 return _internals.Session_createHelper(parameters, eventHandlerFunc, dispatcher)