Как использовать расширение отладки gdb python внутри 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)

Итак, я создавал virtualenv с помощью пакета binary python2.7-dbg (так как некоторые библиотеки нуждаются в перекомпиляции), используя эту командную строку:

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

Все работает отлично, но когда я использую gdb внутри virtualenv, по крайней мере, прекрасные принтеры 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)

Я что-то пропустил в своем виртуальном пространстве?

Ответ 1

Я решил проблему, используя strace on gdb, grepping "open" syscalls.

Кажется, что 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 (...).

После этого все работает.

Ответ 2

Ответ на @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 etc.

Ответ 3

В 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