mdbctl组件自定义命令
更新时间:2025/10/15
在Gitcode上查看源码

重要提示:

  1. 组件运行过程不能依赖和使用调试接口下的方法和属性(包括bmc.*.Debug.*
  2. bmc.*.Debug.*类型的调试接口,必须实现构建裁剪
  3. bmc.*.Release.*类型的发布接口,必须考虑功能的差异性,例如在线调试连接组件时,可以输出在线调试日志,但其他组件调用时无法输出
  4. 调试命令和发布命令都必须上interface-sig组评审,发布命令必须补充高级命令资料

命令如何添加

  1. 自定义调试命令即是挂在组件对象下的资源树方法,bmc.*.Debug.*bmc.*.Release.*接口下的方法被视作组件自定义调试命令,区分Debug命令与Release命令,Release版本的调试命令在Debug版本默认存在,无需重复配置
shell
NAME                                TYPE      SIGNATURE   RESULT/VALUE  FLAGS
bmc.kepler.Debug.LogMock            interface -           -             -
.MockLog                            method    a{ss}usb    -             -
bmc.kepler.Object.Properties        interface -           -             -
  1. mdb_interface定义的bmc.*.Debug.*bmc.*.Release.*接口下(即为自定义调试命令)的方法与参数必须在model.json配置displayDescription字段,并用英文描述,displayDescription字段尽量保持简洁。
  2. 命令接口所在路径现已支持配置动态参数路径,确保命令唯一
  3. model.json的参数配置需要添加optional(可选参数)字段,不配置默认为false,配置为true时必须配置default字段,在方法调用参数缺省时使用默认值(可选参数只允许在最后,不支持跳跃配置)
  4. model.json方法同级添加cmdName字段,全小写命名风格,在同一组件内不允许cmdName重复,命令名显示为cmdName
  5. 命令参数不支持数组、字典等复杂数据类型
  6. 需要组件方法处理操作日志打印

mdb_interface配置示例:

json
{
    "bmc.kepler.Debug.LogMock": {
        "properties": {},
        "methods": {
            "MockLog": {
                "req": {
                    "Count": {
                        "baseType": "U32",
                        "minimum": 1,
                        "maximum": 1000,
                        "description": "注入的日志数量"
                    },
                    "Text": {
                        "baseType": "String",
                        "minLength": 1,
                        "maxLength": 1024,
                        "description": "注入的日志内容"
                    },
                    "RepeatText": {
                        "baseType": "Boolean",
                        "description": "标志是否重复内容"
                    }
                },
                "rsp": {
                },
                "description": "模拟日志注入"
            }
        }
    }
}

mds配置示例:

json
{
    "LogMock": {
        "path": "/bmc/kepler/Debug/LogMock",
        "interfaces": {
            "bmc.kepler.Debug.LogMock": {
                "methods": {
                    "MockLog": {
                        "cmdName": "mocklog",
                        "req": {
                            "Count": {
                                "minimum": 1,
                                "maximum": 1000,
                                "displayDescription": "Number of ingested logs."
                            },
                            "Text": {
                                "optional": true,
                                "default": "test log",
                                "displayDescription": "Content of ingested logs."
                            },
                            "RepeatText": {
                                "optional": true,
                                "default": true,
                                "displayDescription": "Indicates whether the text is duplicate."
                            }
                        },
                        "displayDescription": "Mock log update."
                    }
                }
            }
        }
    }
}

命令如何区分目录

代码仓结构参照/framework/maca/mds下新增debug路径用于配置Debug方法(对象下同时配置debug接口与release接口则仍配置在默认目录,但建议评估拆分),debug方法实现部分同样也需要拆分目录,debug目录下的接口定义如不涉及接口依赖可不配置service.json。

cmake配置打包debug目录:

参考/framework/maca/src/lualib/maca_app.luainit_debug_service方法初始化debug对象:

挂载命令的对象需要有对象名(单例对象自动创建对象名),可以在回调方法里设置:

命令如何使用

  1. attach组件后通过lscmd命令查看当前组件支持的自定义调试命令
shell
% attach maca
Success

% lscmd
Usage: CommandA <param1> [param2] 
"Command description"
param1  type  "Param description"
param2  type  "Param description"  "default value"

查看的结果格式为:

  • Usage: [方法名] [参数]
  • [方法描述] - 描述未配置时为空
  • [参数] [参数类型] [参数描述] [默认值(配置可选参数)]
  1. 直接使用方法名加参数的方式使用,以maca日志注入方法为例:
shell
% attach maca
Success

% lscmd
Usage: mocklog <Count> <Text> [RepeatText] 
Mock log inject
Count  u  Number of ingested logs  
Text  s  Content of ingested logs  
RepeatText  b  Indicates whether the log content is duplicate  true

% MockLog 10 'hello' true
  1. 动态参数路径下的方法如何区分

对于动态参数路径下的方法由mdbctl对方法进行合并处理,并添加ObjectName作为第一参数,即用户在使用时需额外指定执行对象。

将配置了自定义命令的bmc.kepler.Release.TraceChip接口挂载至动态参数路径下,即路径下所有对象支持该方法:

json
{
    "Cpld": &#123;
        "package":"Cpld",
        "path": "/bmc/kepler/Chip/Cpld/:Id",
        "interfaces": [
            "bmc.kepler.Release.TraceChip"
        ]
    &#125;
}

使用示例:

shell
% attach hwproxy
Success

-- 这里由mdbctl增加了参数用于指定对象
% lscmd
Usage: tracechip <ObjectName> <Action> 
Trace the read and write data of a specified component.
ObjectName  s  Object for which the command is executed.
Action  s  The value start indicates that the component starts to trace the read and write data. The value stop indicates that the component stops tracing the read and write data.

注意事项

  1. mdbctl ≥ 1.70.3支持添加与使用组件自定义调试命令
  2. bmcgo ≥ 0.5.318支持生成displayDescription字段
  3. mdbctl ≥ 1.70.6支持配置动态参数路径下的自定义命令
  4. 组件codegen_policy的version ≥ 16