summaryrefslogtreecommitdiffstats
path: root/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2011-07-12 17:06:17 +0000
committerGreg Clayton <gclayton@apple.com>2011-07-12 17:06:17 +0000
commitd16e1e596a8db9ff6200bf2f58cc6cd0b78d0d0d (patch)
tree3f1993a2b48e142cf896099fb2a9f3fa4cebbdcb /lldb/source/Plugins/DynamicLoader/MacOSX-Kernel
parent5fa8e20878280b30388e42b31c45de73800b14ad (diff)
downloadbcm5719-llvm-d16e1e596a8db9ff6200bf2f58cc6cd0b78d0d0d.tar.gz
bcm5719-llvm-d16e1e596a8db9ff6200bf2f58cc6cd0b78d0d0d.zip
Added the ability to _not_ skip the prologue when settings breakpoints
by name by adding an extra parameter to the lldb_private::Target breakpoint setting functions. Added a function in the DWARF symbol file plug-in that can dump errors and prints out which DWARF file the error is happening in so we can track down what used to be assertions easily. Fixed the MacOSX kernel plug-in to properly read the kext images and set the kext breakpoint to watch for kexts as they are loaded. llvm-svn: 134990
Diffstat (limited to 'lldb/source/Plugins/DynamicLoader/MacOSX-Kernel')
-rw-r--r--lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp60
-rw-r--r--lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h1
2 files changed, 40 insertions, 21 deletions
diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp b/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp
index 50004ce2715..609e6fc2c3a 100644
--- a/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp
+++ b/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.cpp
@@ -87,6 +87,7 @@ DynamicLoaderMacOSXKernel::CreateInstance (Process* process, bool force)
DynamicLoaderMacOSXKernel::DynamicLoaderMacOSXKernel (Process* process) :
DynamicLoader(process),
m_kernel(),
+ m_kext_summary_header_ptr_addr (),
m_kext_summary_header_addr (),
m_kext_summary_header (),
m_break_id (LLDB_INVALID_BREAK_ID),
@@ -150,6 +151,7 @@ DynamicLoaderMacOSXKernel::Clear (bool clear_process)
if (clear_process)
m_process = NULL;
m_kernel.Clear(false);
+ m_kext_summary_header_ptr_addr.Clear();
m_kext_summary_header_addr.Clear();
m_kext_summaries.clear();
m_break_id = LLDB_INVALID_BREAK_ID;
@@ -165,7 +167,7 @@ DynamicLoaderMacOSXKernel::Clear (bool clear_process)
void
DynamicLoaderMacOSXKernel::LoadKernelModuleIfNeeded()
{
- if (!m_kext_summary_header_addr.IsValid())
+ if (!m_kext_summary_header_ptr_addr.IsValid())
{
m_kernel.Clear(false);
m_kernel.module_sp = m_process->GetTarget().GetExecutableModule();
@@ -176,7 +178,7 @@ DynamicLoaderMacOSXKernel::LoadKernelModuleIfNeeded()
const Symbol *symbol = NULL;
symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (kext_summary_symbol, eSymbolTypeData);
if (symbol)
- m_kext_summary_header_addr = symbol->GetValue();
+ m_kext_summary_header_ptr_addr = symbol->GetValue();
symbol = m_kernel.module_sp->FindFirstSymbolWithNameAndType (mach_header_name, eSymbolTypeAbsolute);
if (symbol)
@@ -395,7 +397,15 @@ DynamicLoaderMacOSXKernel::BreakpointHit (StoppointCallbackContext *context,
user_id_t break_id,
user_id_t break_loc_id)
{
+ LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
+ if (log)
+ log->Printf ("DynamicLoaderMacOSXKernel::BreakpointHit (...)\n");
+
ReadAllKextSummaries ();
+
+ if (log)
+ PutToLog(log.get());
+
return GetStopWhenImagesChange();
}
@@ -408,7 +418,7 @@ DynamicLoaderMacOSXKernel::ReadKextSummaryHeader ()
// the all image infos is already valid for this process stop ID
m_kext_summaries.clear();
- if (m_kext_summary_header_addr.IsValid())
+ if (m_kext_summary_header_ptr_addr.IsValid())
{
const uint32_t addr_size = m_kernel.GetAddressByteSize ();
const ByteOrder byte_order = m_kernel.GetByteOrder();
@@ -419,17 +429,29 @@ DynamicLoaderMacOSXKernel::ReadKextSummaryHeader ()
DataExtractor data (buf, sizeof(buf), byte_order, addr_size);
const size_t count = 4 * sizeof(uint32_t) + addr_size;
const bool prefer_file_cache = false;
- const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error);
- if (bytes_read == count)
+ if (m_process->GetTarget().ReadPointerFromMemory (m_kext_summary_header_ptr_addr,
+ prefer_file_cache,
+ error,
+ m_kext_summary_header_addr))
{
- uint32_t offset = 0;
- m_kext_summary_header.version = data.GetU32(&offset);
- m_kext_summary_header.entry_size = data.GetU32(&offset);
- m_kext_summary_header.entry_count = data.GetU32(&offset);
- m_kext_summary_header.reserved = data.GetU32(&offset);
- return true;
+ // We got a valid address for our kext summary header and make sure it isn't NULL
+ if (m_kext_summary_header_addr.IsValid() &&
+ m_kext_summary_header_addr.GetFileAddress() != 0)
+ {
+ const size_t bytes_read = m_process->GetTarget().ReadMemory (m_kext_summary_header_addr, prefer_file_cache, buf, count, error);
+ if (bytes_read == count)
+ {
+ uint32_t offset = 0;
+ m_kext_summary_header.version = data.GetU32(&offset);
+ m_kext_summary_header.entry_size = data.GetU32(&offset);
+ m_kext_summary_header.entry_count = data.GetU32(&offset);
+ m_kext_summary_header.reserved = data.GetU32(&offset);
+ return true;
+ }
+ }
}
}
+ m_kext_summary_header_addr.Clear();
return false;
}
@@ -471,16 +493,9 @@ DynamicLoaderMacOSXKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::c
{
// Now add these images to the main list.
ModuleList loaded_module_list;
- LogSP log(GetLogIfAnyCategoriesSet (LIBLLDB_LOG_DYNAMIC_LOADER));
for (uint32_t idx = 0; idx < image_infos.size(); ++idx)
{
- if (log)
- {
- log->Printf ("Adding new image at address=0x%16.16llx.", image_infos[idx].address);
- image_infos[idx].PutToLog (log.get());
- }
-
m_kext_summaries.push_back(image_infos[idx]);
if (FindTargetModule (image_infos[idx], true, NULL))
@@ -517,8 +532,8 @@ DynamicLoaderMacOSXKernel::AddModulesUsingImageInfos (OSKextLoadedKextSummary::c
}
}
}
- if (log)
- loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXKernel::ModulesDidLoad");
+// if (log)
+// loaded_module_list.LogUUIDAndPaths (log, "DynamicLoaderMacOSXKernel::ModulesDidLoad");
m_process->GetTarget().ModulesDidLoad (loaded_module_list);
}
return true;
@@ -895,11 +910,14 @@ DynamicLoaderMacOSXKernel::SetNotificationBreakpointIfNeeded ()
{
DEBUG_PRINTF("DynamicLoaderMacOSXKernel::%s() process state = %s\n", __FUNCTION__, StateAsCString(m_process->GetState()));
+
const bool internal_bp = false;
+ const LazyBool skip_prologue = eLazyBoolNo;
Breakpoint *bp = m_process->GetTarget().CreateBreakpoint (&m_kernel.module_sp->GetFileSpec(),
"OSKextLoadedKextSummariesUpdated",
eFunctionNameTypeFull,
- internal_bp).get();
+ internal_bp,
+ skip_prologue).get();
bp->SetCallback (DynamicLoaderMacOSXKernel::BreakpointHitCallback, this, true);
m_break_id = bp->GetID();
diff --git a/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h b/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h
index 53d3c60037c..c2066f56269 100644
--- a/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h
+++ b/lldb/source/Plugins/DynamicLoader/MacOSX-Kernel/DynamicLoaderMacOSXKernel.h
@@ -411,6 +411,7 @@ protected:
UnloadImageLoadAddress (OSKextLoadedKextSummary& info);
OSKextLoadedKextSummary m_kernel; // Info about the current kernel image being used
+ lldb_private::Address m_kext_summary_header_ptr_addr;
lldb_private::Address m_kext_summary_header_addr;
OSKextLoadedKextSummaryHeader m_kext_summary_header;
OSKextLoadedKextSummary::collection m_kext_summaries;
OpenPOWER on IntegriCloud