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