通过脚本桥启动交互式会话

时间:2019-01-22 08:15:26

标签: lldb

我正在尝试通过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绑定的主要目的是非交互式脚本编写,但是我很好奇是否可以实现这种情况。

1 个答案:

答案 0 :(得分:1)

SBDebugger上有一个方法可以执行此操作(RunCommandInterpreter)。这就是Xcode和类似的方法使lldb控制台窗口。但是到目前为止,它仅在C语言中使用过,并且此函数的C ++-> Python绑定存在问题,因此,当您尝试从Python调用它时,您会收到有关第5个参数类型错误的怪异错误。参数是int&,在运行时会产生SWIG(接口生成器)错误。

当然,您可以在启动后从STDIN开始读取,并且每当获得完整的一行时,将其传递给“ SBCommandInterpreter :: HandleCommand”。但是让RunCommandInterpreter正常工作是更可取的解决方案。