apropos 命令与其实现原理

0x0 前言

在上一篇中,介绍了如何在Xcode中编译你自己的 lldb, 所以到了这里默认你已经编译好了你的lldb了。

本文将通过介绍 apropos 命令及其实现原理,来介绍如果进行代码的学习和研究。

0x1 apropos 命令

help 命令列出了 lldb 的命令列表,但是由于lldb的命令特别多,且每个命令的用法也不少,于是有了 apropos 命令,它的作用就是搜索,在所有命令中搜索相关命令或设置。

例如搜索内存相关命令:

0x2 lldb的命令管理

lldb的命令都是 lldb_private::CommandObject 的实例,内置命令都是继承的方式实现,然后注册在 lldb_private::CommandInterpreter 类中。

lldb的命令分为三种,build-in, alias, user-defined,分别存储在 CommandInterpreter 类中的3个map中。

其中 build-in 命令是hard-code在 CommandInterpreter 中。aliasuser-defined 可以在 ~/.lldbinit 文件中定义。

本文要讲的 apropos 命令的实现在 CommandObjectApropos.cpp 中。

0x3 apropos 实现原理

找到了 CommandObjectApropos.cpp 里的 doExecute 方法就可以看到该命令的执行代码。同理,其他命令也都可以这样找到入口代码。

apropos分2部分: 搜索Command搜索settings variables

  • 搜索Command

搜索Command会对前面 CommandInterpreter 中的3个map都进行搜索,搜索Command的核心方法实现也非常简单(命令名称或者命令的 Help文案里面只要 contain了关键字,就认为符合搜索。放入返回结果中):
```c++
void CommandInterpreter::FindCommandsForApropos(
llvm::StringRef search_word, StringList &commands_found,
StringList &commands_help, CommandObject::CommandMap &command_map) {
CommandObject::CommandMap::const_iterator pos;

top Created with Sketch.