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

如何在virtualenv中使用gdb python调试扩展,python,gdb,virtualenv,Python,Gdb,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 [T

我正在运行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)
一切正常,但当我在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)
~$。ved/bin/activate
(ved)~$gdb python
GNU gdb(Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1)7.4-2012.04
---x剪掉了x---
从/home/itai/ved/bin/python读取符号…完成。
(gdb)r
启动程序:/home/itai/ved/bin/python
[已启用使用libthread_db的线程调试]
使用主机libthread_db library“/lib/x86_64-linux-gnu/libthread_db.so.1”。
Python 2.7.3(默认,2014年2月27日,19:39:25)
[GCC 4.6.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>
程序收到信号SIGINT,中断。
0x00007FF6997743在../sysdeps/unix/syscall template.S:82处选择nocancel()
82../sysdeps/unix/syscall template.S:没有这样的文件或目录。
(gdb)py bt

未定义的命令:“py-bt”。试试“帮助”。(我通过在gdb上使用strace解决了这个问题,将“open”系统调用变灰

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

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


在那之后,一切似乎都起了作用。

@itai的答案在Ubuntu Trusty(14.04)上对我只起了部分作用。我发现其他一些东西效果更好:

sudo apt get安装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

在使用Python3.7的Debian11中,gdb调试在virtualenv中开箱即用

确保创建的venv与安装的
python3dbg
软件包版本相同


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

我发现(在ubuntu 14.04下)
.debug
下的文件必须是
python2.7
。我用
python
进行了尝试(w/o 2.7)由于virtualenv的
bin/python2.7
指向
bin/python
,但这似乎不起作用(这就是答案!但我比自己聪明多了)
ln-sf/usr/lib/debug/usr/bin//my/virtualenv/bin/.debug
工作正常,我不得不在.gdbinit文件中添加一行:
添加自动加载安全路径/opt/hass dbg/bin/python3 dbg gdb.py
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