我正在尝试通过SWIG生成的lldb
模块从python脚本启动交互式调试会话。要调试的程序不过是一个空的main
函数。这是我目前的尝试:
import lldb
import sys
import os
debugger = lldb.SBDebugger.Create()
debugger.SetAsync(False)
target = debugger.CreateTargetWithFileAndArch("a.out", "")
# The breakpoint itself works fine:
fileSpec = lldb.SBFileSpecList()
mainBp = target.BreakpointCreateByName("main", 4, fileSpec, fileSpec)
mainBp.SetAutoContinue(False)
# Use the current terminal for IO
stdout = os.ttyname(sys.stdout.fileno())
stdin = os.ttyname(sys.stdin.fileno())
stderr = os.ttyname(sys.stderr.fileno())
flag = lldb.eLaunchFlagNone
target.Launch(target.GetDebugger().GetListener(), [], [], stdin, stdout,
stderr, os.getcwd(), flag, False, lldb.SBError())
在我看来,无论我传递给flag
的{{1}}(在those flags中尝试过),都无法切换到交互式Editline会话。我确实知道python绑定的主要目的是非交互式脚本编写,但是我很好奇是否可以实现这种情况。
答案 0 :(得分:1)
SBDebugger上有一个方法可以执行此操作(RunCommandInterpreter)。这就是Xcode和类似的方法使lldb控制台窗口。但是到目前为止,它仅在C语言中使用过,并且此函数的C ++-> Python绑定存在问题,因此,当您尝试从Python调用它时,您会收到有关第5个参数类型错误的怪异错误。参数是int&
,在运行时会产生SWIG(接口生成器)错误。
当然,您可以在启动后从STDIN开始读取,并且每当获得完整的一行时,将其传递给“ SBCommandInterpreter :: HandleCommand”。但是让RunCommandInterpreter正常工作是更可取的解决方案。