【问题标题】:lldb: implement custom command taking user inputlldb:实现接受用户输入的自定义命令
【发布时间】:2018-10-27 01:46:35
【问题描述】:

我正在使用 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-commands,如 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-function 的 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

【问题讨论】:

    标签: python c++ xcode lldb


    【解决方案1】:

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

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

    【讨论】:

    • OTOH,完成这项工作应该不难,因为您必须向 SB API 填充的内部类已经非常完善。如果有人渴望有机会做一点 lldb 黑客攻击......
    • 我刚开始研究 lldb 的扩展可能性,所以我对它知之甚少。无论如何,这意味着我必须检查并扩展 lldb 源代码,自己构建并部署到每个开发人员的开发环境中,对吧?
    • 你想拥有的设施必须内置到 lldb 中,因为它目前在 Python 层中缺失。 lldb 开发社区非常有帮助,欢迎使用补丁。在补丁审查期间总会有几轮有用的建议,但声音补丁很快就会进入树中。然后您将不得不等待下一个发布周期才能将修复程序放入官方二进制文件中。这大约是一年几次。在发布正式版本之前,您必须使用自己的版本来支持这一点,但这应该是暂时的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2012-09-13
    • 2014-01-31
    • 2010-09-23
    • 1970-01-01
    • 2021-05-22
    相关资源
    最近更新 更多