1 开发平台
Win11、VS2022、Fedora39。
2 作业目的
通过VS2022跨平台Linux构建openbmc/intel-ipmi-oem的x64可执行模块。
3 问题描述
该模块启动后,出现以下异常:
上图中的调用堆栈消息是:
std::__uniq_ptr_impl<sd_bus, sdbusplus::bus::details::BusDeleter>::_M_ptr(const std::__uniq_ptr_impl<sd_bus, sdbusplus::bus::details::BusDeleter> * const this) Line 199 C++
std::unique_ptr<sd_bus, sdbusplus::bus::details::BusDeleter>::get(const std::unique_ptr<sd_bus, sdbusplus::bus::details::BusDeleter> * const this) Line 470 C++
sdbusplus::bus::bus::get(sdbusplus::bus::bus * const this) Line 501 C++
sdbusplus::bus::details::bus_friend::get_busp(sdbusplus::bus::bus & b) Line 616 C++
libsdbusplus.so.1!sdbusplus::bus::match::match::match(sdbusplus::bus::bus&, char const*, std::function<void (sdbusplus::message::message&)>)(sdbusplus::bus::match::match * const this, sdbusplus::bus_t & bus, const char * _match, sdbusplus::bus::match::match::callback_t callback) Line 40 C++
__static_initialization_and_destruction_0() Line 102 C++
_GLOBAL__sub_I__ZN4ipmi10sensorTreeB5cxx11E() Line 1893 C++
libc.so.6!__libc_start_main_impl
_start
根据上述消息,异常发生在main函数执行之前的全局变量初始化,其中出现了变量名sensorTree。
sensorTree的定义在sensorcommands.cpp中:
SensorSubTree sensorTree;
类型名SensorSubTree的定义在sdrutils.hpp中:
using SensorSubTree = boost::container::flat_map<
std::string,
boost::container::flat_map<std::string, std::vector<std::string>>,
CmpStrVersion>;
4 解决方法
调用堆栈消息中出现了大量的match,但是看不出SensorSubTree与match有何关联。
在sensorTree的定义下面有三个函数的定义中出现了match:
static sdbusplus::bus::match_t sensorAdded(
static sdbusplus::bus::match_t sensorRemoved(
static sdbusplus::bus::match_t thresholdChanged(
经搜索发现这三个函数都没有被调用,于是把它们注掉。
重新编译后运行时没有出现上述异常。
以上解决方法实属侥幸,请有识之士赐教。