Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/SOS/inc/specialthreadinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,16 @@

#define SPECIAL_THREADINFO_SIGNATURE "THREADINFO"

#if defined(HOST_ARM64) || defined(__arm64__) || defined(__aarch64__)
// Apple Silicon (arm64) macOS user-space VM is 47 bits. lldb's core reader
// rejects segments above 0x7FFF_FFFF_FFFF, so use a 47-bit-valid address.
// The legacy address is still probed for dumps produced by older createdump binaries.
const uint64_t SpecialThreadInfoAddress = 0x00007ffffff00000;
const uint64_t SpecialThreadInfoLegacyAddress = 0x7fffffff00000000;
#else
const uint64_t SpecialThreadInfoAddress = 0x7fffffff00000000;
const uint64_t SpecialThreadInfoLegacyAddress = 0x7fffffff00000000;
Comment thread
max-charlamb marked this conversation as resolved.
#endif

struct SpecialThreadInfoHeader
{
Expand Down
14 changes: 12 additions & 2 deletions src/SOS/lldbplugin/services.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2756,7 +2756,17 @@ LLDBServices::InitializeThreadInfo(lldb::SBProcess process)
}
SpecialThreadInfoHeader header;
lldb::SBError error;
size_t read = process.ReadMemory(SpecialThreadInfoAddress, &header, sizeof(SpecialThreadInfoHeader), error);
uint64_t threadInfoAddress = SpecialThreadInfoAddress;
size_t read = process.ReadMemory(threadInfoAddress, &header, sizeof(SpecialThreadInfoHeader), error);
if ((error.Fail() || read != sizeof(header) ||
strncmp(header.signature, SPECIAL_THREADINFO_SIGNATURE, sizeof(SPECIAL_THREADINFO_SIGNATURE)) != 0)
Comment thread
max-charlamb marked this conversation as resolved.
&& SpecialThreadInfoAddress != SpecialThreadInfoLegacyAddress)
{
// Fall back to the legacy address for dumps produced by older createdump binaries.
error.Clear();
threadInfoAddress = SpecialThreadInfoLegacyAddress;
read = process.ReadMemory(threadInfoAddress, &header, sizeof(SpecialThreadInfoHeader), error);
}
if (error.Fail() || read != sizeof(header))
{
return;
Expand All @@ -2775,7 +2785,7 @@ LLDBServices::InitializeThreadInfo(lldb::SBProcess process)
m_processId = header.pid;
m_threadInfos.clear();

uint64_t address = SpecialThreadInfoAddress + sizeof(header);
uint64_t address = threadInfoAddress + sizeof(header);
for (int index = 0; index < number; index++)
{
SpecialThreadInfoEntry entry;
Expand Down
Loading