如何在 python 脚本中导入 lldb

How to import lldb in a python script

根据 LLDB 主页,可以在 python 脚本中导入 LLDB,如下所示:

import lldb

从发布包安装 LLDB 后(在 Lubuntu 15.04 上:sudo apt-get install lldb),出现以下错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/lldb/__init__.py", line 52, in <module>
_lldb = swig_import_helper()
File "/usr/lib/python2.7/dist-packages/lldb/__init__.py", line 44, in swig_import_helper
ImportError: No module named _lldb

这是意料之中的事! LLDB 页面说:

LLDB has a Python scripting capability and supplies its own Python module named lldb. If a script is run inside the command line lldb application, the Python module is made available automatically. However, if a script is to be run by a Python interpreter outside the command line application, the PYTHONPATH environment variable can be used to let the Python interpreter find the lldb module.

The correct path can be obtained by invoking the command line lldb tool with the -P flag:

> export PYTHONPATH=`$llvm/build/Debug+Asserts/bin/lldb -P`

If you used a different build directory or made a release build, you may need to adjust the above to suit your needs.

因此,那些有足够信心自己构建 LLDB 的人得到了明确的说明,而只想使用已发布包的菜鸟则得到了模糊的解释...

有没有人知道 "adjust the above to suit your needs" 对于从发布包安装所有内容的最基本情况的确切含义? lldb -P 报出的路径没有解决问题:

user@user-VirtualBox:~$ lldb -P
/usr/lib/x86_64-linux-gnu/python2.7/site-packages
user@user-VirtualBox:~$ ls /usr/lib/x86_64-linux-gnu/python2.7/site-packages
ls: cannot access /usr/lib/x86_64-linux-gnu/python2.7/site-packages: No such file or directory

lldb -P 显然试图为 /usr/lib/x86_64-linux-gnu/python2.7 python 安装提供 site-packages(正如您所观察到的,它不存在)。

你得到的回溯表明 lldb 被添加到 /usr/lib/python2.7 python 安装(这是它的 __init__.py 执行的地方)。

我会尝试 set/add 到 PYTHONPATH /usr/lib/python2.7/site-packages 目录而不是 lldb -P 结果。

看起来 lldb python 包安装的符号链接被破坏了。如果您查看 /usr/lib/llvm-3.6/lib/python2.7/site-packages/lldb,您会看到三个损坏的 simlinks 引用了不存在的 x86_64-linux-gnu 目录。这为我修复了它(在 Ubuntu 14.04 上测试,而不是 Lubuntu,但我假设问题是相同的):

cd /usr/lib/llvm-3.6/lib/python2.7/site-packages/lldb
sudo ln -sf ../../../liblldb.so.1 _lldb.so
sudo ln -sf ../../../libLLVM-3.6.0.so.1 libLLVM-3.6.0.so.1
sudo ln -sf ../../../libLLVM-3.6.0.so.1 libLLVM-3.6.so.1
export PYTHONPATH='/usr/lib/llvm-3.6/lib/python2.7/site-packages'
vagrant@Ubuntu:~$ python
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import lldb
>>> 

您可以尝试在 lldb-dev 邮件列表上询问这个问题,甚至可以使用 lldb.llvm.org bugzilla 提交错误。 Linux 的 lldb 比 OSX 版本处于更早的开发阶段,Linux 上的大多数用户可能实际上是自己构建它以获得最新的好处,所以没有人注意到这个问题。

https://bugs.launchpad.net/ubuntu/+source/llvm-defaults/+bug/1972855

启动 lldb 会导致以下情况发生:

$ lldb
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'lldb.embedded_interpreter'
(lldb)

这会导致问题,例如 QtCreator,当尝试使用 lldb 调试任何东西时它会停止。

$ lldb -P 给出以下路径:

/usr/lib/local/lib/python3.10/dist-packages

但是,该路径不存在:

$ ls -l /usr/lib/local/lib/python3.10/dist-packages
ls: cannot access '/usr/lib/local/lib/python3.10/dist-packages': No such file or directory

软件包 python3-lldb-14 提供了这条路径,但是:

/usr/lib/llvm-14/lib/python3.10/dist-packages/

创建一个从 /usr/lib/llvm-14/lib/python3.10/dist-packages//usr/lib/local/lib/python3.10/dist-packages 的符号 link 让事情按预期工作:

sudo ln -s /usr/lib/llvm-14/lib/python3.10/dist-packages/lldb /usr/lib/local/lib/python3.10/dist-packages

$ ls -l /usr/lib/local/lib/python3.10/dist-packages && lldb
lrwxrwxrwx 1 root root 45 May 10 15:23 /usr/lib/local/lib/python3.10/dist-packages -> /usr/lib/llvm-14/lib/python3.10/dist-packages
(lldb)