python - 调试在 lldb 中运行的 Python 脚本
问题描述
我想从 lldb (gdb) 扩展 python 脚本向 neovim 实例发送命令。虽然这对 gdb 没有问题,但我在 lldb 中得到了一个 python 异常。
最小的例子:
(gdb) source test.py #works
(lldb) command script import test.py #raises an exception
测试.py
import pynvim
pynvim.attach('socket', path='/tmp/nvimsocket')
例外:
error: module importing failed: signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object
File "temp.py", line 1, in <module>
File "/opt/repos/nvim/test.py", line 5, in <module>
pynvim.attach('socket', path='/tmp/nvimsocket2')
File "/usr/lib/python3.8/site-packages/pynvim/__init__.py", line 122, in attach
return Nvim.from_session(session).with_decode(decode)
File "/usr/lib/python3.8/site-packages/pynvim/api/nvim.py", line 80, in from_session
channel_id, metadata = session.request(b'nvim_get_api_info')
File "/usr/lib/python3.8/site-packages/pynvim/msgpack_rpc/session.py", line 95, in request
v = self._blocking_request(method, args)
File "/usr/lib/python3.8/site-packages/pynvim/msgpack_rpc/session.py", line 174, in _blocking_request
self._async_session.run(self._enqueue_request,
File "/usr/lib/python3.8/site-packages/pynvim/msgpack_rpc/async_session.py", line 66, in run
self._msgpack_stream.run(self._on_message)
File "/usr/lib/python3.8/site-packages/pynvim/msgpack_rpc/msgpack_stream.py", line 43, in run
self.loop.run(self._on_data)
File "/usr/lib/python3.8/site-packages/pynvim/msgpack_rpc/event_loop/base.py", line 148, in run
signal.signal(signal.SIGINT, default_int_handler)
File "/usr/lib/python3.8/signal.py", line 47, in signal
handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
这似乎是信号模块的问题,也会影响其他项目: https ://github.com/python/asyncio/issues/396
可以调试在 lldb 内的虚拟 python 环境中运行的 python 脚本吗?
编辑:
如果我尝试导入 pdb 并设置断点
pdb.set_trace()
(没有 nvim 的东西)这个异常上升:
error: module importing failed: Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/home/test/python_debug/test.py", line 8, in <module>
a()
File "/home/test/python_debug/test.py", line 5, in a
pdb.set_trace()
File "/usr/lib/python3.8/pdb.py", line 1609, in set_trace
pdb = Pdb()
File "/usr/lib/python3.8/pdb.py", line 158, in __init__
readline.set_completer_delims(' \t\n`@#$%^&*()=+[{]}\\|;:\'",<>?')
AttributeError: module 'lldb_editline' has no attribute 'set_completer_delims'
我从源代码构建了 lldb,有两个标志:
LLDB_ENABLE_LIBEDIT
LLDB_ENABLE_CURSES
https://lldb.llvm.org/resources/build.html libedit 已安装,如何验证它是否已激活?有没有类似 lldb --build-flags 的东西?
解决方案
您可以使用 Python 的 pdb 模块在 test.py 中插入跟踪点,lldb 将在 pdb shell 中停止并允许您单步执行代码。例如:
> lldb
(lldb) platform shell cat /tmp/test.py
print("About to break")
import pdb
pdb.set_trace()
print("Back from break.")
(lldb) command script impo /tmp/test.py
About to break
> /tmp/test.py(4)<module>()
-> print("Back from break.")
(Pdb) n
Back from break.
--Return--
> /tmp/test.py(4)<module>()->None
-> print("Back from break.")
(Pdb) c
(lldb)
推荐阅读
- firebase - 为什么 Firebase 需要 Google 密钥才能登录?
- r - 如何调整 Shiny 中生成的图形的图例
- c++ - 运行“make -j”时的构建问题-“je_malloc”属性指令被忽略
- curl - ubuntu 20.10 上的 curl 损坏 curl_url_set 未定义
- reactjs - 如何在 grpc-web 中使用 TLS?
- reactjs - 上传带有图片的表单formik
- javascript - 未找到 lambda 层的模块(AWS、JavaScript)
- excel - 在 Excel 中如何防止用户在 Excel 的单元格“A1”中留下空白单元格?
- asp.net-core - ASP.NET Core - SAML2 ITFoxtec - 两个 IDP/元数据
- reactjs - 如何在reactjs中显示图像?