Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调试在lldb中运行的Python脚本_Python_Debugging_Gdb_Lldb_Pdb - Fatal编程技术网

调试在lldb中运行的Python脚本

调试在lldb中运行的Python脚本,python,debugging,gdb,lldb,pdb,Python,Debugging,Gdb,Lldb,Pdb,我想从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:

我想从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))
(没有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'
libedit已安装,如何验证它是否已激活?
是否有类似lldb——构建标志的东西?

您可以使用Python的pdb模块在测试中插入跟踪点。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)
>lldb
(lldb)平台外壳cat/tmp/test.py
打印(“即将中断”)
导入pdb
pdb.set_trace()
打印(“从中断处返回”)
(lldb)命令脚本impo/tmp/test.py
即将破裂
>/tmp/test.py(4)()
->打印(“从中断处返回”)
(Pdb)n
休息后回来。
--返回--
>/tmp/test.py(4)(->无
->打印(“从中断处返回”)
(Pdb)c
(lldb)

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

导入信号
从信号导入默认\u int\u处理程序
上一个\u处理程序=signal.getsignal(signal.SIGINT)
signal.signal(signal.SIGINT,默认处理程序)
导入pynvim
附加('socket',path='/tmp/nvimsocket')

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

这也适用于数据格式化程序和断点命令等。或者至少适用于我尝试过的所有情况。不幸的是,当它点击set\u trace():AttributeError:模块“lldb\u editline”没有属性“set\u completer\u delims”时,我会收到另一个异常。也许这与pdb的promt有关,它与lldb的promt不兼容?您的lldb是否已启用lldb_ENABLE_LIBEDIT/我如何检查我的lldb是否已激活此标志?奇怪,我从未见过。如果没有lib edit,我不会构建lldb。您可以通过实验判断:如果您没有lib编辑,那么制表符完成将不会起任何作用。你能在正式版本中也尝试一下吗:如果你在macOS上,可以从Xcode中尝试,如果你在那里工作,可以从Linux的一个版本中尝试?看看这是关于您的构建还是关于您平台的libedit会很有趣吗?在任何情况下,这似乎都是一个bug()。我在arch上,从repo中尝试了lldb,也从源代码中编译了它。libedit已启用。我现在就和拉斯潘试试。
LLDB_ENABLE_LIBEDIT
LLDB_ENABLE_CURSES
 > 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)