【问题标题】:How to use gdb python debugging extension inside virtualenv如何在 virtualenv 中使用 gdb python 调试扩展
【发布时间】:2014-04-08 08:37:34
【问题描述】:

我正在运行 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 中是否缺少某些内容?

【问题讨论】:

    标签: python gdb virtualenv


    【解决方案1】:

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

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

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

    在那之后,一切似乎都正常了。

    【讨论】:

    • 我还必须在我的 .gdbinit 文件中添加一行:add-auto-load-safe-path /opt/hass-dbg/bin/python3-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 等命令。

    【讨论】:

    • 我发现(在 ubuntu 14.04 下).debug 下的文件是python2.7 很重要。由于 virtualenv 的 bin/python2.7 指向 bin/python,所以我尝试使用 python (w/o 2.7),但这似乎不起作用。 (这就是这个答案所说的!但我比自己聪明。)
    • ln -sf /usr/lib/debug/usr/bin/ /my/virtualenv/bin/.debug 也可以
    【解决方案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
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2010-11-04
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-13
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多