如何指定GDB使用的Python版本?编译关联高版本Python报错
问题场景
- 需要GDB加载依赖高版本Python的调试脚本,例如
~/.gdb/qtprinters.py - 系统自带GDB默认绑定Python 2.7,无法满足高版本Python脚本的运行要求
- 个人主目录下已部署GDB 12.1源码、Anaconda3环境,但编译GDB时无法成功绑定Anaconda自带的高版本Python
- 使用以下命令配置编译绑定Anaconda Python时会执行失败:
./configure --with-python=/home/bob/tools/anaconda3/bin/python3.8 && make
对应报错信息:
configure: error: no usable python found at /home/bob/tools/anaconda3/bin/python
CXXLD gdbreplay
make[1]: *** [Makefile:12137: configure-gdb] Error 1
- 切换为系统默认Python路径配置时,可以正常完成GDB 12.1的编译安装:
./configure --with-python=/usr/bin/python && make
报错原因
- 传入的Python路径为硬编码的
python3.8,GDB的configure脚本会自动在传入路径的同级目录下查找名为python的可执行文件做兼容性校验,未激活Anaconda环境时,Anaconda的bin目录下默认python软链未生效,会直接触发找不到Python的报错 - Anaconda默认环境不一定自带Python开发组件(头文件、链接库),configure脚本做编译依赖校验时找不到对应文件也会判定Python不可用
- 未显式指定Python头文件、链接库路径时,configure脚本可能默认搜索系统路径下的Python依赖,和Anaconda的Python版本不匹配导致校验失败
解决步骤
- 先准备干净的编译依赖环境,不要直接用Anaconda base环境,避免依赖冲突:
# 新建虚拟环境专门用于GDB编译 conda create -n gdb_build python=3.8 python-dev -y # 激活环境 conda activate gdb_build
- 清理之前编译产生的缓存文件:
make distclean
- 执行配置命令,不要硬编码Python路径,通过环境变量显式指定依赖位置:
./configure \ --prefix=$HOME/tools/gdb12.1 \ --with-python=$(which python3.8) \ CPPFLAGS="-I$CONDA_PREFIX/include/python3.8" \ LDFLAGS="-L$CONDA_PREFIX/lib -Wl,-rpath=$CONDA_PREFIX/lib"
加rpath参数是为了让编译好的GDB运行时自动找Anaconda环境的Python库,不需要每次运行前手动配LD_LIBRARY_PATH
如果还是提示找不到可用Python,把--with-python的参数换成对应python-config的路径即可:
./configure \ --prefix=$HOME/tools/gdb12.1 \ --with-python=$(which python3.8-config) \ CPPFLAGS="-I$CONDA_PREFIX/include/python3.8" \ LDFLAGS="-L$CONDA_PREFIX/lib -Wl,-rpath=$CONDA_PREFIX/lib"
- 执行编译安装:
make -j$(nproc) make install
- 验证绑定结果:
$HOME/tools/gdb12.1/bin/gdb -batch -ex "python import sys; print(sys.version)"
输出为3.8.x版本即表示绑定成功,后续即可正常加载依赖高版本Python的GDB调试脚本。
内容的提问来源于stack exchange,提问作者BruceSun
相关产品推荐
相关产品推荐

