我正在使用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
答案 0 :(得分:2)
内部lldb保留一堆“I / O处理程序”,因此例如expr
只需将“Expr I / O处理程序”推入堆栈,收集输入直到完成,然后自动弹出堆栈并运行命令。
在C ++ SB API中,看起来像SB类(SBInputReader)的第一个草图,但我认为它并不完整,并且它目前没有暴露给Python。所以我认为你还没有足够的连线来做到这一点。