From caa5c3947fc399ccd90e336d9403f67ee1ab001b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 12 Jun 2024 10:44:25 +0200 Subject: [PATCH] iOS: Fix slow debugging with recent Xcode and iOS < 17 When starting the debugger, we need to pass it the location of the downloaded device symbols, or otherwise debugger startup is very slow. Xcode changes the location where it saves this information once in a while, and it must have again. The location with Xcode 15.2 at least is in the style "iPhone8,1 15.7.3 (19H307)", i.e. it starts with the "product type" now. Retrieve the product type of the device and add another candidate directory for device symbols. Fixes: QTCREATORBUG-31044 Change-Id: I1a65305fc84c1af8cd48c4ebb249167e1dbe6ae1 Reviewed-by: Marcus Tillmanns --- src/plugins/ios/devicectlutils.cpp | 1 + src/plugins/ios/devicectlutils.h | 1 + src/plugins/ios/iosdevice.cpp | 9 ++++++++- src/plugins/ios/iosdevice.h | 1 + src/plugins/ios/iosrunner.cpp | 17 ++++++++++------- src/tools/iostool/iosdevicemanager.cpp | 2 ++ .../ios/devicectlutils/tst_devicectlutils.cpp | 1 + 7 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/plugins/ios/devicectlutils.cpp b/src/plugins/ios/devicectlutils.cpp index 7bbed859b27..667f1bc54a9 100644 --- a/src/plugins/ios/devicectlutils.cpp +++ b/src/plugins/ios/devicectlutils.cpp @@ -73,6 +73,7 @@ expected_str> parseDeviceInfo(const QByteArray &rawOutput info[kOsVersion] = QLatin1String("%1 (%2)") .arg(device["deviceProperties"]["osVersionNumber"].toString(), device["deviceProperties"]["osBuildUpdate"].toString()); + info[kProductType] = device["hardwareProperties"]["productType"].toString(); info[kCpuArchitecture] = device["hardwareProperties"]["cpuType"]["name"].toString(); info[kUniqueDeviceId] = udid; return info; diff --git a/src/plugins/ios/devicectlutils.h b/src/plugins/ios/devicectlutils.h index 106fee78a23..cb470cff29a 100644 --- a/src/plugins/ios/devicectlutils.h +++ b/src/plugins/ios/devicectlutils.h @@ -13,6 +13,7 @@ const char kDeviceName[] = "deviceName"; const char kDeveloperStatus[] = "developerStatus"; const char kDeviceConnected[] = "deviceConnected"; const char kOsVersion[] = "osVersion"; +const char kProductType[] = "productType"; const char kCpuArchitecture[] = "cpuArchitecture"; const char kUniqueDeviceId[] = "uniqueDeviceId"; const char vOff[] = "*off*"; diff --git a/src/plugins/ios/iosdevice.cpp b/src/plugins/ios/iosdevice.cpp index e81c263672b..0dd75896e06 100644 --- a/src/plugins/ios/iosdevice.cpp +++ b/src/plugins/ios/iosdevice.cpp @@ -92,8 +92,9 @@ public: Form { Tr::tr("Device name:"), iosDevice->deviceName(), br, Tr::tr("Identifier:"), iosDevice->uniqueInternalDeviceId(), br, + Tr::tr("Product type:"), iosDevice->productType(), br, + Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(), br, Tr::tr("OS Version:"), iosDevice->osVersion(), br, - Tr::tr("CPU Architecture:"), iosDevice->cpuArchitecture(), noMargin }.attachTo(this); // clang-format on @@ -193,6 +194,11 @@ QString IosDevice::osVersion() const return m_extraInfo.value(kOsVersion); } +QString IosDevice::productType() const +{ + return m_extraInfo.value(kProductType); +} + QString IosDevice::cpuArchitecture() const { return m_extraInfo.value(kCpuArchitecture); @@ -227,6 +233,7 @@ IosDeviceManager::TranslationMap IosDeviceManager::translationMap() tMap[QLatin1String("NO")] = Tr::tr("no"); tMap[QLatin1String("*unknown*")] = Tr::tr("unknown"); tMap[kOsVersion] = Tr::tr("OS version"); + tMap[kProductType] = Tr::tr("Product type"); translationMap = &tMap; return tMap; } diff --git a/src/plugins/ios/iosdevice.h b/src/plugins/ios/iosdevice.h index 62a7f2bb93a..b8ec2871347 100644 --- a/src/plugins/ios/iosdevice.h +++ b/src/plugins/ios/iosdevice.h @@ -37,6 +37,7 @@ public: QString uniqueDeviceID() const; QString uniqueInternalDeviceId() const; QString osVersion() const; + QString productType() const; QString cpuArchitecture() const; Utils::Port nextPort() const; Handler handler() const; diff --git a/src/plugins/ios/iosrunner.cpp b/src/plugins/ios/iosrunner.cpp index 863a2867b8a..1d4bd33aa11 100644 --- a/src/plugins/ios/iosrunner.cpp +++ b/src/plugins/ios/iosrunner.cpp @@ -813,14 +813,17 @@ void IosDebugSupport::start() setStartMode(AttachToRemoteProcess); setIosPlatform("remote-ios"); const QString osVersion = dev->osVersion(); + const QString productType = dev->productType(); const QString cpuArchitecture = dev->cpuArchitecture(); - const FilePaths symbolsPathCandidates = { - FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" - + osVersion + " " + cpuArchitecture + "/Symbols"), - FilePath::fromString(QDir::homePath() + "/Library/Developer/Xcode/iOS DeviceSupport/" - + osVersion + "/Symbols"), - IosConfigurations::developerPath().pathAppended( - "Platforms/iPhoneOS.platform/DeviceSupport/" + osVersion + "/Symbols")}; + const FilePath home = FilePath::fromString(QDir::homePath()); + const FilePaths symbolsPathCandidates + = {home / "Library/Developer/Xcode/iOS DeviceSupport" / (productType + " " + osVersion) + / "Symbols", + home / "Library/Developer/Xcode/iOS DeviceSupport" + / (osVersion + " " + cpuArchitecture) / "Symbols", + home / "Library/Developer/Xcode/iOS DeviceSupport" / osVersion / "Symbols", + IosConfigurations::developerPath() / "Platforms/iPhoneOS.platform/DeviceSupport" + / osVersion / "Symbols"}; const FilePath deviceSdk = Utils::findOrDefault(symbolsPathCandidates, &FilePath::isDir); if (deviceSdk.isEmpty()) { diff --git a/src/tools/iostool/iosdevicemanager.cpp b/src/tools/iostool/iosdevicemanager.cpp index d492e6f78dc..3f523807857 100644 --- a/src/tools/iostool/iosdevicemanager.cpp +++ b/src/tools/iostool/iosdevicemanager.cpp @@ -1662,6 +1662,7 @@ void DevInfoSession::deviceCallbackReturned() const QString osVersionKey = "osVersion"; const QString cpuArchitectureKey = "cpuArchitecture"; const QString uniqueDeviceId = "uniqueDeviceId"; + const QString productType = "productType"; bool failure = !device; if (!failure) { failure = !connectDevice(); @@ -1669,6 +1670,7 @@ void DevInfoSession::deviceCallbackReturned() res[deviceConnectedKey] = QLatin1String("YES"); res[deviceNameKey] = getStringValue(device, nullptr, CFSTR("DeviceName")); res[uniqueDeviceId] = getStringValue(device, nullptr, CFSTR("UniqueDeviceID")); + res[productType] = getStringValue(device, nullptr, CFSTR("ProductType")); const QString productVersion = getStringValue(device, nullptr, CFSTR("ProductVersion")); res[developerStatusKey] = getStringValue(device, CFSTR("com.apple.xcode.developerdomain"), diff --git a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp index f75497f68a3..8924c58a867 100644 --- a/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp +++ b/tests/auto/ios/devicectlutils/tst_devicectlutils.cpp @@ -287,6 +287,7 @@ void tst_Devicectlutils::parseDeviceInfo_data() {"deviceConnected", "YES"}, {"deviceName", "Some iOS device"}, {"osVersion", "17.3 (21D50)"}, + {"productType", "iPad11,2"}, {"uniqueDeviceId", "00000000-0000000000000000"}}); QTest::addRow("unhandled device") << data << QString("000000000000000000000001")