lldb:实现用户输入的自定义命令

时间:2018-05-16 21:55:30

标签: python c++ xcode lldb

我正在使用python通过自定义命令gm来扩展lldb,后者调用C ++ - 函数cli(const char* params)。 因此,可以暂停xcode(从而启动lldb)并输入...

(lldb) gm set value

然后触发调用cli("set value")

C ++ - 函数cli可以使用std::cout来打印某个状态,但是我不能使这个函数"交互式",即消耗用户输入:

void cli(const char* params) {   
    std::cout << "params: " << params << std::endl;  // works

    std::string userInput;
    std::cin >> userInput; // does not work; is simply ignored
}

问题:如何在消费(和进一步处理)用户输入的意义上使cli互动?

进一步展示我想要实现的目标:内置lldb命令,如expr(无参数),进入交互模式:

(lldb) expr
Enter expressions, then terminate with an empty line to evaluate:
1 2+2
2 
(int) $0 = 4

我希望在我自己的命令中有类似的行为,即输入gm然后以交互方式询问参数:

(lldb) gm
Enter generic model parameters; Terminate interactive mode with "end":
1 set value
2 params: set value
3 end

为了完整起见,请参阅当前用于调用cli的python脚本 - 函数:

def gm(debugger, command, result, internal_dict):

    cmd = "po cli(\""+command+"\")"
    lldb.debugger.HandleCommand(cmd)

# And the initialization code to add your commands 
def __lldb_init_module(debugger, internal_dict):
    debugger.HandleCommand('command script add -f gm.gm gm')
    print 'The "gm" python command has been installed and is ready for use.'

和注册此脚本的.lldbinit文件中的行:

command script import ~/my_commands.py

1 个答案:

答案 0 :(得分:2)

内部lldb保留一堆“I / O处理程序”,因此例如expr只需将“Expr I / O处理程序”推入堆栈,收集输入直到完成,然后自动弹出堆栈并运行命令。

在C ++ SB API中,看起来像SB类(SBInputReader)的第一个草图,但我认为它并不完整,并且它目前没有暴露给Python。所以我认为你还没有足够的连线来做到这一点。