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;
}

相关文件下载
ID348J.rar
1.08 KB
下载
Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐