Loading services/camera/libcameraservice/CameraService.cpp +91 −110 Original line number Original line Diff line number Diff line Loading @@ -2196,8 +2196,11 @@ void CameraService::logUserSwitch(const std::set<userid_t>& oldUserIds, const std::set<userid_t>& newUserIds) { const std::set<userid_t>& newUserIds) { String8 newUsers = toString(newUserIds); String8 newUsers = toString(newUserIds); String8 oldUsers = toString(oldUserIds); String8 oldUsers = toString(oldUserIds); if (oldUsers.size() == 0) { oldUsers = "<None>"; } // Log the new and old users // Log the new and old users logEvent(String8::format("USER_SWITCH previous allowed users: %s , current allowed users: %s", logEvent(String8::format("USER_SWITCH previous allowed user IDs: %s, current allowed user IDs: %s", oldUsers.string(), newUsers.string())); oldUsers.string(), newUsers.string())); } } Loading Loading @@ -2743,27 +2746,20 @@ static bool tryLock(Mutex& mutex) status_t CameraService::dump(int fd, const Vector<String16>& args) { status_t CameraService::dump(int fd, const Vector<String16>& args) { ATRACE_CALL(); ATRACE_CALL(); String8 result("Dump of the Camera Service:\n"); if (checkCallingPermission(String16("android.permission.DUMP")) == false) { if (checkCallingPermission(String16("android.permission.DUMP")) == false) { result = result.format("Permission Denial: " dprintf(fd, "Permission Denial: can't dump CameraService from pid=%d, uid=%d\n", "can't dump CameraService from pid=%d, uid=%d\n", getCallingPid(), getCallingPid(), getCallingUid()); getCallingUid()); write(fd, result.string(), result.size()); return NO_ERROR; return NO_ERROR; } } bool locked = tryLock(mServiceLock); bool locked = tryLock(mServiceLock); // failed to lock - CameraService is probably deadlocked // failed to lock - CameraService is probably deadlocked if (!locked) { if (!locked) { result.append("CameraService may be deadlocked\n"); dprintf(fd, "!! CameraService may be deadlocked !!\n"); write(fd, result.string(), result.size()); } } bool hasClient = false; if (!mInitialized) { if (!mInitialized) { result = String8::format("No camera HAL available!\n"); dprintf(fd, "!! No camera HAL available !!\n"); write(fd, result.string(), result.size()); // Dump event log for error information // Dump event log for error information dumpEventLog(fd); dumpEventLog(fd); Loading @@ -2771,127 +2767,115 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { if (locked) mServiceLock.unlock(); if (locked) mServiceLock.unlock(); return NO_ERROR; return NO_ERROR; } } if (mModule == nullptr) { dprintf(fd, "\n== Service global info: ==\n\n"); mCameraProviderManager->dump(fd, args); dprintf(fd, "Number of camera devices: %d\n", mNumberOfCameras); // TODO - need way more dumping here dprintf(fd, "Number of normal camera devices: %d\n", mNumberOfNormalCameras); if (locked) mServiceLock.unlock(); return NO_ERROR; } result = String8::format("Camera module HAL API version: 0x%x\n", mModule->getHalApiVersion()); result.appendFormat("Camera module API version: 0x%x\n", mModule->getModuleApiVersion()); result.appendFormat("Camera module name: %s\n", mModule->getModuleName()); result.appendFormat("Camera module author: %s\n", mModule->getModuleAuthor()); result.appendFormat("Number of camera devices: %d\n", mNumberOfCameras); result.appendFormat("Number of normal camera devices: %d\n", mNumberOfNormalCameras); String8 activeClientString = mActiveClientManager.toString(); String8 activeClientString = mActiveClientManager.toString(); result.appendFormat("Active Camera Clients:\n%s", activeClientString.string()); dprintf(fd, "Active Camera Clients:\n%s", activeClientString.string()); result.appendFormat("Allowed users:\n%s\n", toString(mAllowedUsers).string()); dprintf(fd, "Allowed user IDs: %s\n", toString(mAllowedUsers).string()); sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); if (desc == NULL) { result.appendFormat("Vendor tags left unimplemented.\n"); } else { result.appendFormat("Vendor tag definitions:\n"); } write(fd, result.string(), result.size()); if (desc != NULL) { desc->dump(fd, /*verbosity*/2, /*indentation*/4); } dumpEventLog(fd); dumpEventLog(fd); bool stateLocked = tryLock(mCameraStatesLock); bool stateLocked = tryLock(mCameraStatesLock); if (!stateLocked) { if (!stateLocked) { result = String8::format("CameraStates in use, may be deadlocked\n"); dprintf(fd, "CameraStates in use, may be deadlocked\n"); write(fd, result.string(), result.size()); } } for (auto& state : mCameraStates) { for (auto& state : mCameraStates) { String8 cameraId = state.first; String8 cameraId = state.first; result = String8::format("Camera %s information:\n", cameraId.string()); camera_info info; dprintf(fd, "== Camera device %s dynamic info: ==\n", cameraId.string()); CameraParameters p = state.second->getShimParams(); if (!p.isEmpty()) { dprintf(fd, " Camera1 API shim is using parameters:\n "); p.dump(fd, args); } auto clientDescriptor = mActiveClientManager.get(cameraId); if (clientDescriptor == nullptr) { dprintf(fd, " Device %s is closed, no client instance\n", cameraId.string()); continue; } dprintf(fd, " Device %s is open. Client instance dump:\n", cameraId.string()); dprintf(fd, " Client priority level: %d\n", clientDescriptor->getPriority()); dprintf(fd, " Client PID: %d\n", clientDescriptor->getOwnerId()); auto client = clientDescriptor->getValue(); dprintf(fd, " Client package: %s\n", String8(client->getPackageName()).string()); client->dumpClient(fd, args); if (mModule != nullptr) { dprintf(fd, "== Camera HAL device %s static information: ==\n", cameraId.string()); camera_info info; status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); int deviceVersion = -1; if (rc != OK) { if (rc != OK) { result.appendFormat(" Error reading static information!\n"); dprintf(fd, " Error reading static information!\n"); write(fd, result.string(), result.size()); } else { } else { result.appendFormat(" Facing: %s\n", dprintf(fd, " Facing: %s\n", info.facing == CAMERA_FACING_BACK ? "BACK" : info.facing == CAMERA_FACING_BACK ? "BACK" : info.facing == CAMERA_FACING_FRONT ? "FRONT" : "EXTERNAL"); info.facing == CAMERA_FACING_FRONT ? "FRONT" : "EXTERNAL"); result.appendFormat(" Orientation: %d\n", info.orientation); dprintf(fd, " Orientation: %d\n", info.orientation); int deviceVersion; if (mModule->getModuleApiVersion() < CAMERA_MODULE_API_VERSION_2_0) { if (mModule->getModuleApiVersion() < CAMERA_MODULE_API_VERSION_2_0) { deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; } else { } else { deviceVersion = info.device_version; deviceVersion = info.device_version; } } } auto conflicting = state.second->getConflicting(); auto conflicting = state.second->getConflicting(); result.appendFormat(" Resource Cost: %d\n", state.second->getCost()); dprintf(fd, " Resource Cost: %d\n", state.second->getCost()); result.appendFormat(" Conflicting Devices:"); dprintf(fd, " Conflicting Devices:"); for (auto& id : conflicting) { for (auto& id : conflicting) { result.appendFormat(" %s", id.string()); dprintf(fd, " %s", id.string()); } } if (conflicting.size() == 0) { if (conflicting.size() == 0) { result.appendFormat(" NONE"); dprintf(fd, " NONE"); } } result.appendFormat("\n"); dprintf(fd, "\n"); result.appendFormat(" Device version: %#x\n", deviceVersion); dprintf(fd, " Device version: %#x\n", deviceVersion); if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_0) { if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_0) { result.appendFormat(" Device static metadata:\n"); dprintf(fd, " Device static metadata:\n"); write(fd, result.string(), result.size()); dump_indented_camera_metadata(info.static_camera_characteristics, dump_indented_camera_metadata(info.static_camera_characteristics, fd, /*verbosity*/2, /*indentation*/4); fd, /*verbosity*/2, /*indentation*/4); } else { write(fd, result.string(), result.size()); } CameraParameters p = state.second->getShimParams(); if (!p.isEmpty()) { result = String8::format(" Camera1 API shim is using parameters:\n "); write(fd, result.string(), result.size()); p.dump(fd, args); } } } } auto clientDescriptor = mActiveClientManager.get(cameraId); if (clientDescriptor == nullptr) { result = String8::format(" Device %s is closed, no client instance\n", cameraId.string()); write(fd, result.string(), result.size()); continue; } } hasClient = true; result = String8::format(" Device %s is open. Client instance dump:\n\n", cameraId.string()); result.appendFormat("Client priority level: %d\n", clientDescriptor->getPriority()); result.appendFormat("Client PID: %d\n", clientDescriptor->getOwnerId()); auto client = clientDescriptor->getValue(); if (stateLocked) mCameraStatesLock.unlock(); result.appendFormat("Client package: %s\n", String8(client->getPackageName()).string()); write(fd, result.string(), result.size()); client->dumpClient(fd, args); if (locked) mServiceLock.unlock(); if (mModule == nullptr) { mCameraProviderManager->dump(fd, args); } else { dprintf(fd, "\n== Camera Module HAL static info: ==\n"); dprintf(fd, "Camera module HAL API version: 0x%x\n", mModule->getHalApiVersion()); dprintf(fd, "Camera module API version: 0x%x\n", mModule->getModuleApiVersion()); dprintf(fd, "Camera module name: %s\n", mModule->getModuleName()); dprintf(fd, "Camera module author: %s\n", mModule->getModuleAuthor()); } } if (stateLocked) mCameraStatesLock.unlock(); dprintf(fd, "\n== Vendor tags: ==\n\n"); if (!hasClient) { sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); result = String8::format("\nNo active camera clients yet.\n"); if (desc == NULL) { write(fd, result.string(), result.size()); dprintf(fd, "No vendor tags.\n"); } else { desc->dump(fd, /*verbosity*/2, /*indentation*/2); } } if (locked) mServiceLock.unlock(); // Dump camera traces if there were any // Dump camera traces if there were any write(fd, "\n", 1); dprintf(fd, "\n"); camera3::CameraTraces::dump(fd, args); camera3::CameraTraces::dump(fd, args); // Process dump arguments, if any // Process dump arguments, if any Loading @@ -2904,19 +2888,18 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { if (i + 1 >= n) continue; if (i + 1 >= n) continue; String8 levelStr(args[i+1]); String8 levelStr(args[i+1]); int level = atoi(levelStr.string()); int level = atoi(levelStr.string()); result = String8::format("\nSetting log level to %d.\n", level); dprintf(fd, "\nSetting log level to %d.\n", level); setLogLevel(level); setLogLevel(level); write(fd, result.string(), result.size()); } else if (args[i] == unreachableOption) { } else if (args[i] == unreachableOption) { // Dump memory analysis // Dump memory analysis // TODO - should limit be an argument parameter? // TODO - should limit be an argument parameter? UnreachableMemoryInfo info; UnreachableMemoryInfo info; bool success = GetUnreachableMemory(info, /*limit*/ 10000); bool success = GetUnreachableMemory(info, /*limit*/ 10000); if (!success) { if (!success) { dprintf(fd, "\nUnable to dump unreachable memory. " dprintf(fd, "\n== Unable to dump unreachable memory. " "Try disabling SELinux enforcement.\n"); "Try disabling SELinux enforcement. ==\n"); } else { } else { dprintf(fd, "\nDumping unreachable memory:\n"); dprintf(fd, "\n== Dumping unreachable memory: ==\n"); std::string s = info.ToString(/*log_contents*/ true); std::string s = info.ToString(/*log_contents*/ true); write(fd, s.c_str(), s.size()); write(fd, s.c_str(), s.size()); } } Loading @@ -2926,21 +2909,19 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { } } void CameraService::dumpEventLog(int fd) { void CameraService::dumpEventLog(int fd) { String8 result = String8("\nPrior client events (most recent at top):\n"); dprintf(fd, "\n== Camera service events log (most recent at top): ==\n"); Mutex::Autolock l(mLogLock); Mutex::Autolock l(mLogLock); for (const auto& msg : mEventLog) { for (const auto& msg : mEventLog) { result.appendFormat(" %s\n", msg.string()); dprintf(fd, " %s\n", msg.string()); } } if (mEventLog.size() == DEFAULT_EVENT_LOG_LENGTH) { if (mEventLog.size() == DEFAULT_EVENT_LOG_LENGTH) { result.append(" ...\n"); dprintf(fd, " ...\n"); } else if (mEventLog.size() == 0) { } else if (mEventLog.size() == 0) { result.append(" [no events yet]\n"); dprintf(fd, " [no events yet]\n"); } } result.append("\n"); dprintf(fd, "\n"); write(fd, result.string(), result.size()); } } void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { Loading services/camera/libcameraservice/api2/CameraDeviceClient.cpp +11 −14 Original line number Original line Diff line number Diff line Loading @@ -1285,37 +1285,34 @@ status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) { } } status_t CameraDeviceClient::dumpClient(int fd, const Vector<String16>& args) { status_t CameraDeviceClient::dumpClient(int fd, const Vector<String16>& args) { String8 result; dprintf(fd, " CameraDeviceClient[%s] (%p) dump:\n", result.appendFormat("CameraDeviceClient[%s] (%p) dump:\n", mCameraIdStr.string(), mCameraIdStr.string(), (getRemoteCallback() != NULL ? (getRemoteCallback() != NULL ? IInterface::asBinder(getRemoteCallback()).get() : NULL) ); IInterface::asBinder(getRemoteCallback()).get() : NULL) ); result.appendFormat(" Current client UID %u\n", mClientUid); dprintf(fd, " Current client UID %u\n", mClientUid); result.append(" State:\n"); dprintf(fd, " State:\n"); result.appendFormat(" Request ID counter: %d\n", mRequestIdCounter); dprintf(fd, " Request ID counter: %d\n", mRequestIdCounter); if (mInputStream.configured) { if (mInputStream.configured) { result.appendFormat(" Current input stream ID: %d\n", dprintf(fd, " Current input stream ID: %d\n", mInputStream.id); mInputStream.id); } else { } else { result.append(" No input stream configured.\n"); dprintf(fd, " No input stream configured.\n"); } } if (!mStreamMap.isEmpty()) { if (!mStreamMap.isEmpty()) { result.append(" Current output stream/surface IDs:\n"); dprintf(fd, " Current output stream/surface IDs:\n"); for (size_t i = 0; i < mStreamMap.size(); i++) { for (size_t i = 0; i < mStreamMap.size(); i++) { result.appendFormat(" Stream %d Surface %d\n", dprintf(fd, " Stream %d Surface %d\n", mStreamMap.valueAt(i).streamId(), mStreamMap.valueAt(i).streamId(), mStreamMap.valueAt(i).surfaceId()); mStreamMap.valueAt(i).surfaceId()); } } } else if (!mDeferredStreams.isEmpty()) { } else if (!mDeferredStreams.isEmpty()) { result.append(" Current deferred surface output stream IDs:\n"); dprintf(fd, " Current deferred surface output stream IDs:\n"); for (auto& streamId : mDeferredStreams) { for (auto& streamId : mDeferredStreams) { result.appendFormat(" Stream %d\n", streamId); dprintf(fd, " Stream %d\n", streamId); } } } else { } else { result.append(" No output streams configured.\n"); dprintf(fd, " No output streams configured.\n"); } } write(fd, result.string(), result.size()); // TODO: print dynamic/request section from most recent requests // TODO: print dynamic/request section from most recent requests mFrameProcessor->dump(fd, args); mFrameProcessor->dump(fd, args); Loading services/camera/libcameraservice/common/CameraProviderManager.cpp +34 −7 Original line number Original line Diff line number Diff line Loading @@ -282,7 +282,6 @@ hardware::Return<void> CameraProviderManager::onRegistration( status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { std::lock_guard<std::mutex> lock(mInterfaceMutex); std::lock_guard<std::mutex> lock(mInterfaceMutex); dprintf(fd, "Available camera providers and devices:\n"); for (auto& provider : mProviders) { for (auto& provider : mProviders) { provider->dump(fd, args); provider->dump(fd, args); } } Loading Loading @@ -462,18 +461,46 @@ status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, } } status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { dprintf(fd, " %s: %zu devices:\n", mProviderName.c_str(), mDevices.size()); dprintf(fd, "== Camera Provider HAL %s (v2.4) static info: %zu devices: ==\n", mProviderName.c_str(), mDevices.size()); for (auto& device : mDevices) { for (auto& device : mDevices) { dprintf(fd, " %s: Resource cost: %d\n", device->mName.c_str(), dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), device->mResourceCost.resourceCost); device->mVersion.get_major(), device->mVersion.get_minor()); if (device->mResourceCost.conflictingDevices.size() > 0) { dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); if (device->mResourceCost.conflictingDevices.size() == 0) { dprintf(fd, " Conflicting devices: None\n"); } else { dprintf(fd, " Conflicting devices:\n"); dprintf(fd, " Conflicting devices:\n"); for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { dprintf(fd, " %s\n", dprintf(fd, " %s\n", device->mResourceCost.conflictingDevices[i].c_str()); device->mResourceCost.conflictingDevices[i].c_str()); } } } } dprintf(fd, " API1 info:\n"); dprintf(fd, " Has a flash unit: %s\n", device->hasFlashUnit() ? "true" : "false"); hardware::CameraInfo info; status_t res = device->getCameraInfo(&info); if (res != OK) { dprintf(fd, " <Error reading camera info: %s (%d)>\n", strerror(-res), res); } else { dprintf(fd, " Facing: %s\n", info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); dprintf(fd, " Orientation: %d\n", info.orientation); } CameraMetadata info2; res = device->getCameraCharacteristics(&info2); if (res == INVALID_OPERATION) { dprintf(fd, " API2 not directly supported\n"); } else if (res != OK) { dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", strerror(-res), res); } else { dprintf(fd, " API2 camera characteristics:\n"); info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); } } } return OK; return OK; } } Loading services/camera/libcameraservice/utils/CameraTraces.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,7 @@ status_t CameraTraces::dump(int fd, const Vector<String16> &args __attribute__(( return BAD_VALUE; return BAD_VALUE; } } dprintf(fd, "Camera traces (%zu):\n", pcsList.size()); dprintf(fd, "== Camera error traces (%zu): ==\n", pcsList.size()); if (pcsList.empty()) { if (pcsList.empty()) { dprintf(fd, " No camera traces collected.\n"); dprintf(fd, " No camera traces collected.\n"); Loading services/camera/libcameraservice/device3/Camera3Device.cpp +1 −1 File changed.Contains only whitespace changes. Show changes Loading
services/camera/libcameraservice/CameraService.cpp +91 −110 Original line number Original line Diff line number Diff line Loading @@ -2196,8 +2196,11 @@ void CameraService::logUserSwitch(const std::set<userid_t>& oldUserIds, const std::set<userid_t>& newUserIds) { const std::set<userid_t>& newUserIds) { String8 newUsers = toString(newUserIds); String8 newUsers = toString(newUserIds); String8 oldUsers = toString(oldUserIds); String8 oldUsers = toString(oldUserIds); if (oldUsers.size() == 0) { oldUsers = "<None>"; } // Log the new and old users // Log the new and old users logEvent(String8::format("USER_SWITCH previous allowed users: %s , current allowed users: %s", logEvent(String8::format("USER_SWITCH previous allowed user IDs: %s, current allowed user IDs: %s", oldUsers.string(), newUsers.string())); oldUsers.string(), newUsers.string())); } } Loading Loading @@ -2743,27 +2746,20 @@ static bool tryLock(Mutex& mutex) status_t CameraService::dump(int fd, const Vector<String16>& args) { status_t CameraService::dump(int fd, const Vector<String16>& args) { ATRACE_CALL(); ATRACE_CALL(); String8 result("Dump of the Camera Service:\n"); if (checkCallingPermission(String16("android.permission.DUMP")) == false) { if (checkCallingPermission(String16("android.permission.DUMP")) == false) { result = result.format("Permission Denial: " dprintf(fd, "Permission Denial: can't dump CameraService from pid=%d, uid=%d\n", "can't dump CameraService from pid=%d, uid=%d\n", getCallingPid(), getCallingPid(), getCallingUid()); getCallingUid()); write(fd, result.string(), result.size()); return NO_ERROR; return NO_ERROR; } } bool locked = tryLock(mServiceLock); bool locked = tryLock(mServiceLock); // failed to lock - CameraService is probably deadlocked // failed to lock - CameraService is probably deadlocked if (!locked) { if (!locked) { result.append("CameraService may be deadlocked\n"); dprintf(fd, "!! CameraService may be deadlocked !!\n"); write(fd, result.string(), result.size()); } } bool hasClient = false; if (!mInitialized) { if (!mInitialized) { result = String8::format("No camera HAL available!\n"); dprintf(fd, "!! No camera HAL available !!\n"); write(fd, result.string(), result.size()); // Dump event log for error information // Dump event log for error information dumpEventLog(fd); dumpEventLog(fd); Loading @@ -2771,127 +2767,115 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { if (locked) mServiceLock.unlock(); if (locked) mServiceLock.unlock(); return NO_ERROR; return NO_ERROR; } } if (mModule == nullptr) { dprintf(fd, "\n== Service global info: ==\n\n"); mCameraProviderManager->dump(fd, args); dprintf(fd, "Number of camera devices: %d\n", mNumberOfCameras); // TODO - need way more dumping here dprintf(fd, "Number of normal camera devices: %d\n", mNumberOfNormalCameras); if (locked) mServiceLock.unlock(); return NO_ERROR; } result = String8::format("Camera module HAL API version: 0x%x\n", mModule->getHalApiVersion()); result.appendFormat("Camera module API version: 0x%x\n", mModule->getModuleApiVersion()); result.appendFormat("Camera module name: %s\n", mModule->getModuleName()); result.appendFormat("Camera module author: %s\n", mModule->getModuleAuthor()); result.appendFormat("Number of camera devices: %d\n", mNumberOfCameras); result.appendFormat("Number of normal camera devices: %d\n", mNumberOfNormalCameras); String8 activeClientString = mActiveClientManager.toString(); String8 activeClientString = mActiveClientManager.toString(); result.appendFormat("Active Camera Clients:\n%s", activeClientString.string()); dprintf(fd, "Active Camera Clients:\n%s", activeClientString.string()); result.appendFormat("Allowed users:\n%s\n", toString(mAllowedUsers).string()); dprintf(fd, "Allowed user IDs: %s\n", toString(mAllowedUsers).string()); sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); if (desc == NULL) { result.appendFormat("Vendor tags left unimplemented.\n"); } else { result.appendFormat("Vendor tag definitions:\n"); } write(fd, result.string(), result.size()); if (desc != NULL) { desc->dump(fd, /*verbosity*/2, /*indentation*/4); } dumpEventLog(fd); dumpEventLog(fd); bool stateLocked = tryLock(mCameraStatesLock); bool stateLocked = tryLock(mCameraStatesLock); if (!stateLocked) { if (!stateLocked) { result = String8::format("CameraStates in use, may be deadlocked\n"); dprintf(fd, "CameraStates in use, may be deadlocked\n"); write(fd, result.string(), result.size()); } } for (auto& state : mCameraStates) { for (auto& state : mCameraStates) { String8 cameraId = state.first; String8 cameraId = state.first; result = String8::format("Camera %s information:\n", cameraId.string()); camera_info info; dprintf(fd, "== Camera device %s dynamic info: ==\n", cameraId.string()); CameraParameters p = state.second->getShimParams(); if (!p.isEmpty()) { dprintf(fd, " Camera1 API shim is using parameters:\n "); p.dump(fd, args); } auto clientDescriptor = mActiveClientManager.get(cameraId); if (clientDescriptor == nullptr) { dprintf(fd, " Device %s is closed, no client instance\n", cameraId.string()); continue; } dprintf(fd, " Device %s is open. Client instance dump:\n", cameraId.string()); dprintf(fd, " Client priority level: %d\n", clientDescriptor->getPriority()); dprintf(fd, " Client PID: %d\n", clientDescriptor->getOwnerId()); auto client = clientDescriptor->getValue(); dprintf(fd, " Client package: %s\n", String8(client->getPackageName()).string()); client->dumpClient(fd, args); if (mModule != nullptr) { dprintf(fd, "== Camera HAL device %s static information: ==\n", cameraId.string()); camera_info info; status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); status_t rc = mModule->getCameraInfo(cameraIdToInt(cameraId), &info); int deviceVersion = -1; if (rc != OK) { if (rc != OK) { result.appendFormat(" Error reading static information!\n"); dprintf(fd, " Error reading static information!\n"); write(fd, result.string(), result.size()); } else { } else { result.appendFormat(" Facing: %s\n", dprintf(fd, " Facing: %s\n", info.facing == CAMERA_FACING_BACK ? "BACK" : info.facing == CAMERA_FACING_BACK ? "BACK" : info.facing == CAMERA_FACING_FRONT ? "FRONT" : "EXTERNAL"); info.facing == CAMERA_FACING_FRONT ? "FRONT" : "EXTERNAL"); result.appendFormat(" Orientation: %d\n", info.orientation); dprintf(fd, " Orientation: %d\n", info.orientation); int deviceVersion; if (mModule->getModuleApiVersion() < CAMERA_MODULE_API_VERSION_2_0) { if (mModule->getModuleApiVersion() < CAMERA_MODULE_API_VERSION_2_0) { deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; deviceVersion = CAMERA_DEVICE_API_VERSION_1_0; } else { } else { deviceVersion = info.device_version; deviceVersion = info.device_version; } } } auto conflicting = state.second->getConflicting(); auto conflicting = state.second->getConflicting(); result.appendFormat(" Resource Cost: %d\n", state.second->getCost()); dprintf(fd, " Resource Cost: %d\n", state.second->getCost()); result.appendFormat(" Conflicting Devices:"); dprintf(fd, " Conflicting Devices:"); for (auto& id : conflicting) { for (auto& id : conflicting) { result.appendFormat(" %s", id.string()); dprintf(fd, " %s", id.string()); } } if (conflicting.size() == 0) { if (conflicting.size() == 0) { result.appendFormat(" NONE"); dprintf(fd, " NONE"); } } result.appendFormat("\n"); dprintf(fd, "\n"); result.appendFormat(" Device version: %#x\n", deviceVersion); dprintf(fd, " Device version: %#x\n", deviceVersion); if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_0) { if (deviceVersion >= CAMERA_DEVICE_API_VERSION_3_0) { result.appendFormat(" Device static metadata:\n"); dprintf(fd, " Device static metadata:\n"); write(fd, result.string(), result.size()); dump_indented_camera_metadata(info.static_camera_characteristics, dump_indented_camera_metadata(info.static_camera_characteristics, fd, /*verbosity*/2, /*indentation*/4); fd, /*verbosity*/2, /*indentation*/4); } else { write(fd, result.string(), result.size()); } CameraParameters p = state.second->getShimParams(); if (!p.isEmpty()) { result = String8::format(" Camera1 API shim is using parameters:\n "); write(fd, result.string(), result.size()); p.dump(fd, args); } } } } auto clientDescriptor = mActiveClientManager.get(cameraId); if (clientDescriptor == nullptr) { result = String8::format(" Device %s is closed, no client instance\n", cameraId.string()); write(fd, result.string(), result.size()); continue; } } hasClient = true; result = String8::format(" Device %s is open. Client instance dump:\n\n", cameraId.string()); result.appendFormat("Client priority level: %d\n", clientDescriptor->getPriority()); result.appendFormat("Client PID: %d\n", clientDescriptor->getOwnerId()); auto client = clientDescriptor->getValue(); if (stateLocked) mCameraStatesLock.unlock(); result.appendFormat("Client package: %s\n", String8(client->getPackageName()).string()); write(fd, result.string(), result.size()); client->dumpClient(fd, args); if (locked) mServiceLock.unlock(); if (mModule == nullptr) { mCameraProviderManager->dump(fd, args); } else { dprintf(fd, "\n== Camera Module HAL static info: ==\n"); dprintf(fd, "Camera module HAL API version: 0x%x\n", mModule->getHalApiVersion()); dprintf(fd, "Camera module API version: 0x%x\n", mModule->getModuleApiVersion()); dprintf(fd, "Camera module name: %s\n", mModule->getModuleName()); dprintf(fd, "Camera module author: %s\n", mModule->getModuleAuthor()); } } if (stateLocked) mCameraStatesLock.unlock(); dprintf(fd, "\n== Vendor tags: ==\n\n"); if (!hasClient) { sp<VendorTagDescriptor> desc = VendorTagDescriptor::getGlobalVendorTagDescriptor(); result = String8::format("\nNo active camera clients yet.\n"); if (desc == NULL) { write(fd, result.string(), result.size()); dprintf(fd, "No vendor tags.\n"); } else { desc->dump(fd, /*verbosity*/2, /*indentation*/2); } } if (locked) mServiceLock.unlock(); // Dump camera traces if there were any // Dump camera traces if there were any write(fd, "\n", 1); dprintf(fd, "\n"); camera3::CameraTraces::dump(fd, args); camera3::CameraTraces::dump(fd, args); // Process dump arguments, if any // Process dump arguments, if any Loading @@ -2904,19 +2888,18 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { if (i + 1 >= n) continue; if (i + 1 >= n) continue; String8 levelStr(args[i+1]); String8 levelStr(args[i+1]); int level = atoi(levelStr.string()); int level = atoi(levelStr.string()); result = String8::format("\nSetting log level to %d.\n", level); dprintf(fd, "\nSetting log level to %d.\n", level); setLogLevel(level); setLogLevel(level); write(fd, result.string(), result.size()); } else if (args[i] == unreachableOption) { } else if (args[i] == unreachableOption) { // Dump memory analysis // Dump memory analysis // TODO - should limit be an argument parameter? // TODO - should limit be an argument parameter? UnreachableMemoryInfo info; UnreachableMemoryInfo info; bool success = GetUnreachableMemory(info, /*limit*/ 10000); bool success = GetUnreachableMemory(info, /*limit*/ 10000); if (!success) { if (!success) { dprintf(fd, "\nUnable to dump unreachable memory. " dprintf(fd, "\n== Unable to dump unreachable memory. " "Try disabling SELinux enforcement.\n"); "Try disabling SELinux enforcement. ==\n"); } else { } else { dprintf(fd, "\nDumping unreachable memory:\n"); dprintf(fd, "\n== Dumping unreachable memory: ==\n"); std::string s = info.ToString(/*log_contents*/ true); std::string s = info.ToString(/*log_contents*/ true); write(fd, s.c_str(), s.size()); write(fd, s.c_str(), s.size()); } } Loading @@ -2926,21 +2909,19 @@ status_t CameraService::dump(int fd, const Vector<String16>& args) { } } void CameraService::dumpEventLog(int fd) { void CameraService::dumpEventLog(int fd) { String8 result = String8("\nPrior client events (most recent at top):\n"); dprintf(fd, "\n== Camera service events log (most recent at top): ==\n"); Mutex::Autolock l(mLogLock); Mutex::Autolock l(mLogLock); for (const auto& msg : mEventLog) { for (const auto& msg : mEventLog) { result.appendFormat(" %s\n", msg.string()); dprintf(fd, " %s\n", msg.string()); } } if (mEventLog.size() == DEFAULT_EVENT_LOG_LENGTH) { if (mEventLog.size() == DEFAULT_EVENT_LOG_LENGTH) { result.append(" ...\n"); dprintf(fd, " ...\n"); } else if (mEventLog.size() == 0) { } else if (mEventLog.size() == 0) { result.append(" [no events yet]\n"); dprintf(fd, " [no events yet]\n"); } } result.append("\n"); dprintf(fd, "\n"); write(fd, result.string(), result.size()); } } void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { void CameraService::handleTorchClientBinderDied(const wp<IBinder> &who) { Loading
services/camera/libcameraservice/api2/CameraDeviceClient.cpp +11 −14 Original line number Original line Diff line number Diff line Loading @@ -1285,37 +1285,34 @@ status_t CameraDeviceClient::dump(int fd, const Vector<String16>& args) { } } status_t CameraDeviceClient::dumpClient(int fd, const Vector<String16>& args) { status_t CameraDeviceClient::dumpClient(int fd, const Vector<String16>& args) { String8 result; dprintf(fd, " CameraDeviceClient[%s] (%p) dump:\n", result.appendFormat("CameraDeviceClient[%s] (%p) dump:\n", mCameraIdStr.string(), mCameraIdStr.string(), (getRemoteCallback() != NULL ? (getRemoteCallback() != NULL ? IInterface::asBinder(getRemoteCallback()).get() : NULL) ); IInterface::asBinder(getRemoteCallback()).get() : NULL) ); result.appendFormat(" Current client UID %u\n", mClientUid); dprintf(fd, " Current client UID %u\n", mClientUid); result.append(" State:\n"); dprintf(fd, " State:\n"); result.appendFormat(" Request ID counter: %d\n", mRequestIdCounter); dprintf(fd, " Request ID counter: %d\n", mRequestIdCounter); if (mInputStream.configured) { if (mInputStream.configured) { result.appendFormat(" Current input stream ID: %d\n", dprintf(fd, " Current input stream ID: %d\n", mInputStream.id); mInputStream.id); } else { } else { result.append(" No input stream configured.\n"); dprintf(fd, " No input stream configured.\n"); } } if (!mStreamMap.isEmpty()) { if (!mStreamMap.isEmpty()) { result.append(" Current output stream/surface IDs:\n"); dprintf(fd, " Current output stream/surface IDs:\n"); for (size_t i = 0; i < mStreamMap.size(); i++) { for (size_t i = 0; i < mStreamMap.size(); i++) { result.appendFormat(" Stream %d Surface %d\n", dprintf(fd, " Stream %d Surface %d\n", mStreamMap.valueAt(i).streamId(), mStreamMap.valueAt(i).streamId(), mStreamMap.valueAt(i).surfaceId()); mStreamMap.valueAt(i).surfaceId()); } } } else if (!mDeferredStreams.isEmpty()) { } else if (!mDeferredStreams.isEmpty()) { result.append(" Current deferred surface output stream IDs:\n"); dprintf(fd, " Current deferred surface output stream IDs:\n"); for (auto& streamId : mDeferredStreams) { for (auto& streamId : mDeferredStreams) { result.appendFormat(" Stream %d\n", streamId); dprintf(fd, " Stream %d\n", streamId); } } } else { } else { result.append(" No output streams configured.\n"); dprintf(fd, " No output streams configured.\n"); } } write(fd, result.string(), result.size()); // TODO: print dynamic/request section from most recent requests // TODO: print dynamic/request section from most recent requests mFrameProcessor->dump(fd, args); mFrameProcessor->dump(fd, args); Loading
services/camera/libcameraservice/common/CameraProviderManager.cpp +34 −7 Original line number Original line Diff line number Diff line Loading @@ -282,7 +282,6 @@ hardware::Return<void> CameraProviderManager::onRegistration( status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { std::lock_guard<std::mutex> lock(mInterfaceMutex); std::lock_guard<std::mutex> lock(mInterfaceMutex); dprintf(fd, "Available camera providers and devices:\n"); for (auto& provider : mProviders) { for (auto& provider : mProviders) { provider->dump(fd, args); provider->dump(fd, args); } } Loading Loading @@ -462,18 +461,46 @@ status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, } } status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { dprintf(fd, " %s: %zu devices:\n", mProviderName.c_str(), mDevices.size()); dprintf(fd, "== Camera Provider HAL %s (v2.4) static info: %zu devices: ==\n", mProviderName.c_str(), mDevices.size()); for (auto& device : mDevices) { for (auto& device : mDevices) { dprintf(fd, " %s: Resource cost: %d\n", device->mName.c_str(), dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), device->mResourceCost.resourceCost); device->mVersion.get_major(), device->mVersion.get_minor()); if (device->mResourceCost.conflictingDevices.size() > 0) { dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); if (device->mResourceCost.conflictingDevices.size() == 0) { dprintf(fd, " Conflicting devices: None\n"); } else { dprintf(fd, " Conflicting devices:\n"); dprintf(fd, " Conflicting devices:\n"); for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { dprintf(fd, " %s\n", dprintf(fd, " %s\n", device->mResourceCost.conflictingDevices[i].c_str()); device->mResourceCost.conflictingDevices[i].c_str()); } } } } dprintf(fd, " API1 info:\n"); dprintf(fd, " Has a flash unit: %s\n", device->hasFlashUnit() ? "true" : "false"); hardware::CameraInfo info; status_t res = device->getCameraInfo(&info); if (res != OK) { dprintf(fd, " <Error reading camera info: %s (%d)>\n", strerror(-res), res); } else { dprintf(fd, " Facing: %s\n", info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); dprintf(fd, " Orientation: %d\n", info.orientation); } CameraMetadata info2; res = device->getCameraCharacteristics(&info2); if (res == INVALID_OPERATION) { dprintf(fd, " API2 not directly supported\n"); } else if (res != OK) { dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", strerror(-res), res); } else { dprintf(fd, " API2 camera characteristics:\n"); info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); } } } return OK; return OK; } } Loading
services/camera/libcameraservice/utils/CameraTraces.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,7 @@ status_t CameraTraces::dump(int fd, const Vector<String16> &args __attribute__(( return BAD_VALUE; return BAD_VALUE; } } dprintf(fd, "Camera traces (%zu):\n", pcsList.size()); dprintf(fd, "== Camera error traces (%zu): ==\n", pcsList.size()); if (pcsList.empty()) { if (pcsList.empty()) { dprintf(fd, " No camera traces collected.\n"); dprintf(fd, " No camera traces collected.\n"); Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +1 −1 File changed.Contains only whitespace changes. Show changes