-
问题描述:资源树接口bmc.kepler.Systems.PCIeDevices.PCIeDevice下Position属性值,在pcie设备加载过程中先赋值,然后会概率性被清空。请教一下,这种情况要怎么定位?
-
现象:
-
相关log:
- 赋值:
- 2026-06-30 14:23:51.248602 pcie_device DEBUG: object.lua(88): set property traceback: sender[bmc.kepler.pcie_device], path[/bmc/kepler/Systems/1/PCIeDevices/PCIeDevice_1_0101011102], interface[bmc.kepler.Systems.PCIeDevices.PCIeDevice], name[Position], value[“”] → [“PCIeRiser21”], traceback[stack traceback: ./opt/bmc/libmc/lualib/traceback/object.lua:49: in function <./opt/bmc/libmc/lualib/traceback/object.lua:45> [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/mc/logging.lua:119: in function ‘format_msg’ ./opt/bmc/libmc/lualib/mc/logging.lua:308: in function ‘LOG_MSG’ ./opt/bmc/libmc/lualib/mc/logging.lua:527: in function ‘log_easy’ ./opt/bmc/libmc/lualib/mc/logging.lua:531: in function ‘debug_easy’ ./opt/bmc/libmc/lualib/traceback/object.lua:88: in function ‘before_set_value’ ./opt/bmc/libmc/lualib/traceback/object.lua:93: in function ‘__newindex’ …c/lualib/mc/class_mgnt/api/object/property_mgmt/init.lua:255: in function ‘force_set_prop’ …c/lualib/mc/class_mgnt/api/object/property_mgmt/init.lua:275: in function ‘newindex’ ./opt/bmc/libmc/lualib/mc/array_map.lua:78: in function ‘__newindex’ …bmc/apps/pcie_device/lualib/device/class/pcie_device.lua:50: in function ‘set_prop’ …bmc/apps/pcie_device/lualib/device/class/pcie_device.lua:286: in function ‘update_pciedevice_position’ …bmc/apps/pcie_device/lualib/device/class/pcie_device.lua:318: in function <…bmc/apps/pcie_device/lualib/device/class/pcie_device.lua:317> [builtin#21]: at 0xffff86676d28 [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/mc/context.lua:212: in function ‘with_context’ ./opt/bmc/libmc/lualib/mc/app_preloader.lua:97: in function ‘’ /opt/bmc/skynet/lualib/skynet.lua: in function </opt/bmc/skynet/lualib/skynet.lua:0>]
- 清空:
-
2026-06-30 14:23:51.286485 pcie_device DEBUG: object.lua(88): set property traceback: sender[bmc.kepler.pcie_device], path[/bmc/kepler/Systems/1/PCIeDevices/PCIeDevice_1_0101011102], interface[bmc.kepler.Systems.PCIeDevices.PCIeDevice], name[Position], value[“PCIeRiser21”] → [“”], traceback[stack traceback: ./opt/bmc/libmc/lualib/traceback/object.lua:49: in function <./opt/bmc/libmc/lualib/traceback/object.lua:45> [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/mc/logging.lua:119: in function ‘format_msg’ ./opt/bmc/libmc/lualib/mc/logging.lua:308: in function ‘LOG_MSG’ ./opt/bmc/libmc/lualib/mc/logging.lua:527: in function ‘log_easy’ ./opt/bmc/libmc/lualib/mc/logging.lua:531: in function ‘debug_easy’ ./opt/bmc/libmc/lualib/traceback/object.lua:88: in function ‘before_set_value’ ./opt/bmc/libmc/lualib/traceback/object.lua:93: in function ‘__newindex’ …c/lualib/mc/class_mgnt/api/object/property_mgmt/init.lua:255: in function ‘force_set_prop’ …c/lualib/mc/class_mgnt/api/object/property_mgmt/init.lua:275: in function ‘newindex’ ./opt/bmc/libmc/lualib/mc/array_map.lua:78: in function ‘__newindex’ … [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/mc/context.lua:212: in function <./opt/bmc/libmc/lualib/mc/context.lua:209> [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/database/hook.lua:68: in function ‘old_commit_once’ ./opt/bmc/libmc/lualib/database/hook.lua:175: in function <./opt/bmc/libmc/lualib/database/hook.lua:173> [builtin#21]: at 0xffff86676d28 [C]: in function ‘pcall’ ./opt/bmc/libmc/lualib/mc/context.lua:212: in function ‘with_context’ ./opt/bmc/libmc/lualib/mc/app_preloader.lua:97: in function ‘’ /opt/bmc/skynet/lualib/skynet.lua: in function </opt/bmc/skynet/lualib/skynet.lua:0>]
-
- 赋值:
-
当前pcie_device组件版本信息
pcie_device/1.90.24@openubmc/stable#26244146634d308f7d5021c6e7559d0c%1774011017.73
答案内容由AI生成,仅供参考:
三、结论
综合 Context 提供的信息,该问题最可能由 属性动态链接 + 跨组件同步时序 或 持久化层引用对象失败 引起。请按上述定位步骤逐一排查日志、动态链接关系及 CSR 配置,以确定根本原因并修复。
点击此处查看详细分析解答
根据您提供的日志信息及 Context(知识图谱与文档块)中的相关内容,以下是关于 bmc.kepler.Systems.PCIeDevices.PCIeDevice 下 Position 属性被概率性清空的可能原因分析和定位建议。
一、可能原因分析(基于 Context)
1. 属性动态链接导致值被覆盖
Context 中明确提到:
Position is dynamically linked to the value of PCIeDevice_1.Position.
(Position动态链接到PCIeDevice_1.Position的值)
这种动态链接机制意味着 Position 属性的值可能被其他对象的同步操作自动覆盖。如果 PCIeDevice_1.Position 的值为空或未被正确设置,则可能导致 Position 被覆写为空。
2. 跨组件属性同步过程中的时序问题
文档块 [6](PCIe设备加载)指出:
跨组件的属性同步,部分属性同步还需要来回进行两次。
从您的日志看,赋值("PCIeRiser21")后仅 38ms 就被清空,这与“两次同步”的流程高度吻合——可能第一次赋值是中间状态,第二次同步时由于某些条件未满足(如被引用的对象未就绪),框架将属性重置为默认值(空字符串)。
3. 持久化操作中的异常
清空操作的调用栈终点为 database/hook.lua,属于持久化提交流程。文档块 [10](硬件自发现FAQ)列出了常见的属性解析失败场景:
ignore property: %s, value: %s, object: %s, error: fail to analyse property
- 当属性为引用对象,而被引用的对象获取失败时
- 当属性为同步对象,而被同步的对象获取失败时
结合上述机制,可能是在持久化提交时,由于被引用的 PCIeDevice_1 对象尚未完全加载或 Position 属性访问失败,框架自动将属性值清空(设为默认空值)。
4. CSR 配置或持久化表配置问题
文档块 [7] 提到:
包含
usage: CSR属性的表,设置属性值后能持久化,但重启后读不到持久化的值……可能原因:
1)CSR 中没有配置该类的对象
2)对象添加失败,导致没有加载到内存数据库
虽然问题发生在运行中而非重启后,但类似机理:如果 PCIeDevice 对象在加载过程中因 CSR 配置缺失或对象创建失败,持久化层可能无法正确保持该属性的值。
二、定位步骤建议
步骤1:检查日志中是否存在 ignore property 错误
在 BMC 的 app_debug_log_all 或 pcie_device 组件日志中搜索:
ignore property: Position, value: "PCIeRiser21", object: /bmc/kepler/Systems/1/PCIeDevices/PCIeDevice_1_0101011102, error: fail to analyse property
若存在,则表明是引用/同步对象获取失败导致清空。进一步检查该对象依赖的 PCIeDevice_1 对象是否已成功加载(可通过 lsprop 命令查看其 Position 属性)。
步骤2:检查 PCIeDevice_1_0101011102 对象的动态链接配置
使用 lsprop 或 D-Bus 工具(如 busctl)查看该对象的 Position 属性是否被标记为动态链接(与 PCIeDevice_1.Position 关联)。若确认,则需确保源对象 PCIeDevice_1 的 Position 值在同步时刻不为空。
步骤3:分析 pcie_device 组件内部 update_pciedevice_position 函数的逻辑
从日志中可看到赋值操作来源于 pcie_device.lua 的 update_pciedevice_position 函数。建议在代码中检查该函数执行后是否立即被其他流程(如 database/hook.lua 的 commit)覆写。可临时增加日志打印 position 的变更来源,确认是哪个流程发起了清空。
步骤4:审查 PCIeDevice 对象的 CSR 持久化配置
检查 sr 文件中 PCIeDevice 类的属性定义,确认 Position 属性是否声明了正确的 usage(如 CSR / Persist),以及是否存在与该属性关联的引用关系(例如 @属性名称)。若引用对象未在 CSR 中定义,可能导致持久化时被忽略。
步骤5:验证组件版本及已知修复
您当前使用 pcie_device/1.90.24,建议查阅此版本的发布说明或 Git 提交记录,确认是否有关于“Position 属性概率性清空”或“动态链接同步时序”的修复。若已修复,升级版本可解决问题;若未修复,可反馈至开发社区。
三、结论
综合 Context 提供的信息,该问题最可能由 属性动态链接 + 跨组件同步时序 或 持久化层引用对象失败 引起。请按上述定位步骤逐一排查日志、动态链接关系及 CSR 配置,以确定根本原因并修复。

