调试在lldb中运行的Python脚本

2024-04-30 06:43:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从lldb(gdb)扩展python脚本向neovim实例发送命令。 虽然这在gdb中没有问题,但我在lldb中得到了一个python异常

最简单的例子:

(gdb) source test.py #works
(lldb) command script import test.py #raises an exception

test.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的东西--构建标志


Tags: inpytestsignalsessionlibpackagesusr
2条回答

我今天也有同样的想法!似乎lldb正在更改您的信号处理程序。。。您可能想尝试以下方法:

import signal
from signal import default_int_handler
previous_handler = signal.getsignal(signal.SIGINT)
signal.signal(signal.SIGINT, default_int_handler)    
import pynvim
pynvim.attach('socket', path='/tmp/nvimsocket')

将处理程序还原为正确的值。但是,这可能意味着您的LLDB信号处理程序可能不再工作。由于某些原因,如果您尝试使用以前的_处理程序还原它,它可能无法工作

您可以使用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)

相关问题 更多 >