How to use gdb python debugging extension inside virtualenv
Asked Answered
I

4

20

I'm running ubuntu, and installed the python-dbg package. When trying to use the installed version directly everything works great:

$ 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)

So, I've been building a virtualenv using the package's binary python2.7-dbg (since some libraries need recompiling), using this command line:

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

Its all working fine, but when I'm using gdb inside the virtualenv, atleast the python pretty printers stop working:

~$ . 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)

Am I missing something within my virtualenv?

Inamorata answered 8/4, 2014 at 8:37 Comment(0)
I
11

I've solved the problem by using strace on gdb, grepping the "open" syscalls.

It seems that gdb makes a search for python-gdb.py in several paths it guesses (according to the python binary), and whenever the file is not found it just fails silently.

Eventually the way to solve the problem is to link /usr/lib/debug/usr/bin/python2.7-gdb.py into the env's bin directory. The name of the link should be <python binary name>-gdb.py, being in my case python2.7-dbg-gdb.py (...).

After that, everything seems to work.

Inamorata answered 10/4, 2014 at 14:53 Comment(1)
I had to put a line in my .gdbinit file as well: add-auto-load-safe-path /opt/hass-dbg/bin/python3-dbg-gdb.pyDowson
R
7

@itai's answer only partially worked for me on Ubuntu Trusty (14.04). I found a couple of other things worked better:

sudo apt-get install python2.7-dbg

then, in the 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 ...

This helped gdb find the python debugging symbols as well as the py-bt etc commands.

Robet answered 25/5, 2015 at 1:13 Comment(2)
I found (under ubuntu 14.04) it is important that the file under .debug is python2.7. I tried it with python (w/o 2.7) since virtualenv's bin/python2.7 points to bin/python, but that didn't seem to work. (Which is what this answer says! But I outsmarted myself.)Renoir
ln -sf /usr/lib/debug/usr/bin/ /my/virtualenv/bin/.debug works tooBardo
N
2

In Debian 11 with Python 3.7, gdb debugging works out of the box inside virtualenv.

Make sure that you created the venv with the same Python3 version than the python3-dbg package version installed.

In case symbols don't load correctly, rebuild the venv from scratch and try again.

Noblewoman answered 16/9, 2019 at 11:52 Comment(1)
On Ubuntu 22.04.1, it was sufficient to apt install python3-dbg and python3-dbg -m venv ./env-name.Sugihara
R
0

On Ubuntu 12.04, @craigds's answer was very helpful but didn't get me quite all the way there: I was still running into:

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

Fixed that, then I ran into:

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

So the full steps for me to fix up my virtualenv were:

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
Replica answered 30/7, 2015 at 12:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.