[Lldb-commits] [lldb] 58c506d - Correctly identify iOS simulator processes in debugserver.
Adrian Prantl via lldb-commits
lldb-commits at lists.llvm.org
Fri Mar 6 10:01:10 PST 2020
Author: Adrian Prantl
Date: 2020-03-06T09:59:30-08:00
New Revision: 58c506d8e8d9d55d3fb1f4ae508eb53231557f8c
URL: https://github.com/llvm/llvm-project/commit/58c506d8e8d9d55d3fb1f4ae508eb53231557f8c
DIFF: https://github.com/llvm/llvm-project/commit/58c506d8e8d9d55d3fb1f4ae508eb53231557f8c.diff
LOG: Correctly identify iOS simulator processes in debugserver.
Starting with iOS 13 simulator binaries are identified with an
explicit platform in the new LC_BUILD_VERSION load command.
On older deployment targets using the LC_VERSION_MIN load commands,
this patch detects when an ios process runs on a macOS host and
updates the target triple with the "simulator" environment
accordingly.
(Patch re-applied without modifications, the bot failure was unrelated).
This is part of https://bugs.swift.org/browse/SR-11971
rdar://problem/58438125
Differential Revision: https://reviews.llvm.org/D75696
Added:
lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
Modified:
lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
lldb/tools/debugserver/source/MacOSX/MachProcess.mm
Removed:
################################################################################
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
index 6021c2664b06..500527221ebb 100644
--- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
+++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp
@@ -1131,6 +1131,20 @@ bool GDBRemoteCommunicationClient::GetDefaultThreadId(lldb::tid_t &tid) {
return true;
}
+static void ParseOSType(llvm::StringRef value, std::string &os_name,
+ std::string &environment) {
+ if (value.equals("iossimulator") || value.equals("tvossimulator") ||
+ value.equals("watchossimulator")) {
+ environment = "simulator";
+ os_name = value.drop_back(environment.size()).str();
+ } else if (value.equals("maccatalyst")) {
+ os_name = "ios";
+ environment = "macabi";
+ } else {
+ os_name = value.str();
+ }
+}
+
bool GDBRemoteCommunicationClient::GetHostInfo(bool force) {
Log *log(ProcessGDBRemoteLog::GetLogIfAnyCategoryIsSet(GDBR_LOG_PROCESS));
@@ -1189,11 +1203,7 @@ bool GDBRemoteCommunicationClient::GetHostInfo(bool force) {
extractor.GetHexByteString(m_os_kernel);
++num_keys_decoded;
} else if (name.equals("ostype")) {
- if (value.equals("maccatalyst")) {
- os_name = "ios";
- environment = "macabi";
- } else
- os_name = std::string(value);
+ ParseOSType(value, os_name, environment);
++num_keys_decoded;
} else if (name.equals("vendor")) {
vendor_name = std::string(value);
@@ -2053,11 +2063,7 @@ bool GDBRemoteCommunicationClient::GetCurrentProcessInfo(bool allow_lazy) {
extractor.GetHexByteString(triple);
++num_keys_decoded;
} else if (name.equals("ostype")) {
- if (value.equals("maccatalyst")) {
- os_name = "ios";
- environment = "macabi";
- } else
- os_name = std::string(value);
+ ParseOSType(value, os_name, environment);
++num_keys_decoded;
} else if (name.equals("vendor")) {
vendor_name = std::string(value);
diff --git a/lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py b/lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
new file mode 100644
index 000000000000..ff165672b197
--- /dev/null
+++ b/lldb/test/API/functionalities/gdb_remote_client/TestIOSSimulator.py
@@ -0,0 +1,58 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from gdbclientutils import *
+
+class TestIOSSimulator(GDBRemoteTestBase):
+ """
+ Test that an ios simulator process is recognized as such.
+ """
+
+ class MyResponder(MockGDBServerResponder):
+ def __init__(self, host, process):
+ self.host_ostype = host
+ self.process_ostype = process
+ MockGDBServerResponder.__init__(self)
+
+ def qHostInfo(self):
+ return "cputype:16777223;cpusubtype:8;ostype:%s;vendor:apple;os_version:10.15.4;maccatalyst_version:13.4;endian:little;ptrsize:8;"%self.host_ostype
+ def qProcessInfo(self):
+ return "pid:a860;parent-pid:d2a0;real-uid:1f5;real-gid:14;effective-uid:1f5;effective-gid:14;cputype:1000007;cpusubtype:8;ptrsize:8;ostype:%s;vendor:apple;endian:little;"%self.process_ostype
+ def vCont(self):
+ return "vCont;"
+
+ def platform_test(self, host, process, expected_triple):
+ self.server.responder = self.MyResponder(host, process)
+ if self.TraceOn():
+ self.runCmd("log enable gdb-remote packets")
+ self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets"))
+
+ target = self.dbg.CreateTargetWithFileAndArch(None, None)
+ process = self.connect(target)
+ triple = target.GetTriple()
+ self.assertEqual(triple, expected_triple)
+
+ @skipIfRemote
+ def test_macos(self):
+ self.platform_test(host="macosx", process="macosx",
+ expected_triple="x86_64h-apple-macosx-")
+
+ @skipIfRemote
+ def test_ios_sim(self):
+ self.platform_test(host="macosx", process="iossimulator",
+ expected_triple="x86_64h-apple-ios-simulator")
+
+ @skipIfRemote
+ def test_catalyst(self):
+ self.platform_test(host="macosx", process="maccatalyst",
+ expected_triple="x86_64h-apple-ios-macabi")
+
+ @skipIfRemote
+ def test_tvos_sim(self):
+ self.platform_test(host="macosx", process="tvossimulator",
+ expected_triple="x86_64h-apple-tvos-simulator")
+
+ @skipIfRemote
+ def test_tvos_sim(self):
+ self.platform_test(host="macosx", process="watchossimulator",
+ expected_triple="x86_64h-apple-watchos-simulator")
diff --git a/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py b/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
index 8d0f2c89b73b..fe24bff44d5d 100644
--- a/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
+++ b/lldb/test/API/functionalities/gdb_remote_client/TestWasm.py
@@ -31,8 +31,6 @@ def __init__(self, obj_path, module_name = ""):
MockGDBServerResponder.__init__(self)
def respond(self, packet):
- if packet == "qProcessInfo":
- return self.qProcessInfo()
if packet[0:13] == "qRegisterInfo":
return self.qRegisterInfo(packet[13:])
return MockGDBServerResponder.respond(self, packet)
diff --git a/lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py b/lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
index 5b0247994ed5..cebd3d2b6eea 100644
--- a/lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
+++ b/lldb/test/API/functionalities/gdb_remote_client/gdbclientutils.py
@@ -170,6 +170,8 @@ def respond(self, packet):
return self.qQueryGDBServer()
if packet == "qHostInfo":
return self.qHostInfo()
+ if packet == "qProcessInfo":
+ return self.qProcessInfo()
if packet == "qGetWorkingDir":
return self.qGetWorkingDir()
if packet == "qOffsets":
@@ -196,6 +198,9 @@ def qOffsets(self):
def qHostInfo(self):
return "ptrsize:8;endian:little;"
+ def qProcessInfo(self):
+ return "pid:1;ptrsize:8;endian:little;"
+
def qQueryGDBServer(self):
return "E04"
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
index f6134e48a048..c862de973829 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
@@ -598,6 +598,16 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
plo_pthread_tsd_entry_size);
}
+/// Determine whether this is running on macOS.
+/// Since debugserver runs on the same machine as the process, we can
+/// just look at the compilation target.
+static bool IsMacOSHost() {
+#if TARGET_OS_OSX == 1
+ return true;
+#else
+ return false;
+#endif
+}
const char *MachProcess::GetDeploymentInfo(const struct load_command& lc,
uint64_t load_command_address,
@@ -619,15 +629,17 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
minor_version = (vers_cmd.sdk >> 8) & 0xffu;
patch_version = vers_cmd.sdk & 0xffu;
+ // Handle the older LC_VERSION load commands, which don't
+ // distinguish between simulator and real hardware.
switch (cmd) {
case LC_VERSION_MIN_IPHONEOS:
- return "ios";
+ return IsMacOSHost() ? "iossimulator": "ios";
case LC_VERSION_MIN_MACOSX:
return "macosx";
case LC_VERSION_MIN_TVOS:
- return "tvos";
+ return IsMacOSHost() ? "tvossimulator": "tvos";
case LC_VERSION_MIN_WATCHOS:
- return "watchos";
+ return IsMacOSHost() ? "watchossimulator" : "watchos";
default:
return nullptr;
}
@@ -649,14 +661,17 @@ static bool FBSAddEventDataToOptions(NSMutableDictionary *options,
case PLATFORM_MACCATALYST:
return "maccatalyst";
case PLATFORM_IOS:
- case PLATFORM_IOSSIMULATOR:
return "ios";
+ case PLATFORM_IOSSIMULATOR:
+ return "iossimulator";
case PLATFORM_TVOS:
- case PLATFORM_TVOSSIMULATOR:
return "tvos";
+ case PLATFORM_TVOSSIMULATOR:
+ return "tvossimulator";
case PLATFORM_WATCHOS:
- case PLATFORM_WATCHOSSIMULATOR:
return "watchos";
+ case PLATFORM_WATCHOSSIMULATOR:
+ return "watchossimulator";
case PLATFORM_BRIDGEOS:
return "bridgeos";
case PLATFORM_DRIVERKIT:
More information about the lldb-commits
mailing list