源码编译GDB12.1后Python导入gdb报No module named _gdb错误
_gdb模块缺失报错的原因与模块来源说明 _gdb模块的来源
_gdb是GDB程序编译时直接内嵌在GDB二进制文件中的C扩展模块,不存在独立的安装包,也不会以单独的.so/.py文件形式存放在系统Python的第三方库目录中。
报错的核心诱因
- 之前的操作搞错了代码的运行环境:GDB的Python API(包括需要用到的pretty print功能),只能运行在GDB程序自身内嵌的Python解释器中,不能直接在手动启动的系统Python 2.7解释器里运行。
- 手动给系统Python的
sys.path添加/usr/share/gdb/python路径,只能找到GDB Python模块的纯Python上层实现(也就是gdb/__init__.py这类文件),但这部分代码强依赖底层C实现的_gdb模块。这个模块只有GDB程序启动时才会被注册到内嵌解释器的模块列表里,外部启动的系统Python根本访问不到,自然会抛出ImportError。
写入~/.gdbinit生效的原理
~/.gdbinit是GDB启动阶段自动加载执行的配置文件,写在这个文件里的Python代码,运行上下文就是GDB内嵌的Python解释器:此时GDB已经完成初始化,_gdb模块已经加载完毕,GDB也会自动把自身的Python库路径加入内嵌解释器的sys.path,不需要手动添加/usr/share/gdb/python路径,直接注册libstdcxx的pretty printer就能正常生效。- 之前的推测是正确的:必须先启动GDB程序,才会有可用的
_gdb模块,不存在“启动GDB后生成独立模块文件”的过程,这个模块从始至终都编译在GDB的二进制程序内部。
补充说明:编译GDB时传入的
--with-python=/usr/bin/python参数,作用是指定GDB内嵌解释器要对接的系统Python版本,用来保证Python ABI、标准库路径匹配,不是把gdb模块安装到外部系统Python环境里供外部脚本调用。
内容的提问来源于stack exchange,提问作者Clay4megtr
相关产品推荐
相关产品推荐

