稳定性问题解析,进程: usb_service,崩溃 libusbservice.z.so
·
1.crash栈信息
Fingerprint:ede3e3264303154e8b40565f7a980b5494a723894369e41dc007865f39a8fd5b
Module name:usb_service
Timestamp:1970-01-01 08:00:14.000
Pid:2754
Uid:1018
Process name:usb_service
Process life time:5s
Reason:Signal:SIGSEGV(SEGV_MAPERR)@friday007 probably caused by NULL pointer dereference
Fault thread info:
Tid:2877, Name:OS_IPC_1_2877
#00 pc 0005ddde /system/lib/libusbservice.z.so(OHOS::USB::UsbHostManager::GetDevices(std::__h::vector<OHOS::USB::UsbDevice, std::__h::allocatorOHOS::USB::UsbDevice>&)+186)(3c10958e73749d69798b187d628d54b1)
#01 pc 00078517 /system/lib/libusbservice.z.so(OHOS::USB::UsbServerStub::OnRemoteRequest(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, OHOS::MessageOption&)+450)(3c10958e73749d69798b187d628d54b1)
#02 pc 0002a77b /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::IPCObjectStub::SendRequestInner(unsigned int, OHOS::MessageParcel&, OHOS::MessageParcel&, OHOS::MessageOption&)+118)(0678a19137a35c6ab276cbb924eb2164)
#03 pc 0003e707 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::GeneralServiceSendRequest(binder_transaction_data const&, OHOS::MessageParcel&, OHOS::MessageParcel&, OHOS::MessageOption&)+174)(0678a19137a35c6ab276cbb924eb2164)
#04 pc 0003ea57 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::Transaction(binder_transaction_data_secctx&)+582)(0678a19137a35c6ab276cbb924eb2164)
#05 pc 0003f077 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::HandleCommandsInner(unsigned int)+378)(0678a19137a35c6ab276cbb924eb2164)
#06 pc 0003dbdb /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::HandleCommands(unsigned int)+38)(0678a19137a35c6ab276cbb924eb2164)
#07 pc 0003da31 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::StartWorkLoop()+124)(0678a19137a35c6ab276cbb924eb2164)
#08 pc 0003f0e7 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::BinderInvoker::JoinThread(bool)+70)(0678a19137a35c6ab276cbb924eb2164)
#09 pc 00037cd7 /system/lib/chipset-pub-sdk/libipc_single.z.so(OHOS::IPCWorkThread::ThreadHandler(void*)+598)(0678a19137a35c6ab276cbb924eb2164)
#10 pc 000f5034 /system/lib/ld-musl-arm.so.1(start+248)(26fc5cf42a2d05b5e953792e14fb00ed)
#11 pc 0006ff98 /system/lib/ld-musl-arm.so.1(26fc5cf42a2d05b5e953792e14fb00ed)
2.通过栈地址及调用函数找到源码位置为:
base/usb/usb_manager/services/native/src/usb_host_manager.cpp
3.找到相关调用的函数
base/usb/usb_manager/services/native/include/usb_host_manager.h
std::mutex hdiCbMutex_;
std::mutex transferMutex_;
std::mutex devicesMutex_;//为互斥锁加上此行
UsbHostManager::UsbHostManager(SystemAbility *systemAbility)
{
systemAbility_ = systemAbility;
usbRightManager_ = std::shared_ptr<UsbRightManager>(new (std::nothrow) UsbRightManager());
if (usbRightManager_ == nullptr) {//判断空指针
USB_HILOGE(MODULE_USB_SERVICE, "Failed to allocate UsbRightManager! (out of memory)");
assert(usbRightManager_ != nullptr && "UsbRightManager allocation failed");// for debug
}
usbd_ = nullptr;
#ifndef USB_MANAGER_PASS_THROUGH
usbd_ = OHOS::HDI::Usb::V1_2::IUsbInterface::Get();
if (usbd_ == nullptr) {//判断空指针
USB_HILOGE(MODULE_USB_SERVICE, "Failed to get IUsbInterface (HDI service not available)");
}
#endif // USB_MANAGER_PASS_THROUGH
}
int32_t UsbHostManager::GetDevices(std::vector<UsbDevice> &deviceList)
{
USB_HILOGI(MODULE_USB_SERVICE, "list size %{public}zu", devices_.size());
if (usbRightManager_ == nullptr) { if (usbRightManager_ == nu
USB_HILOGE(MODULE_USB_SERVICE, "usbRightManager_ is NULL!");
return UEC_SERVICE_INVALID_VALUE;
}
std::lock_guard<std::mutex> lock{devicesMutex_};//加入互斥锁
for (auto it = devices_.begin(); it != devices_.end(); ++it) {
if (it->second == nullptr) { if (usbRightManager_ == nu
USB_HILOGE(MODULE_USB_SERVICE, "device pointer is NULL, skip!");
continue;
}
if (!(usbRightManager_->IsSystemAppOrSa())) {
it->second->SetmSerial("");
}
deviceList.push_back(*it->second);
}
return UEC_OK;
}
bool UsbHostManager::AddDevice(UsbDevice *dev)
{
if (dev == nullptr) {
USB_HILOGF(MODULE_SERVICE, "device is NULL");
return false;
}
auto isSuccess = PublishCommonEvent(CommonEventSupport::COMMON_EVENT_USB_DEVICE_ATTACHED, *dev);
if (!isSuccess) {
USB_HILOGW(MODULE_SERVICE, "send device attached broadcast failed");
}
uint8_t busNum = dev->GetBusNum();
uint8_t devNum = dev->GetDevAddr();
std::string name = std::to_string(static_cast<int>(busNum)) + "-" + std::to_string(static_cast<int>(devNum));
std::lock_guard<std::mutex> lock(devicesMutex_);//加入互斥锁
MAP_STR_DEVICE::iterator iter = devices_.find(name);
if (iter != devices_.end()) {
USB_HILOGF(MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu already exist", name.c_str(),
busNum, devNum);
UsbDevice *devOld = iter->second;
if (devOld != nullptr && devOld != dev) {
delete devOld;
devOld = nullptr;
}
devices_.erase(iter);
}
USB_HILOGI(
MODULE_SERVICE, "device:%{public}s bus:%{public}hhu dev:%{public}hhu insert", name.c_str(), busNum, devNum);
devices_.insert(std::make_pair(name, dev));
return true;
}
int32_t UsbHostManager::GetDeviceInfo(uint8_t busNum, uint8_t devAddr, UsbDevice &dev)
{
const UsbDev uDev = {busNum, devAddr};
std::vector<uint8_t> descriptor;
int32_t res = UEC_OK;
int32_t ret = OpenDevice(busNum, devAddr);
if (ret != UEC_OK) {
USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo OpenDevice failed ret=%{public}d", ret);
return ret;
}
ret = GetDeviceInfoDescriptor(uDev, descriptor, dev);
if (ret != UEC_OK) {
USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfoDescriptor ret=%{public}d", ret);
res = Close(busNum, devAddr);
if (res != UEC_OK) {
USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed res=%{public}d", res);
return res;
}
return ret;
}
res = GetConfigDescriptor(dev, descriptor);
if (res != UEC_OK) {
USB_HILOGE(MODULE_USB_SERVICE, "GetConfigDescriptor ret=%{public}d", ret);
}
ret = Close(busNum, devAddr);
if (ret != UEC_OK) {
USB_HILOGE(MODULE_USB_SERVICE, "GetDeviceInfo CloseDevice failed ret=%{public}d", ret);
return ret;
}
return res;
}
更多推荐

所有评论(0)