如何更改gdb使用的Python解释器?

38

我使用的是Ubuntu 14.04,其中python3是默认系统包。

我想用gdb来调试Python2.7程序,但遇到了以下问题:

当我在gdb中使用py命令时,它会进入一个解释器,于是我在解释器中运行了以下命令:

首先,我检查了解释器版本:

(gdb) py
>import sys
>print(sys.version)
>end
3.4.0 (default, Apr 11 2014, 13:08:40) 
[GCC 4.8.2]

然后我检查正在使用的解释器可执行文件

(gdb) py
>import sys
>print(sys.executable)
>end
/usr/bin/python
(gdb) 

然后在Bash中,我检查解释器:

12:34]hostname ~ $ls -l /usr/bin/python 
lrwxrwxrwx 1 root root 9 Dec 21  2013 /usr/bin/python -> python2.7

虽然gdb显示正在使用我的2.7解释器,但实际上它使用的是另一个解释器。我需要一个2.7解释器,才能与ubuntu包'python2.7-dbg'提供的python特定扩展一起使用,因为据我所知,目前还没有针对python 3.4的此类软件包,即使有,我想要调试的程序也运行在python 2.7上。
我的问题是如何使其使用我想要的解释器?
[编辑] 顺便说一下,请不要卸载python3。我在ubuntu 14.04上这样做,结果毁掉了我的系统。无法再次启动。我目前正在使用没有窗口管理器的系统(很酷),但你懂的。

2
为什么Python 3是默认版本? - Padraic Cunningham
我猜是因为Ubuntu这么说吧..?我没有深入了解过,但是https://wiki.ubuntu.com/Python/3上说有很多脚本已经移植到了Python 3(虽然不是全部)。无论如何,我的gdb安装(或编译或其他)与python3配合使用。 - vlad-ardelean
相关问题:https://bugs.launchpad.net/ubuntu/+source/gdb/+bug/1241668 - Ciro Santilli OurBigBook.com
3个回答

29
因此,尽管gdb显示它正在使用我的2.7解释器,但实际上并非如此。 GDB并没有这样说。它说它正在使用3.4.0版本,并且该解释器以libpython3.4.alibpython3.4.so的形式链接到GDB中。
由于没有实际的Python二进制文件参与,因此这里的(轻微)错误是sys.executable返回/usr/bin/python。它可能最好改为返回/usr/bin/gdb
如果您需要一个2.7解释器,则必须使用适当的 --with-python 值配置后从源代码重新构建gdb

我能知道我的gdb是如何构建的吗?(我的意思是用了哪些选项?) - Chan Kim
3
要查看已安装的GDB链接到哪个版本的Python库,请尝试运行以下命令:ldd $(which gdb) | grep python - kevinarpe
1
@kevinarpe 你提出的方法只有在gdb动态链接到libpython时才有效。OP使用的方法(print(sys.version))则始终有效。 - Employed Russian
2
疯了...我有一个分发于JetBrains CLion的GDB副本,但我无法通过使用ldd来确定它链接到哪个Python版本,因为它不显示libpython。但是,如果使用JetBrains CLion中的GDB,并运行命令python import sys然后python print(sys.version),我会看到Python解释器是v2而不是v3。 - kevinarpe
1
这个答案据我所知是最好的。但是有几件事情需要提一下;首先给出这个链接http://www.linuxfromscratch.org/blfs/view/svn/general/gdb.html,在这里你可以找到一个逐步构建自定义GDB和源代码的方法。其次,要指出当你构建GDB时,默认情况下它使用对python2的引用,只有在你想使用python3时才需要指定python版本。 希望这可以帮到你。 - Luis Carlos

-1
无需重新构建gdb。
只需以不同的方式调用它:
gdb -ex run --args /usr/bin/python2 test.py

-3
$ apt-get -qq update
$ apt-get install gdb python2.7-dbg python3-all-dbg
$ gdb -ex r -ex quit --args python2 -c "import sys ; print(sys.version)" # Py2.7
$ gdb -ex r -ex quit --args python3 -c "import sys ; print(sys.version)" # Py3.6

2
这只是在gdb中运行两个Python解释器。这与gdb捆绑的Python版本无关。 - Jack Culhane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接