146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===-- ProcessMachCore.cpp ------------------------------------------*- C++ -*-===// 246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// The LLVM Compiler Infrastructure 446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// This file is distributed under the University of Illinois Open Source 646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// License. See LICENSE.TXT for details. 746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// 846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//===----------------------------------------------------------------------===// 946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C Includes 1146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <errno.h> 1246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include <stdlib.h> 1346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// C++ Includes 1546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "llvm/Support/MachO.h" 169ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "llvm/Support/MathExtras.h" 1746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Other libraries and framework includes 1946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/Debugger.h" 2046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/PluginManager.h" 2149ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2249ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Section.h" 2446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Core/State.h" 2546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Host/Host.h" 2649ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Symbol/ObjectFile.h" 2746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Target.h" 2846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "lldb/Target/Thread.h" 2946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 3046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Project includes 3146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ProcessMachCore.h" 3246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "ThreadMachCore.h" 3346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton#include "StopInfoMachException.h" 3446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 354d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton// Needed for the plug-in names for the dynamic loaders. 369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/MacOSX-DYLD/DynamicLoaderMacOSXDYLD.h" 379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton#include "Plugins/DynamicLoader/Darwin-Kernel/DynamicLoaderDarwinKernel.h" 389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 3946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb; 4046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonusing namespace lldb_private; 4146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 420e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 4346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginNameStatic() 4446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 450e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("mach-o-core"); 460e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 4746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 4846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 4946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonconst char * 5046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginDescriptionStatic() 5146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 5246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return "Mach-O core file debugging plug-in."; 5346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 5446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 5546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 5646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Terminate() 5746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 5846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton PluginManager::UnregisterPlugin (ProcessMachCore::CreateInstance); 5946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 6046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 6146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 6246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonlldb::ProcessSP 6346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CreateInstance (Target &target, Listener &listener, const FileSpec *crash_file) 6446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 6546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::ProcessSP process_sp; 6646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (crash_file) 6746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton process_sp.reset(new ProcessMachCore (target, listener, *crash_file)); 6846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return process_sp; 6946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 7046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 7146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool 7246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::CanDebug(Target &target, bool plugin_specified_by_name) 7346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 7446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (plugin_specified_by_name) 7546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 7646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 7746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // For now we are just making sure the file exists for a given module 7846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (!m_core_module_sp && m_core_file.Exists()) 7946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 80444fe998bf707bd076a70c3a779db8575533695eGreg Clayton ModuleSpec core_module_spec(m_core_file, target.GetArchitecture()); 81444fe998bf707bd076a70c3a779db8575533695eGreg Clayton Error error (ModuleList::GetSharedModule (core_module_spec, 829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp, 839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL, 859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton NULL)); 8646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 8746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (m_core_module_sp) 8846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 8946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const llvm::Triple &triple_ref = m_core_module_sp->GetArchitecture().GetTriple(); 90b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (triple_ref.getVendor() == llvm::Triple::Apple) 9146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 9246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 9346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile && core_objfile->GetType() == ObjectFile::eTypeCoreFile) 9446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 9546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 9846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return false; 9946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 10046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 10146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 10246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// ProcessMachCore constructor 10346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 10446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::ProcessMachCore(Target& target, Listener &listener, const FileSpec &core_file) : 10546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Process (target, listener), 10646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges (), 10746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_module_sp (), 10846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_file (core_file), 1099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr (LLDB_INVALID_ADDRESS), 1109ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name () 11146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 11246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 11346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 11446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 11546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Destructor 11646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 11746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::~ProcessMachCore() 11846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 11946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Clear(); 12046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // We need to call finalize on the process before destroying ourselves 12146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // to make sure all of the broadcaster cleanup goes as planned. If we 12246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // destruct this class, then Process::~Process() might have problems 12346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // trying to fully destroy the broadcaster. 12446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Finalize(); 12546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 12646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 12746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 12846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// PluginInterface 12946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 1300e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonConstString 13146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginName() 13246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 13346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return GetPluginNameStatic(); 13446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 13546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 13646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonuint32_t 13746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetPluginVersion() 13846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 13946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return 1; 14046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 14146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 1429ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonbool 1439ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoaderAddress (lldb::addr_t addr) 1449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 1459ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton llvm::MachO::mach_header header; 1469ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton Error error; 1479ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (DoReadMemory (addr, &header, sizeof(header), error) != sizeof(header)) 1489ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 1499ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (header.magic == llvm::MachO::HeaderMagic32Swapped || 1509ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic == llvm::MachO::HeaderMagic64Swapped) 1519ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1529ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic = llvm::ByteSwap_32(header.magic); 1539ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.cputype = llvm::ByteSwap_32(header.cputype); 1549ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.cpusubtype = llvm::ByteSwap_32(header.cpusubtype); 1559ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.filetype = llvm::ByteSwap_32(header.filetype); 1569ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.ncmds = llvm::ByteSwap_32(header.ncmds); 1579ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.sizeofcmds = llvm::ByteSwap_32(header.sizeofcmds); 1589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.flags = llvm::ByteSwap_32(header.flags); 1599ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1609ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1619ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // TODO: swap header if needed... 1625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea //printf("0x%16.16" PRIx64 ": magic = 0x%8.8x, file_type= %u\n", vaddr, header.magic, header.filetype); 1639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (header.magic == llvm::MachO::HeaderMagic32 || 1649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton header.magic == llvm::MachO::HeaderMagic64) 1659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Check MH_EXECUTABLE to see if we can find the mach image 1679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // that contains the shared library list. The dynamic loader 1689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // (dyld) is what contains the list for user applications, 1699ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // and the mach kernel contains a global that has the list 1709ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // of kexts to load 1719ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton switch (header.filetype) 1729ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1739ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton case llvm::MachO::HeaderFileTypeDynamicLinkEditor: 1745f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea //printf("0x%16.16" PRIx64 ": file_type = MH_DYLINKER\n", vaddr); 1759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Address of dyld "struct mach_header" in the core file 1769ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name = DynamicLoaderMacOSXDYLD::GetPluginNameStatic(); 1779ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr = addr; 1789ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 1799ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 1809ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton case llvm::MachO::HeaderFileTypeExecutable: 1815f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea //printf("0x%16.16" PRIx64 ": file_type = MH_EXECUTE\n", vaddr); 1829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Check MH_EXECUTABLE file types to see if the dynamic link object flag 1839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // is NOT set. If it isn't, then we have a mach_kernel. 1849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if ((header.flags & llvm::MachO::HeaderFlagBitIsDynamicLinkObject) == 0) 1859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 1869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_plugin_name = DynamicLoaderDarwinKernel::GetPluginNameStatic(); 1879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Address of the mach kernel "struct mach_header" in the core file. 1889ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_dyld_addr = addr; 1899ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return true; 1909ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1919ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton break; 1929ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1939ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 1949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return false; 1959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 1969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 19746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 19846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Control 19946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//---------------------------------------------------------------------- 20046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError 20146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoLoadCore () 20246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 20346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Error error; 2049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (!m_core_module_sp) 2059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 2069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton error.SetErrorString ("invalid core module"); 2079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return error; 2089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 2099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 21046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 21146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile == NULL) 21246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 21346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("invalid core object file"); 21446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 21546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2168775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton 2178775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton if (core_objfile->GetNumThreadContexts() == 0) 2188775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton { 2197cba7deac40f09618f8acf8aee08fe80bbb306bfGreg Clayton error.SetErrorString ("core file doesn't contain any LC_THREAD load commands, or the LC_THREAD architecture is not supported in this lldb"); 2208775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton return error; 2218775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton } 2228775adaaba9befbbcbc7d6f42ef3a28a917d7c91Greg Clayton 22346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton SectionList *section_list = core_objfile->GetSectionList(); 22446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (section_list == NULL) 22546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 22646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("core file has no sections"); 22746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 22846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 22946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 23046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_sections = section_list->GetNumSections(0); 23146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (num_sections == 0) 23246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 23346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton error.SetErrorString ("core file has no sections"); 23446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 23546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2369ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 237d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda SetCanJIT(false); 238d6d45ceeae51b6dbb9221a3cf82441afa212a7dcJason Molenda 2399ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton llvm::MachO::mach_header header; 2409ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton DataExtractor data (&header, 2419ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton sizeof(header), 2429ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp->GetArchitecture().GetByteOrder(), 2439ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_core_module_sp->GetArchitecture().GetAddressByteSize()); 2449ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 24546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton bool ranges_are_sorted = true; 24646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton addr_t vm_addr = 0; 24746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (uint32_t i=0; i<num_sections; ++i) 24846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 24946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton Section *section = section_list->GetSectionAtIndex (i).get(); 25046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (section) 25146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 25246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton lldb::addr_t section_vm_addr = section->GetFileAddress(); 25346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton FileRange file_range (section->GetFileOffset(), section->GetFileSize()); 25446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton VMRangeToFileOffset::Entry range_entry (section_vm_addr, 25546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton section->GetByteSize(), 25646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton file_range); 25746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 25846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (vm_addr > section_vm_addr) 25946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ranges_are_sorted = false; 26046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton vm_addr = section->GetFileAddress(); 26146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton VMRangeToFileOffset::Entry *last_entry = m_core_aranges.Back(); 2625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea// printf ("LC_SEGMENT[%u] arange=[0x%16.16" PRIx64 " - 0x%16.16" PRIx64 "), frange=[0x%8.8x - 0x%8.8x)\n", 2639ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// i, 2649ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.GetRangeBase(), 2659ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.GetRangeEnd(), 2669ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.data.GetRangeBase(), 2679ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton// range_entry.data.GetRangeEnd()); 2689ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 26946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (last_entry && 27046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->GetRangeEnd() == range_entry.GetRangeBase() && 27146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->data.GetRangeEnd() == range_entry.data.GetRangeBase()) 27246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 27346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->SetRangeEnd (range_entry.GetRangeEnd()); 27446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton last_entry->data.SetRangeEnd (range_entry.data.GetRangeEnd()); 2759ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton //puts("combine"); 27646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 27746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 27846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 27946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges.Append(range_entry); 28046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2819ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2829ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // After we have added this section to our m_core_aranges map, 2839ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // we can check the start of the section to see if it might 2849ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // contain dyld for user space apps, or the mach kernel file 2859ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // for kernel cores. 2869ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_addr == LLDB_INVALID_ADDRESS) 2879ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton GetDynamicLoaderAddress (section_vm_addr); 28846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 28946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 29046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (!ranges_are_sorted) 29146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 29246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_core_aranges.Sort(); 29346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 2949ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 2959ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Even if the architecture is set in the target, we need to override 2969ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // it to match the core file which is always single arch. 2979ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton ArchSpec arch (m_core_module_sp->GetArchitecture()); 2989ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (arch.GetCore() == ArchSpec::eCore_x86_32_i486) 2999ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton { 3009ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton arch.SetTriple ("i386", m_target.GetPlatform().get()); 3019ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton } 3029ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (arch.IsValid()) 3039ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton m_target.SetArchitecture(arch); 3049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 305cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda if (m_dyld_addr == LLDB_INVALID_ADDRESS) 306cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda { 3074d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton // We need to locate the main executable in the memory ranges 3084d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton // we have in the core file. We already checked the first address 3094d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton // in each memory zone above, so we just need to check each page 3104d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton // except the first page in each range and stop once we have found 3114d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton // our main executable 3124d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton const size_t num_core_aranges = m_core_aranges.GetSize(); 3134d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton for (size_t i=0; i<num_core_aranges && m_dyld_addr == LLDB_INVALID_ADDRESS; ++i) 314cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda { 3154d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton const VMRangeToFileOffset::Entry *entry = m_core_aranges.GetEntryAtIndex(i); 3164d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton lldb::addr_t section_vm_addr_start = entry->GetRangeBase(); 3174d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton lldb::addr_t section_vm_addr_end = entry->GetRangeEnd(); 3184d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton for (lldb::addr_t section_vm_addr = section_vm_addr_start + 0x1000; 3194d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton section_vm_addr < section_vm_addr_end; 3204d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton section_vm_addr += 0x1000) 3214d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton { 3224d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton if (GetDynamicLoaderAddress (section_vm_addr)) 3234d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton { 3244d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton break; 3254d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton } 3264d511cb4a04cce1793d6eab0aad0b138285930c1Greg Clayton } 327cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda } 328cd0dd8fa16ba32e4bed9326757b3978ba1155179Jason Molenda } 32946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return error; 33046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 33146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 3329ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonlldb_private::DynamicLoader * 3339ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::GetDynamicLoader () 3349ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 3359ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton if (m_dyld_ap.get() == NULL) 336f0c0882ff3fd98456c1814b495888092da2f13f6Jason Molenda m_dyld_ap.reset (DynamicLoader::FindPlugin(this, m_dyld_plugin_name.IsEmpty() ? NULL : m_dyld_plugin_name.GetCString())); 3379ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return m_dyld_ap.get(); 3389ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 33946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 340ae932359b80098532f3c3766fa9e6527352fbb67Greg Claytonbool 34146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 34246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 34346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (old_thread_list.GetSize(false) == 0) 34446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 34546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // Make up the thread the first time this is called so we can setup our one and only 34646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // core thread state. 34746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 34846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 34946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile) 35046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 35146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_threads = core_objfile->GetNumThreadContexts (); 35246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (lldb::tid_t tid = 0; tid < num_threads; ++tid) 35346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 35494a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham ThreadSP thread_sp(new ThreadMachCore (*this, tid)); 35546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton new_thread_list.AddThread (thread_sp); 35646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 35946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 36046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 36146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const uint32_t num_threads = old_thread_list.GetSize(false); 36246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton for (uint32_t i=0; i<num_threads; ++i) 36346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton new_thread_list.AddThread (old_thread_list.GetThreadAtIndex (i)); 36446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 365ae932359b80098532f3c3766fa9e6527352fbb67Greg Clayton return new_thread_list.GetSize(false) > 0; 36646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 36746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 36846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 36946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::RefreshStateAfterStop () 37046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 37146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // Let all threads recover from stopping and do any clean up based 37246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton // on the previous thread state (if any). 37346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_thread_list.RefreshStateAfterStop(); 37446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton //SetThreadStopInfo (m_last_stop_packet); 37546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 37646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 37746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonError 37846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoDestroy () 37946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 38046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return Error(); 38146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 38246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 38346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 38446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Queries 38546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 38646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 38746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonbool 38846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::IsAlive () 38946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 39046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return true; 39146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 39246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 393ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molendabool 394ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason MolendaProcessMachCore::WarnBeforeDetach () const 395ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda{ 396ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda return false; 397ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda} 398ba065cab7acc8ef7fbedc27af5d18c3a694a084aJason Molenda 39946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 40046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton// Process Memory 40146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton//------------------------------------------------------------------ 40246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonsize_t 4039ce953807eb814a93b449dc243de4f7bf32c3115Greg ClaytonProcessMachCore::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 4049ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton{ 4059ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // Don't allow the caching that lldb_private::Process::ReadMemory does 4069ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton // since in core files we have it all cached our our core file anyway. 4079ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return DoReadMemory (addr, buf, size, error); 4089ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton} 4099ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton 4109ce953807eb814a93b449dc243de4f7bf32c3115Greg Claytonsize_t 41146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::DoReadMemory (addr_t addr, void *buf, size_t size, Error &error) 41246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 41346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton ObjectFile *core_objfile = m_core_module_sp->GetObjectFile(); 41446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 41546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_objfile) 41646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 41746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const VMRangeToFileOffset::Entry *core_memory_entry = m_core_aranges.FindEntryThatContains (addr); 41846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (core_memory_entry) 41946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 42046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const addr_t offset = addr - core_memory_entry->GetRangeBase(); 42146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton const addr_t bytes_left = core_memory_entry->GetRangeEnd() - addr; 42246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton size_t bytes_to_read = size; 42346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (bytes_to_read > bytes_left) 42446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton bytes_to_read = bytes_left; 42546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return core_objfile->CopyData (core_memory_entry->data.GetRangeBase() + offset, bytes_to_read, buf); 42646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 42746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton else 42846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 4295f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea error.SetErrorStringWithFormat ("core file does not contain 0x%" PRIx64, addr); 43046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 43146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 43246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton return 0; 43346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 43446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 43546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 43646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Clear() 43746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 43846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton m_thread_list.Clear(); 43946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 44046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 44146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonvoid 44246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::Initialize() 44346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 44446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton static bool g_initialized = false; 44546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 44646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton if (g_initialized == false) 44746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton { 44846c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton g_initialized = true; 44946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 45046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton GetPluginDescriptionStatic(), 45146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton CreateInstance); 45246c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton } 45346c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 45446c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 45546c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Claytonaddr_t 45646c9a355af9b39db78c006b2a5cbf97d3c58d947Greg ClaytonProcessMachCore::GetImageInfoAddress() 45746c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton{ 4589ce953807eb814a93b449dc243de4f7bf32c3115Greg Clayton return m_dyld_addr; 45946c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton} 46046c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 46146c9a355af9b39db78c006b2a5cbf97d3c58d947Greg Clayton 46249ce8969d3154e1560106cfe530444c09410f217Greg Claytonlldb_private::ObjectFile * 46349ce8969d3154e1560106cfe530444c09410f217Greg ClaytonProcessMachCore::GetCoreObjectFile () 46449ce8969d3154e1560106cfe530444c09410f217Greg Clayton{ 46549ce8969d3154e1560106cfe530444c09410f217Greg Clayton return m_core_module_sp->GetObjectFile(); 46649ce8969d3154e1560106cfe530444c09410f217Greg Clayton} 467