[Lldb-commits] [lldb] 1290869 - Show error messages from DebugSymbols DBGShellCommand agent
Jason Molenda via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 8 17:10:26 PDT 2023
Author: Jason Molenda
Date: 2023-08-08T17:10:20-07:00
New Revision: 1290869ef2f72b7d59a92fa3cd48e6da29686c71
URL: https://github.com/llvm/llvm-project/commit/1290869ef2f72b7d59a92fa3cd48e6da29686c71
DIFF: https://github.com/llvm/llvm-project/commit/1290869ef2f72b7d59a92fa3cd48e6da29686c71.diff
LOG: Show error messages from DebugSymbols DBGShellCommand agent
The DebugSymbols DBGShellsCommand, which can find the symbols
for binaries, has a mechanism to return error messages when
it cannot find a symbol file. Those errors were not printed
to the user for several corefile use case scenarios; this
patch fixes that.
Also add dyld/process logging for the LC_NOTE metadata parsers
in ObjectFileMachO, to help in seeing what lldb is basing its
searches on.
Differential Revision: https://reviews.llvm.org/D157160
Added:
Modified:
lldb/source/Core/DynamicLoader.cpp
lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
lldb/source/Symbol/LocateSymbolFileMacOSX.cpp
Removed:
################################################################################
diff --git a/lldb/source/Core/DynamicLoader.cpp b/lldb/source/Core/DynamicLoader.cpp
index 0d138d7bb34584..ce6a84e4e02269 100644
--- a/lldb/source/Core/DynamicLoader.cpp
+++ b/lldb/source/Core/DynamicLoader.cpp
@@ -8,6 +8,7 @@
#include "lldb/Target/DynamicLoader.h"
+#include "lldb/Core/Debugger.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ModuleList.h"
#include "lldb/Core/ModuleSpec.h"
@@ -235,6 +236,9 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
force_symbol_search);
if (FileSystem::Instance().Exists(module_spec.GetFileSpec())) {
module_sp = std::make_shared<Module>(module_spec);
+ } else if (force_symbol_search && error.AsCString("") &&
+ error.AsCString("")[0] != '\0') {
+ target.GetDebugger().GetErrorStream() << error.AsCString();
}
}
@@ -267,8 +271,8 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
if (value != LLDB_INVALID_ADDRESS) {
LLDB_LOGF(log,
"DynamicLoader::LoadBinaryWithUUIDAndAddress Loading "
- "binary UUID %s at %s 0x%" PRIx64,
- uuid.GetAsString().c_str(),
+ "binary %s UUID %s at %s 0x%" PRIx64,
+ name.str().c_str(), uuid.GetAsString().c_str(),
value_is_offset ? "offset" : "address", value);
module_sp->SetLoadAddress(target, value, value_is_offset, changed);
} else {
@@ -276,8 +280,8 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
// offset 0.
LLDB_LOGF(log,
"DynamicLoader::LoadBinaryWithUUIDAndAddress Loading "
- "binary UUID %s at file address",
- uuid.GetAsString().c_str());
+ "binary %s UUID %s at file address",
+ name.str().c_str(), uuid.GetAsString().c_str());
module_sp->SetLoadAddress(target, 0, true /* value_is_slide */,
changed);
}
@@ -285,8 +289,8 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
// In-memory image, load at its true address, offset 0.
LLDB_LOGF(log,
"DynamicLoader::LoadBinaryWithUUIDAndAddress Loading binary "
- "UUID %s from memory at address 0x%" PRIx64,
- uuid.GetAsString().c_str(), value);
+ "%s UUID %s from memory at address 0x%" PRIx64,
+ name.str().c_str(), uuid.GetAsString().c_str(), value);
module_sp->SetLoadAddress(target, 0, true /* value_is_slide */,
changed);
}
@@ -298,10 +302,26 @@ ModuleSP DynamicLoader::LoadBinaryWithUUIDAndAddress(
target.ModulesDidLoad(added_module);
}
} else {
- LLDB_LOGF(log, "Unable to find binary with UUID %s and load it at "
- "%s 0x%" PRIx64,
- uuid.GetAsString().c_str(),
- value_is_offset ? "offset" : "address", value);
+ if (force_symbol_search) {
+ Stream &s = target.GetDebugger().GetErrorStream();
+ s.Printf("Unable to find file");
+ if (!name.empty())
+ s.Printf(" %s", name.str().c_str());
+ if (uuid.IsValid())
+ s.Printf(" with UUID %s", uuid.GetAsString().c_str());
+ if (value != LLDB_INVALID_ADDRESS) {
+ if (value_is_offset)
+ s.Printf(" with slide 0x%" PRIx64, value);
+ else
+ s.Printf(" at address 0x%" PRIx64, value);
+ }
+ s.Printf("\n");
+ }
+ LLDB_LOGF(log,
+ "Unable to find binary %s with UUID %s and load it at "
+ "%s 0x%" PRIx64,
+ name.str().c_str(), uuid.GetAsString().c_str(),
+ value_is_offset ? "offset" : "address", value);
}
return module_sp;
diff --git a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
index 931d7d1f1b7bd6..3bf06b1af7875e 100644
--- a/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
+++ b/lldb/source/Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.cpp
@@ -767,9 +767,10 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
// to do anything useful. This will force a call to dsymForUUID if it
// exists, instead of depending on the DebugSymbols preferences being
// set.
+ Status kernel_search_error;
if (IsKernel()) {
- Status error;
- if (Symbols::DownloadObjectAndSymbolFile(module_spec, error, true)) {
+ if (Symbols::DownloadObjectAndSymbolFile(module_spec,
+ kernel_search_error, true)) {
if (FileSystem::Instance().Exists(module_spec.GetFileSpec())) {
m_module_sp = std::make_shared<Module>(module_spec.GetFileSpec(),
target.GetArchitecture());
@@ -807,9 +808,13 @@ bool DynamicLoaderDarwinKernel::KextImageInfo::LoadImageUsingMemoryModule(
}
if (IsKernel() && !m_module_sp) {
- Stream &s = target.GetDebugger().GetOutputStream();
+ Stream &s = target.GetDebugger().GetErrorStream();
s.Printf("WARNING: Unable to locate kernel binary on the debugger "
"system.\n");
+ if (kernel_search_error.Fail() && kernel_search_error.AsCString("") &&
+ kernel_search_error.AsCString("")[0] != '\0') {
+ s << kernel_search_error.AsCString();
+ }
}
}
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 1f200923f37d5f..8a3d0c65039f4e 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -5414,6 +5414,8 @@ uint32_t ObjectFileMachO::GetNumThreadContexts() {
std::string ObjectFileMachO::GetIdentifierString() {
std::string result;
+ Log *log(
+ GetLog(LLDBLog::Symbols | LLDBLog::Process | LLDBLog::DynamicLoader));
ModuleSP module_sp(GetModule());
if (module_sp) {
std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
@@ -5449,6 +5451,8 @@ std::string ObjectFileMachO::GetIdentifierString() {
result = buf;
if (buf)
free(buf);
+ LLDB_LOGF(log, "LC_NOTE 'kern ver str' found with text '%s'",
+ result.c_str());
return result;
}
}
@@ -5472,6 +5476,7 @@ std::string ObjectFileMachO::GetIdentifierString() {
buf) == ident_command.cmdsize) {
buf[ident_command.cmdsize - 1] = '\0';
result = buf;
+ LLDB_LOGF(log, "LC_IDENT found with text '%s'", result.c_str());
}
if (buf)
free(buf);
@@ -5484,6 +5489,7 @@ std::string ObjectFileMachO::GetIdentifierString() {
addr_t ObjectFileMachO::GetAddressMask() {
addr_t mask = 0;
+ Log *log(GetLog(LLDBLog::Process));
ModuleSP module_sp(GetModule());
if (module_sp) {
std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
@@ -5511,6 +5517,10 @@ addr_t ObjectFileMachO::GetAddressMask() {
if (num_addr_bits != 0) {
mask = ~((1ULL << num_addr_bits) - 1);
}
+ LLDB_LOGF(log,
+ "LC_NOTE 'addrable bits' found, value %d bits, "
+ "mask 0x%" PRIx64,
+ num_addr_bits, mask);
break;
}
}
@@ -5526,6 +5536,8 @@ bool ObjectFileMachO::GetCorefileMainBinaryInfo(addr_t &value,
bool &value_is_offset,
UUID &uuid,
ObjectFile::BinaryType &type) {
+ Log *log(
+ GetLog(LLDBLog::Symbols | LLDBLog::Process | LLDBLog::DynamicLoader));
value = LLDB_INVALID_ADDRESS;
value_is_offset = false;
uuid.Clear();
@@ -5605,20 +5617,31 @@ bool ObjectFileMachO::GetCorefileMainBinaryInfo(addr_t &value,
uuid = UUID(raw_uuid, sizeof(uuid_t));
// convert the "main bin spec" type into our
// ObjectFile::BinaryType enum
+ const char *typestr = "unrecognized type";
switch (binspec_type) {
case 0:
type = eBinaryTypeUnknown;
+ typestr = "uknown";
break;
case 1:
type = eBinaryTypeKernel;
+ typestr = "xnu kernel";
break;
case 2:
type = eBinaryTypeUser;
+ typestr = "userland dyld";
break;
case 3:
type = eBinaryTypeStandalone;
+ typestr = "standalone";
break;
}
+ LLDB_LOGF(log,
+ "LC_NOTE 'main bin spec' found, version %d type %d "
+ "(%s), value 0x%" PRIx64 " value-is-slide==%s uuid %s",
+ version, type, typestr, value,
+ value_is_offset ? "true" : "false",
+ uuid.GetAsString().c_str());
if (!m_data.GetU32(&offset, &log2_pagesize, 1))
return false;
if (version > 1 && !m_data.GetU32(&offset, &platform, 1))
@@ -6811,6 +6834,8 @@ bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
ObjectFileMachO::MachOCorefileAllImageInfos
ObjectFileMachO::GetCorefileAllImageInfos() {
MachOCorefileAllImageInfos image_infos;
+ Log *log(
+ GetLog(LLDBLog::Symbols | LLDBLog::Process | LLDBLog::DynamicLoader));
// Look for an "all image infos" LC_NOTE.
lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
@@ -6840,6 +6865,9 @@ ObjectFileMachO::GetCorefileAllImageInfos() {
// offset += 4; // uint32_t entries_size;
// offset += 4; // uint32_t unused;
+ LLDB_LOGF(log,
+ "LC_NOTE 'all image infos' found version %d with %d images",
+ version, imgcount);
offset = entries_fileoff;
for (uint32_t i = 0; i < imgcount; i++) {
// Read the struct image_entry.
@@ -6871,6 +6899,12 @@ ObjectFileMachO::GetCorefileAllImageInfos() {
vmaddr};
image_entry.segment_load_addresses.push_back(new_seg);
}
+ LLDB_LOGF(
+ log, " image entry: %s %s 0x%" PRIx64 " %s",
+ image_entry.filename.c_str(),
+ image_entry.uuid.GetAsString().c_str(), image_entry.load_address,
+ image_entry.currently_executing ? "currently executing"
+ : "not currently executing");
image_infos.all_image_infos.push_back(image_entry);
}
} else if (strcmp("load binary", data_owner) == 0) {
@@ -6890,6 +6924,14 @@ ObjectFileMachO::GetCorefileAllImageInfos() {
image_entry.slide = slide;
image_entry.currently_executing = true;
image_infos.all_image_infos.push_back(image_entry);
+ LLDB_LOGF(log,
+ "LC_NOTE 'load binary' found, filename %s uuid %s load "
+ "address 0x%" PRIx64 " slide 0x%" PRIx64,
+ filename.c_str(),
+ image_entry.uuid.IsValid()
+ ? image_entry.uuid.GetAsString().c_str()
+ : "00000000-0000-0000-0000-000000000000",
+ load_address, slide);
}
}
}
diff --git a/lldb/source/Symbol/LocateSymbolFileMacOSX.cpp b/lldb/source/Symbol/LocateSymbolFileMacOSX.cpp
index 8c52df5f2a0a75..943eae7e066fe0 100644
--- a/lldb/source/Symbol/LocateSymbolFileMacOSX.cpp
+++ b/lldb/source/Symbol/LocateSymbolFileMacOSX.cpp
@@ -330,7 +330,8 @@ FileSpec Symbols::FindSymbolFileInBundle(const FileSpec &dsym_bundle_fspec,
static bool GetModuleSpecInfoFromUUIDDictionary(CFDictionaryRef uuid_dict,
ModuleSpec &module_spec,
- Status &error) {
+ Status &error,
+ const std::string &command) {
Log *log = GetLog(LLDBLog::Host);
bool success = false;
if (uuid_dict != NULL && CFGetTypeID(uuid_dict) == CFDictionaryGetTypeID()) {
@@ -342,7 +343,10 @@ static bool GetModuleSpecInfoFromUUIDDictionary(CFDictionaryRef uuid_dict,
CFSTR("DBGError"));
if (cf_str && CFGetTypeID(cf_str) == CFStringGetTypeID()) {
if (CFCString::FileSystemRepresentation(cf_str, str)) {
- error.SetErrorString(str);
+ std::string errorstr = command;
+ errorstr += ":\n";
+ errorstr += str;
+ error.SetErrorString(errorstr);
}
}
@@ -652,7 +656,8 @@ bool Symbols::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,
CFCString uuid_cfstr(uuid_str.c_str());
CFDictionaryRef uuid_dict =
(CFDictionaryRef)CFDictionaryGetValue(plist.get(), uuid_cfstr.get());
- return GetModuleSpecInfoFromUUIDDictionary(uuid_dict, module_spec, error);
+ return GetModuleSpecInfoFromUUIDDictionary(uuid_dict, module_spec, error,
+ command.GetData());
}
if (const CFIndex num_values = ::CFDictionaryGetCount(plist.get())) {
@@ -661,13 +666,14 @@ bool Symbols::DownloadObjectAndSymbolFile(ModuleSpec &module_spec,
::CFDictionaryGetKeysAndValues(plist.get(), NULL,
(const void **)&values[0]);
if (num_values == 1) {
- return GetModuleSpecInfoFromUUIDDictionary(values[0], module_spec, error);
+ return GetModuleSpecInfoFromUUIDDictionary(values[0], module_spec, error,
+ command.GetData());
}
for (CFIndex i = 0; i < num_values; ++i) {
ModuleSpec curr_module_spec;
if (GetModuleSpecInfoFromUUIDDictionary(values[i], curr_module_spec,
- error)) {
+ error, command.GetData())) {
if (module_spec.GetArchitecture().IsCompatibleMatch(
curr_module_spec.GetArchitecture())) {
module_spec = curr_module_spec;
More information about the lldb-commits
mailing list