[lldb] Fix FindProcessImpl() for iOS simulators (#139174)
# Benefit This patch fixes: 1. After `platform select ios-simulator`, `platform process list` will now print processes which are running in the iOS simulator. Previously, no process will be listed. 2. After `platform select ios-simulator`, `platform attach --name <name>` will succeed. Previously, it will error out saying no process is found. # Several bugs that is being fixed 1. During the process listing, add `aarch64` to the list of CPU types for which iOS simulators are checked for. 2. Given a candidate process, when checking for simulators, the original code will find the desired environment variable (`SIMULATOR_UDID`) and set the OS to iOS, but then the immediate next environment variable will set it back to macOS. 3. For processes running on simulator, set the triple's `Environment` to `Simulator`, so that such processes can pass the filtering [in this line](https://fburl.com/8nivnrjx). The original code leave it as the default `UnknownEnvironment`. # Manual test **With this patch:** ``` royshi-mac-home ~/public_llvm/build % bin/lldb (lldb) platform select ios-simulator (lldb) platform process list 240 matching processes were found on "ios-simulator" PID PARENT USER TRIPLE NAME ====== ====== ========== ============================== ============================ 40511 28844 royshi arm64-apple-ios-simulator FocusPlayground // my toy iOS app running on simulator ... // omit 28844 1 royshi arm64-apple-ios-simulator launchd_sim (lldb) process attach --name FocusPlayground Process 40511 stopped * thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP frame #0: 0x0000000104e3cb70 libsystem_kernel.dylib`mach_msg2_trap + 8 libsystem_kernel.dylib`mach_msg2_trap: -> 0x104e3cb70 <+8>: ret ... // omit ``` **Without this patch:** ``` $ bin/lldb (lldb) platform select ios-simulator (lldb) platform process list error: no processes were found on the "ios-simulator" platform (lldb) process attach --name FocusPlayground error: attach failed: could not find a process named FocusPlayground ``` # Unittest See PR.
This commit is contained in:
@@ -595,7 +595,9 @@ static bool GetMacOSXProcessArgs(const ProcessInstanceInfoMatch *match_info_ptr,
|
||||
const llvm::Triple::ArchType triple_arch = triple.getArch();
|
||||
const bool check_for_ios_simulator =
|
||||
(triple_arch == llvm::Triple::x86 ||
|
||||
triple_arch == llvm::Triple::x86_64);
|
||||
triple_arch == llvm::Triple::x86_64 ||
|
||||
triple_arch == llvm::Triple::aarch64);
|
||||
|
||||
const char *cstr = data.GetCStr(&offset);
|
||||
if (cstr) {
|
||||
process_info.GetExecutableFile().SetFile(cstr, FileSpec::Style::native);
|
||||
@@ -621,21 +623,20 @@ static bool GetMacOSXProcessArgs(const ProcessInstanceInfoMatch *match_info_ptr,
|
||||
}
|
||||
|
||||
Environment &proc_env = process_info.GetEnvironment();
|
||||
while ((cstr = data.GetCStr(&offset))) {
|
||||
if (cstr[0] == '\0')
|
||||
break;
|
||||
|
||||
if (check_for_ios_simulator) {
|
||||
if (strncmp(cstr, "SIMULATOR_UDID=", strlen("SIMULATOR_UDID=")) ==
|
||||
0)
|
||||
process_info.GetArchitecture().GetTriple().setOS(
|
||||
llvm::Triple::IOS);
|
||||
else
|
||||
process_info.GetArchitecture().GetTriple().setOS(
|
||||
llvm::Triple::MacOSX);
|
||||
}
|
||||
|
||||
proc_env.insert(cstr);
|
||||
bool is_simulator = false;
|
||||
llvm::StringRef env_var;
|
||||
while (!(env_var = data.GetCStr(&offset)).empty()) {
|
||||
if (check_for_ios_simulator &&
|
||||
env_var.starts_with("SIMULATOR_UDID="))
|
||||
is_simulator = true;
|
||||
proc_env.insert(env_var);
|
||||
}
|
||||
llvm::Triple &triple = process_info.GetArchitecture().GetTriple();
|
||||
if (is_simulator) {
|
||||
triple.setOS(llvm::Triple::IOS);
|
||||
triple.setEnvironment(llvm::Triple::Simulator);
|
||||
} else {
|
||||
triple.setOS(llvm::Triple::MacOSX);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -741,8 +742,8 @@ uint32_t Host::FindProcessesImpl(const ProcessInstanceInfoMatch &match_info,
|
||||
!match_info.ProcessIDsMatch(process_info))
|
||||
continue;
|
||||
|
||||
// Get CPU type first so we can know to look for iOS simulator is we have
|
||||
// x86 or x86_64
|
||||
// Get CPU type first so we can know to look for iOS simulator if we have
|
||||
// a compatible type.
|
||||
if (GetMacOSXProcessCPUType(process_info)) {
|
||||
if (GetMacOSXProcessArgs(&match_info, process_info)) {
|
||||
if (match_info.Matches(process_info))
|
||||
|
||||
Reference in New Issue
Block a user