[Lldb-commits] [lldb] Work around a bug in the interaction between newer dyld's and older simulator dyld's (PR #78004)

via lldb-commits lldb-commits at lists.llvm.org
Fri Jan 12 16:58:27 PST 2024


https://github.com/jimingham created https://github.com/llvm/llvm-project/pull/78004

There's a bad interaction between the macOS 14 dyld and the "dyld_sim" shim that comes from older (iOS 15) simulator downloads  that results in dyld reporting some modules twice in the return from the dyld callback to list modules. The records were identical, but lldb wasn't happy with seeing the duplicates...

Since it's not possible to load two different modules at the same address, this change just picks the first instance of any entries that have the same load address.

There really isn't a good way to test this patch.

>From d33979c75e9867eacbc424c0d0c91a8f1acf1590 Mon Sep 17 00:00:00 2001
From: Jim Ingham <jingham at apple.com>
Date: Fri, 12 Jan 2024 16:42:26 -0800
Subject: [PATCH] Work around a bug in the interaction between newer dyld's and
 older simulator dyld's that cause dyld to report some modules twice. Since
 it's not possible to load the different modules at the same address, this
 change just picks the first instance of any entries that have the same load
 address. There really isn't a good way to test this patch.

---
 lldb/tools/debugserver/source/MacOSX/MachProcess.mm | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
index 29fabd087ecbe1..93b976127ba45c 100644
--- a/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
+++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.mm
@@ -33,6 +33,7 @@
 #include <algorithm>
 #include <chrono>
 #include <map>
+#include <unordered_set>
 
 #include <TargetConditionals.h>
 #import <Foundation/Foundation.h>
@@ -1053,9 +1054,16 @@ static bool mach_header_validity_test(uint32_t magic, uint32_t cputype) {
     dyld_process_info info =
         m_dyld_process_info_create(m_task.TaskPort(), 0, &kern_ret);
     if (info) {
+      // There's a bug in the interaction between dyld and older dyld_sim's
+      // (e.g. from the iOS 15 simulator) that causes dyld to report the same
+      // binary twice.  We use this set to eliminate the duplicates.
+      __block std::unordered_set<uint64_t> seen_header_addrs;
       m_dyld_process_info_for_each_image(
           info,
           ^(uint64_t mach_header_addr, const uuid_t uuid, const char *path) {
+            auto res_pair = seen_header_addrs.insert(mach_header_addr);
+            if (!res_pair.second)
+              return;
             struct binary_image_information image;
             image.filename = path;
             uuid_copy(image.macho_info.uuid, uuid);



More information about the lldb-commits mailing list