繁体   English   中英

如何在virtualenv中使用gdb python调试扩展

[英]How to use gdb python debugging extension inside virtualenv

我正在运行 ubuntu,并安装了 python-dbg 包。 当尝试直接使用已安装的版本时,一切正常:

$ gdb python2.7-dbg
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
---x snipped x---
Reading symbols from /usr/bin/python2.7-dbg...done.
(gdb) r
Starting program: /usr/bin/python2.7-dbg
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Python 2.7.3 (default, Feb 27 2014, 19:39:25)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Program received signal SIGINT, Interrupt.
0x00007ffff6997743 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
82      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) py-bt (<--- works, just has nothing to do)
(gdb)

所以,我一直在使用包的二进制python2.7-dbg构建一个 virtualenv(因为一些库需要重新编译),使用这个命令行:

~$ virtualenv ved -p /usr/bin/python2.7-dbg

一切正常,但是当我在 virtualenv 中使用 gdb 时,至少 python 漂亮的打印机停止工作:

~$ . ved/bin/activate
(ved)~$ gdb python
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2012.04
---x snipped x---
Reading symbols from /home/itai/ved/bin/python...done.
(gdb) r
Starting program: /home/itai/ved/bin/python
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Python 2.7.3 (default, Feb 27 2014, 19:39:25)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
Program received signal SIGINT, Interrupt.
0x00007ffff6997743 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
82      ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) py-bt
Undefined command: "py-bt".  Try "help". (<---- PROBLEM)
(gdb)

我在我的 virtualenv 中遗漏了什么吗?

我已经通过在gdb上使用strace解决了这个问题,轻击了“open”系统调用。

似乎gdb在它猜测的几个路径中搜索python-gdb.py(根据python二进制文件),并且每当找不到文件时它就会无声地失败。

最终解决问题的方法是将/usr/lib/debug/usr/bin/python2.7-gdb.py链接到env的bin目录中。 链接的名称应该是<python binary name>-gdb.py ,在我的例子中是python2.7-dbg-gdb.py (...)。

在那之后,一切似乎都有效。

@ itai的答案在Ubuntu Trusty(14.04)上仅部分适用于我。 我发现其他几件事情做得更好:

sudo apt-get install python2.7-dbg

然后,在virtualenv:

. bin/activate
mkdir bin/.debug
ln -s /usr/lib/debug/usr/bin/python2.7-gdb.py bin/.debug/python-gdb.py
ln -s /usr/lib/debug/usr/bin/python2.7 bin/.debug/

gdb --args bin/python2.7 ...

这有助于gdb找到python调试符号以及py-bt等命令。

在Ubuntu 12.04上,@ craigds的答案非常有帮助,但并没有让我一路走到那里:我还在遇到:

IOError: invalid Python installation: unable to open /path/to/venv/lib/python2.7/config_d/Makefile (No such file or directory)

修正了,然后我遇到了:

IOError: invalid Python installation: unable to open /path/to/venv/local/include/python2.7_d/pyconfig.h (No such file or directory)

因此,我修复我的virtualenv的全部步骤是:

source /path/to/venv/bin/activate
mkdir /path/to/venv/bin/.debug
ln -s /usr/lib/debug/usr/bin/python2.7-gdb.py /path/to/venv/bin/.debug/python-gdb.py
ln -s /usr/lib/debug/usr/bin/python2.7 /path/to/venv/bin/.debug/
ln -s /usr/lib/python2.7/config_d/ /path/to/venv/lib/python2.7/config_d
ln -s /usr/include/python2.7_d/ /path/to/venv/local/include/python2.7_d
ln -s /usr/lib/debug/usr/bin/python2.7-gdb.py /path/to/venv/bin/python-gdb.py

在带有 Python 3.7 的 Debian 11 中,gdb 调试在 virtualenv 中开箱即用。

确保您创建的 venv 使用与安装的python3-dbg包版本相同的 Python3 版本。

如果符号未正确加载,请从头开始重建 venv 并重试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM