130fdc8d8SChris Lattner //===-- MachProcess.h -------------------------------------------*- C++ -*-===// 230fdc8d8SChris Lattner // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 630fdc8d8SChris Lattner // 730fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 830fdc8d8SChris Lattner // 930fdc8d8SChris Lattner // Created by Greg Clayton on 6/15/07. 1030fdc8d8SChris Lattner // 1130fdc8d8SChris Lattner //===----------------------------------------------------------------------===// 1230fdc8d8SChris Lattner 13cdc514e4SJonas Devlieghere #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHPROCESS_H 14cdc514e4SJonas Devlieghere #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHPROCESS_H 1530fdc8d8SChris Lattner 16b9c1b51eSKate Stone #include <CoreFoundation/CoreFoundation.h> 17a2992311SJason Molenda #include <mach-o/loader.h> 18b9c1b51eSKate Stone #include <mach/mach.h> 19c611a740SJason Molenda #include <pthread.h> 20b9c1b51eSKate Stone #include <sys/signal.h> 21a2992311SJason Molenda #include <uuid/uuid.h> 22c611a740SJason Molenda #include <vector> 23c611a740SJason Molenda 2430fdc8d8SChris Lattner #include "DNBBreakpoint.h" 25b9c1b51eSKate Stone #include "DNBDefs.h" 2630fdc8d8SChris Lattner #include "DNBError.h" 27c4e411ffSGreg Clayton #include "DNBThreadResumeActions.h" 28b9c1b51eSKate Stone #include "Genealogy.h" 29b9c1b51eSKate Stone #include "JSONGenerator.h" 3030fdc8d8SChris Lattner #include "MachException.h" 3130fdc8d8SChris Lattner #include "MachTask.h" 3230fdc8d8SChris Lattner #include "MachThreadList.h" 33b9c1b51eSKate Stone #include "MachVMMemory.h" 3430fdc8d8SChris Lattner #include "PThreadCondition.h" 3530fdc8d8SChris Lattner #include "PThreadEvent.h" 3630fdc8d8SChris Lattner #include "PThreadMutex.h" 37bff4673bSJim Ingham #include "RNBContext.h" 38705b1809SJason Molenda #include "ThreadInfo.h" 3930fdc8d8SChris Lattner 4030fdc8d8SChris Lattner class DNBThreadResumeActions; 4130fdc8d8SChris Lattner 42b9c1b51eSKate Stone class MachProcess { 4330fdc8d8SChris Lattner public: 4430fdc8d8SChris Lattner // Constructors and Destructors 4530fdc8d8SChris Lattner MachProcess(); 4630fdc8d8SChris Lattner ~MachProcess(); 4730fdc8d8SChris Lattner 48a2992311SJason Molenda // A structure that can hold everything debugserver needs to know from 49a2992311SJason Molenda // a binary's Mach-O header / load commands. 50a2992311SJason Molenda 51b9c1b51eSKate Stone struct mach_o_segment { 52a2992311SJason Molenda std::string name; 53a2992311SJason Molenda uint64_t vmaddr; 54a2992311SJason Molenda uint64_t vmsize; 55a2992311SJason Molenda uint64_t fileoff; 56a2992311SJason Molenda uint64_t filesize; 57a2992311SJason Molenda uint64_t maxprot; 58a2992311SJason Molenda uint64_t initprot; 59a2992311SJason Molenda uint64_t nsects; 60a2992311SJason Molenda uint64_t flags; 61a2992311SJason Molenda }; 62a2992311SJason Molenda 63b9c1b51eSKate Stone struct mach_o_information { 64a2992311SJason Molenda struct mach_header_64 mach_header; 65a2992311SJason Molenda std::vector<struct mach_o_segment> segments; 66a2992311SJason Molenda uuid_t uuid; 67df8aef43SJason Molenda std::string min_version_os_name; 68df8aef43SJason Molenda std::string min_version_os_version; 69a2992311SJason Molenda }; 70a2992311SJason Molenda 71b9c1b51eSKate Stone struct binary_image_information { 72a2992311SJason Molenda std::string filename; 73a2992311SJason Molenda uint64_t load_address; 74a2992311SJason Molenda uint64_t mod_date; // may not be available - 0 if so 75a2992311SJason Molenda struct mach_o_information macho_info; 76*ac49e902SJason Molenda bool is_valid_mach_header; 77a2992311SJason Molenda binary_image_informationbinary_image_information78b9c1b51eSKate Stone binary_image_information() 79*ac49e902SJason Molenda : filename(), load_address(INVALID_NUB_ADDRESS), mod_date(0), 80*ac49e902SJason Molenda is_valid_mach_header(false) {} 81a2992311SJason Molenda }; 82a2992311SJason Molenda 8330fdc8d8SChris Lattner // Child process control 84bff4673bSJim Ingham pid_t AttachForDebug(pid_t pid, 85bff4673bSJim Ingham const RNBContext::IgnoredExceptions &ignored_exceptions, 86bff4673bSJim Ingham char *err_str, 8727012c0fSAlessandro Arzilli size_t err_len); 88b9c1b51eSKate Stone pid_t LaunchForDebug(const char *path, char const *argv[], char const *envp[], 89b9c1b51eSKate Stone const char *working_directory, const char *stdin_path, 90b9c1b51eSKate Stone const char *stdout_path, const char *stderr_path, 91b9c1b51eSKate Stone bool no_stdio, nub_launch_flavor_t launch_flavor, 9227012c0fSAlessandro Arzilli int disable_aslr, const char *event_data, 93bff4673bSJim Ingham const RNBContext::IgnoredExceptions &ignored_exceptions, 94bff4673bSJim Ingham DNBError &err); 9571337622SGreg Clayton 9671337622SGreg Clayton static uint32_t GetCPUTypeForLocalProcess(pid_t pid); 97b9c1b51eSKate Stone static pid_t ForkChildForPTraceDebugging(const char *path, char const *argv[], 986779606aSGreg Clayton char const *envp[], 99b9c1b51eSKate Stone MachProcess *process, DNBError &err); 100b9c1b51eSKate Stone static pid_t PosixSpawnChildForPTraceDebugging( 1010db37576SJonas Devlieghere const char *path, cpu_type_t cpu_type, cpu_subtype_t cpu_subtype, 1020db37576SJonas Devlieghere char const *argv[], char const *envp[], const char *working_directory, 1030db37576SJonas Devlieghere const char *stdin_path, const char *stdout_path, const char *stderr_path, 1040db37576SJonas Devlieghere bool no_stdio, MachProcess *process, int disable_aslr, DNBError &err); 10530fdc8d8SChris Lattner nub_addr_t GetDYLDAllImageInfosAddress(); 106b9c1b51eSKate Stone static const void *PrepareForAttach(const char *path, 107b9c1b51eSKate Stone nub_launch_flavor_t launch_flavor, 108b9c1b51eSKate Stone bool waitfor, DNBError &err_str); 109b9c1b51eSKate Stone static void CleanupAfterAttach(const void *attach_token, 110b9c1b51eSKate Stone nub_launch_flavor_t launch_flavor, 111b9c1b51eSKate Stone bool success, DNBError &err_str); 112b9c1b51eSKate Stone static nub_process_t CheckForProcess(const void *attach_token, 113b9c1b51eSKate Stone nub_launch_flavor_t launch_flavor); 114c611a740SJason Molenda #if defined(WITH_BKS) || defined(WITH_FBS) 115b9c1b51eSKate Stone pid_t BoardServiceLaunchForDebug(const char *app_bundle_path, 116b9c1b51eSKate Stone char const *argv[], char const *envp[], 117b9c1b51eSKate Stone bool no_stdio, bool disable_aslr, 118bff4673bSJim Ingham const char *event_data, 119bff4673bSJim Ingham const RNBContext::IgnoredExceptions &ignored_exceptions, 120b9c1b51eSKate Stone DNBError &launch_err); 121b9c1b51eSKate Stone pid_t BoardServiceForkChildForPTraceDebugging( 122b9c1b51eSKate Stone const char *path, char const *argv[], char const *envp[], bool no_stdio, 123b9c1b51eSKate Stone bool disable_aslr, const char *event_data, DNBError &launch_err); 124c611a740SJason Molenda bool BoardServiceSendEvent(const char *event, DNBError &error); 125c611a740SJason Molenda #endif 126b9c1b51eSKate Stone static bool GetOSVersionNumbers(uint64_t *major, uint64_t *minor, 127b9c1b51eSKate Stone uint64_t *patch); 1286cebeafaSJason Molenda static std::string GetMacCatalystVersionString(); 129a332978bSJason Molenda #ifdef WITH_BKS 130b9c1b51eSKate Stone static void BKSCleanupAfterAttach(const void *attach_token, 131b9c1b51eSKate Stone DNBError &err_str); 132c611a740SJason Molenda #endif // WITH_BKS 133c611a740SJason Molenda #ifdef WITH_FBS 134b9c1b51eSKate Stone static void FBSCleanupAfterAttach(const void *attach_token, 135b9c1b51eSKate Stone DNBError &err_str); 136c611a740SJason Molenda #endif // WITH_FBS 13742999a48SJason Molenda #ifdef WITH_SPRINGBOARD 138b9c1b51eSKate Stone pid_t SBLaunchForDebug(const char *app_bundle_path, char const *argv[], 139b9c1b51eSKate Stone char const *envp[], bool no_stdio, bool disable_aslr, 14027012c0fSAlessandro Arzilli bool unmask_signals, DNBError &launch_err); 141b9c1b51eSKate Stone static pid_t SBForkChildForPTraceDebugging(const char *path, 142b9c1b51eSKate Stone char const *argv[], 143b9c1b51eSKate Stone char const *envp[], bool no_stdio, 144b9c1b51eSKate Stone MachProcess *process, 145b9c1b51eSKate Stone DNBError &launch_err); 146c611a740SJason Molenda #endif // WITH_SPRINGBOARD 14730fdc8d8SChris Lattner nub_addr_t LookupSymbol(const char *name, const char *shlib); SetNameToAddressCallback(DNBCallbackNameToAddress callback,void * baton)148b9c1b51eSKate Stone void SetNameToAddressCallback(DNBCallbackNameToAddress callback, 149b9c1b51eSKate Stone void *baton) { 15030fdc8d8SChris Lattner m_name_to_addr_callback = callback; 15130fdc8d8SChris Lattner m_name_to_addr_baton = baton; 15230fdc8d8SChris Lattner } 153b9c1b51eSKate Stone void SetSharedLibraryInfoCallback(DNBCallbackCopyExecutableImageInfos callback,void * baton)154b9c1b51eSKate Stone SetSharedLibraryInfoCallback(DNBCallbackCopyExecutableImageInfos callback, 155b9c1b51eSKate Stone void *baton) { 15630fdc8d8SChris Lattner m_image_infos_callback = callback; 15730fdc8d8SChris Lattner m_image_infos_baton = baton; 15830fdc8d8SChris Lattner } 15930fdc8d8SChris Lattner 16030fdc8d8SChris Lattner bool Resume(const DNBThreadResumeActions &thread_actions); 16130fdc8d8SChris Lattner bool Signal(int signal, const struct timespec *timeout_abstime = NULL); 1624296c221SGreg Clayton bool Interrupt(); 163a332978bSJason Molenda bool SendEvent(const char *event, DNBError &send_err); 16430fdc8d8SChris Lattner bool Kill(const struct timespec *timeout_abstime = NULL); 16530fdc8d8SChris Lattner bool Detach(); 16630fdc8d8SChris Lattner nub_size_t ReadMemory(nub_addr_t addr, nub_size_t size, void *buf); 16730fdc8d8SChris Lattner nub_size_t WriteMemory(nub_addr_t addr, nub_size_t size, const void *buf); 16830fdc8d8SChris Lattner 16930fdc8d8SChris Lattner // Path and arg accessors Path()17030fdc8d8SChris Lattner const char *Path() const { return m_path.c_str(); } ArgumentCount()17130fdc8d8SChris Lattner size_t ArgumentCount() const { return m_args.size(); } ArgumentAtIndex(size_t arg_idx)172b9c1b51eSKate Stone const char *ArgumentAtIndex(size_t arg_idx) const { 17330fdc8d8SChris Lattner if (arg_idx < m_args.size()) 17430fdc8d8SChris Lattner return m_args[arg_idx].c_str(); 17530fdc8d8SChris Lattner return NULL; 17630fdc8d8SChris Lattner } 17730fdc8d8SChris Lattner 17830fdc8d8SChris Lattner // Breakpoint functions 179b9c1b51eSKate Stone DNBBreakpoint *CreateBreakpoint(nub_addr_t addr, nub_size_t length, 180b9c1b51eSKate Stone bool hardware); 181d8cf1a11SGreg Clayton bool DisableBreakpoint(nub_addr_t addr, bool remove); 182d8cf1a11SGreg Clayton void DisableAllBreakpoints(bool remove); 183d8cf1a11SGreg Clayton bool EnableBreakpoint(nub_addr_t addr); Breakpoints()18430fdc8d8SChris Lattner DNBBreakpointList &Breakpoints() { return m_breakpoints; } Breakpoints()18530fdc8d8SChris Lattner const DNBBreakpointList &Breakpoints() const { return m_breakpoints; } 18630fdc8d8SChris Lattner 18730fdc8d8SChris Lattner // Watchpoint functions 188b9c1b51eSKate Stone DNBBreakpoint *CreateWatchpoint(nub_addr_t addr, nub_size_t length, 189b9c1b51eSKate Stone uint32_t watch_type, bool hardware); 190d8cf1a11SGreg Clayton bool DisableWatchpoint(nub_addr_t addr, bool remove); 191d8cf1a11SGreg Clayton void DisableAllWatchpoints(bool remove); 192d8cf1a11SGreg Clayton bool EnableWatchpoint(nub_addr_t addr); 19364637205SJohnny Chen uint32_t GetNumSupportedHardwareWatchpoints() const; Watchpoints()19430fdc8d8SChris Lattner DNBBreakpointList &Watchpoints() { return m_watchpoints; } Watchpoints()19530fdc8d8SChris Lattner const DNBBreakpointList &Watchpoints() const { return m_watchpoints; } 19630fdc8d8SChris Lattner 19730fdc8d8SChris Lattner // Exception thread functions 19830fdc8d8SChris Lattner bool StartSTDIOThread(); 19930fdc8d8SChris Lattner static void *STDIOThread(void *arg); 20030fdc8d8SChris Lattner void ExceptionMessageReceived(const MachException::Message &exceptionMessage); 201bb492890SGreg Clayton task_t ExceptionMessageBundleComplete(); 20230fdc8d8SChris Lattner void SharedLibrariesUpdated(); 203b9c1b51eSKate Stone nub_size_t CopyImageInfos(struct DNBExecutableImageInfo **image_infos, 204b9c1b51eSKate Stone bool only_changed); 20530fdc8d8SChris Lattner 206ab3b8b22SHan Ming Ong // Profile functions 207b9c1b51eSKate Stone void SetEnableAsyncProfiling(bool enable, uint64_t internal_usec, 208b9c1b51eSKate Stone DNBProfileDataScanType scan_type); IsProfilingEnabled()209ab3b8b22SHan Ming Ong bool IsProfilingEnabled() { return m_profile_enabled; } ProfileInterval()210ee2ed525SGreg Clayton useconds_t ProfileInterval() { return m_profile_interval_usec; } 211ab3b8b22SHan Ming Ong bool StartProfileThread(); 212ab3b8b22SHan Ming Ong static void *ProfileThread(void *arg); 213ab3b8b22SHan Ming Ong void SignalAsyncProfileData(const char *info); 214ab3b8b22SHan Ming Ong size_t GetAsyncProfileData(char *buf, size_t buf_size); 215ab3b8b22SHan Ming Ong 21630fdc8d8SChris Lattner // Accessors ProcessID()21730fdc8d8SChris Lattner pid_t ProcessID() const { return m_pid; } ProcessIDIsValid()21830fdc8d8SChris Lattner bool ProcessIDIsValid() const { return m_pid > 0; } 21930fdc8d8SChris Lattner pid_t SetProcessID(pid_t pid); Task()22030fdc8d8SChris Lattner MachTask &Task() { return m_task; } Task()22130fdc8d8SChris Lattner const MachTask &Task() const { return m_task; } 22230fdc8d8SChris Lattner Events()22330fdc8d8SChris Lattner PThreadEvent &Events() { return m_events; } 224b9c1b51eSKate Stone const DNBRegisterSetInfo *GetRegisterSetInfo(nub_thread_t tid, 225b9c1b51eSKate Stone nub_size_t *num_reg_sets) const; 226b9c1b51eSKate Stone bool GetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, 227b9c1b51eSKate Stone DNBRegisterValue *reg_value) const; 228b9c1b51eSKate Stone bool SetRegisterValue(nub_thread_t tid, uint32_t set, uint32_t reg, 229b9c1b51eSKate Stone const DNBRegisterValue *value) const; 230279ceecfSJim Ingham nub_bool_t SyncThreadState(nub_thread_t tid); 23130fdc8d8SChris Lattner const char *ThreadGetName(nub_thread_t tid); 23230fdc8d8SChris Lattner nub_state_t ThreadGetState(nub_thread_t tid); 233b9c1b51eSKate Stone ThreadInfo::QoS GetRequestedQoS(nub_thread_t tid, nub_addr_t tsd, 234b9c1b51eSKate Stone uint64_t dti_qos_class_index); 235705b1809SJason Molenda nub_addr_t GetPThreadT(nub_thread_t tid); 236705b1809SJason Molenda nub_addr_t GetDispatchQueueT(nub_thread_t tid); 237b9c1b51eSKate Stone nub_addr_t 238b9c1b51eSKate Stone GetTSDAddressForThread(nub_thread_t tid, 239b9c1b51eSKate Stone uint64_t plo_pthread_tsd_base_address_offset, 240b9c1b51eSKate Stone uint64_t plo_pthread_tsd_base_offset, 241b9c1b51eSKate Stone uint64_t plo_pthread_tsd_entry_size); 242116b1033SAdrian Prantl 243116b1033SAdrian Prantl struct DeploymentInfo { 244116b1033SAdrian Prantl DeploymentInfo() = default; 245116b1033SAdrian Prantl operator bool() { return platform > 0; } 246116b1033SAdrian Prantl /// The Mach-O platform type; 247116b1033SAdrian Prantl unsigned char platform = 0; 248116b1033SAdrian Prantl uint32_t major_version = 0; 249116b1033SAdrian Prantl uint32_t minor_version = 0; 250116b1033SAdrian Prantl uint32_t patch_version = 0; 251116b1033SAdrian Prantl }; 252116b1033SAdrian Prantl DeploymentInfo GetDeploymentInfo(const struct load_command &, 2537e9bab6aSAdrian Prantl uint64_t load_command_address, 2547e9bab6aSAdrian Prantl bool is_executable); 255116b1033SAdrian Prantl static const char *GetPlatformString(unsigned char platform); 2566cebeafaSJason Molenda bool GetMachOInformationFromMemory(uint32_t platform, 2576cebeafaSJason Molenda nub_addr_t mach_o_header_addr, 258b9c1b51eSKate Stone int wordsize, 259b9c1b51eSKate Stone struct mach_o_information &inf); 260b9c1b51eSKate Stone JSONGenerator::ObjectSP FormatDynamicLibrariesIntoJSON( 261b9c1b51eSKate Stone const std::vector<struct binary_image_information> &image_infos); 2628dd10602Skuperxu uint32_t GetPlatform(); 2637e9bab6aSAdrian Prantl /// Get the runtime platform from DYLD via SPI. 2647e9bab6aSAdrian Prantl uint32_t GetProcessPlatformViaDYLDSPI(); 2657e9bab6aSAdrian Prantl /// Use the dyld SPI present in macOS 10.12, iOS 10, tvOS 10, 2667e9bab6aSAdrian Prantl /// watchOS 3 and newer to get the load address, uuid, and filenames 2677e9bab6aSAdrian Prantl /// of all the libraries. This only fills in those three fields in 2687e9bab6aSAdrian Prantl /// the 'struct binary_image_information' - call 2697e9bab6aSAdrian Prantl /// GetMachOInformationFromMemory to fill in the mach-o header/load 2707e9bab6aSAdrian Prantl /// command details. 2717e9bab6aSAdrian Prantl void GetAllLoadedBinariesViaDYLDSPI( 272b9c1b51eSKate Stone std::vector<struct binary_image_information> &image_infos); 273b9c1b51eSKate Stone JSONGenerator::ObjectSP GetLoadedDynamicLibrariesInfos( 274b9c1b51eSKate Stone nub_process_t pid, nub_addr_t image_list_address, nub_addr_t image_count); 275b9c1b51eSKate Stone JSONGenerator::ObjectSP 276b9c1b51eSKate Stone GetLibrariesInfoForAddresses(nub_process_t pid, 277b9c1b51eSKate Stone std::vector<uint64_t> &macho_addresses); 278a2992311SJason Molenda JSONGenerator::ObjectSP GetAllLoadedLibrariesInfos(nub_process_t pid); 279a2992311SJason Molenda JSONGenerator::ObjectSP GetSharedCacheInfo(nub_process_t pid); 280705b1809SJason Molenda 28130fdc8d8SChris Lattner nub_size_t GetNumThreads() const; 28230fdc8d8SChris Lattner nub_thread_t GetThreadAtIndex(nub_size_t thread_idx) const; 28330fdc8d8SChris Lattner nub_thread_t GetCurrentThread(); 284d5318c0cSJason Molenda nub_thread_t GetCurrentThreadMachPort(); 28530fdc8d8SChris Lattner nub_thread_t SetCurrentThread(nub_thread_t tid); GetThreadList()28658d1c9a4SGreg Clayton MachThreadList &GetThreadList() { return m_thread_list; } 287b9c1b51eSKate Stone bool GetThreadStoppedReason(nub_thread_t tid, 288b9c1b51eSKate Stone struct DNBThreadStopInfo *stop_info); 28930fdc8d8SChris Lattner void DumpThreadStoppedReason(nub_thread_t tid) const; 29030fdc8d8SChris Lattner const char *GetThreadInfo(nub_thread_t tid) const; 29130fdc8d8SChris Lattner 2921c73911dSJason Molenda nub_thread_t GetThreadIDForMachPortNumber(thread_t mach_port_number) const; 2931c73911dSJason Molenda 29471337622SGreg Clayton uint32_t GetCPUType(); 29530fdc8d8SChris Lattner nub_state_t GetState(); 29630fdc8d8SChris Lattner void SetState(nub_state_t state); IsRunning(nub_state_t state)297b9c1b51eSKate Stone bool IsRunning(nub_state_t state) { 29830fdc8d8SChris Lattner return state == eStateRunning || IsStepping(state); 29930fdc8d8SChris Lattner } IsStepping(nub_state_t state)300b9c1b51eSKate Stone bool IsStepping(nub_state_t state) { return state == eStateStepping; } CanResume(nub_state_t state)301b9c1b51eSKate Stone bool CanResume(nub_state_t state) { return state == eStateStopped; } 30230fdc8d8SChris Lattner GetExitStatus(int * status)303b9c1b51eSKate Stone bool GetExitStatus(int *status) { 304b9c1b51eSKate Stone if (GetState() == eStateExited) { 30530fdc8d8SChris Lattner if (status) 30630fdc8d8SChris Lattner *status = m_exit_status; 30730fdc8d8SChris Lattner return true; 30830fdc8d8SChris Lattner } 30930fdc8d8SChris Lattner return false; 31030fdc8d8SChris Lattner } SetExitStatus(int status)311b9c1b51eSKate Stone void SetExitStatus(int status) { 31230fdc8d8SChris Lattner m_exit_status = status; 31330fdc8d8SChris Lattner SetState(eStateExited); 31430fdc8d8SChris Lattner } GetExitInfo()315b9c1b51eSKate Stone const char *GetExitInfo() { return m_exit_info.c_str(); } 316a332978bSJason Molenda 317bb492890SGreg Clayton void SetExitInfo(const char *info); 31830fdc8d8SChris Lattner StopCount()31930fdc8d8SChris Lattner uint32_t StopCount() const { return m_stop_count; } SetChildFileDescriptors(int stdin_fileno,int stdout_fileno,int stderr_fileno)320b9c1b51eSKate Stone void SetChildFileDescriptors(int stdin_fileno, int stdout_fileno, 321b9c1b51eSKate Stone int stderr_fileno) { 32230fdc8d8SChris Lattner m_child_stdin = stdin_fileno; 32330fdc8d8SChris Lattner m_child_stdout = stdout_fileno; 32430fdc8d8SChris Lattner m_child_stderr = stderr_fileno; 32530fdc8d8SChris Lattner } 32630fdc8d8SChris Lattner GetStdinFileDescriptor()32730fdc8d8SChris Lattner int GetStdinFileDescriptor() const { return m_child_stdin; } GetStdoutFileDescriptor()32830fdc8d8SChris Lattner int GetStdoutFileDescriptor() const { return m_child_stdout; } GetStderrFileDescriptor()32930fdc8d8SChris Lattner int GetStderrFileDescriptor() const { return m_child_stderr; } 33030fdc8d8SChris Lattner void AppendSTDOUT(char *s, size_t len); 33130fdc8d8SChris Lattner size_t GetAvailableSTDOUT(char *buf, size_t buf_size); 33230fdc8d8SChris Lattner size_t GetAvailableSTDERR(char *buf, size_t buf_size); CloseChildFileDescriptors()333b9c1b51eSKate Stone void CloseChildFileDescriptors() { 334b9c1b51eSKate Stone if (m_child_stdin >= 0) { 33530fdc8d8SChris Lattner ::close(m_child_stdin); 33630fdc8d8SChris Lattner m_child_stdin = -1; 33730fdc8d8SChris Lattner } 338b9c1b51eSKate Stone if (m_child_stdout >= 0) { 33930fdc8d8SChris Lattner ::close(m_child_stdout); 34030fdc8d8SChris Lattner m_child_stdout = -1; 34130fdc8d8SChris Lattner } 342b9c1b51eSKate Stone if (m_child_stderr >= 0) { 34330fdc8d8SChris Lattner ::close(m_child_stderr); 34430fdc8d8SChris Lattner m_child_stderr = -1; 34530fdc8d8SChris Lattner } 34630fdc8d8SChris Lattner } 34730fdc8d8SChris Lattner 3483bf883eaSJason Molenda void CalculateBoardStatus(); 3493bf883eaSJason Molenda 3503bf883eaSJason Molenda bool ProcessUsingBackBoard(); 3513bf883eaSJason Molenda 3523bf883eaSJason Molenda bool ProcessUsingFrontBoard(); 3538764fe7dSHan Ming Ong 354afee0975SJason Molenda // Size of addresses in the inferior process (4 or 8). 355afee0975SJason Molenda int GetInferiorAddrSize(pid_t pid); 356afee0975SJason Molenda 357b9c1b51eSKate Stone Genealogy::ThreadActivitySP GetGenealogyInfoForThread(nub_thread_t tid, 358b9c1b51eSKate Stone bool &timed_out); 359705b1809SJason Molenda 360705b1809SJason Molenda Genealogy::ProcessExecutableInfoSP GetGenealogyImageInfo(size_t idx); 361705b1809SJason Molenda GetProfileScanType()3628764fe7dSHan Ming Ong DNBProfileDataScanType GetProfileScanType() { return m_profile_scan_type; } 3638764fe7dSHan Ming Ong 36430fdc8d8SChris Lattner private: 365b9c1b51eSKate Stone enum { 36630fdc8d8SChris Lattner eMachProcessFlagsNone = 0, 36730fdc8d8SChris Lattner eMachProcessFlagsAttached = (1 << 0), 3683bf883eaSJason Molenda eMachProcessFlagsUsingBKS = (1 << 2), // only read via ProcessUsingBackBoard() 3693bf883eaSJason Molenda eMachProcessFlagsUsingFBS = (1 << 3), // only read via ProcessUsingFrontBoard() 3703bf883eaSJason Molenda eMachProcessFlagsBoardCalculated = (1 << 4) 37130fdc8d8SChris Lattner }; 3723cd13c46SJim Ingham 3733cd13c46SJim Ingham enum { 3743cd13c46SJim Ingham eMachProcessProfileNone = 0, 3753cd13c46SJim Ingham eMachProcessProfileCancel = (1 << 0) 3763cd13c46SJim Ingham }; 3773cd13c46SJim Ingham 3785881318cSJim Ingham void Clear(bool detaching = false); 379c4e411ffSGreg Clayton void ReplyToAllExceptions(); 380c4e411ffSGreg Clayton void PrivateResume(); 3813cd13c46SJim Ingham void StopProfileThread(); 38230fdc8d8SChris Lattner Flags()38330fdc8d8SChris Lattner uint32_t Flags() const { return m_flags; } 384b9c1b51eSKate Stone nub_state_t DoSIGSTOP(bool clear_bps_and_wps, bool allow_running, 385b9c1b51eSKate Stone uint32_t *thread_idx_ptr); 38630fdc8d8SChris Lattner 38730fdc8d8SChris Lattner pid_t m_pid; // Process ID of child process 38871337622SGreg Clayton cpu_type_t m_cpu_type; // The CPU type of this process 3898dd10602Skuperxu uint32_t m_platform; // The platform of this process 39030fdc8d8SChris Lattner int m_child_stdin; 39130fdc8d8SChris Lattner int m_child_stdout; 39230fdc8d8SChris Lattner int m_child_stderr; 39330fdc8d8SChris Lattner std::string m_path; // A path to the executable if we have one 394b9c1b51eSKate Stone std::vector<std::string> 395b9c1b51eSKate Stone m_args; // The arguments with which the process was lauched 39630fdc8d8SChris Lattner int m_exit_status; // The exit status for the process 397a332978bSJason Molenda std::string m_exit_info; // Any extra info that we may have about the exit 39830fdc8d8SChris Lattner MachTask m_task; // The mach task for this process 39930fdc8d8SChris Lattner uint32_t m_flags; // Process specific flags (see eMachProcessFlags enums) 40030fdc8d8SChris Lattner uint32_t m_stop_count; // A count of many times have we stopped 401b9c1b51eSKate Stone pthread_t m_stdio_thread; // Thread ID for the thread that watches for child 402b9c1b51eSKate Stone // process stdio 40330fdc8d8SChris Lattner PThreadMutex m_stdio_mutex; // Multithreaded protection for stdio 40430fdc8d8SChris Lattner std::string m_stdout_data; 405ab3b8b22SHan Ming Ong 406ab3b8b22SHan Ming Ong bool m_profile_enabled; // A flag to indicate if profiling is enabled 407b9c1b51eSKate Stone useconds_t m_profile_interval_usec; // If enable, the profiling interval in 408b9c1b51eSKate Stone // microseconds 409b9c1b51eSKate Stone DNBProfileDataScanType 410b9c1b51eSKate Stone m_profile_scan_type; // Indicates what needs to be profiled 411b9c1b51eSKate Stone pthread_t 412b9c1b51eSKate Stone m_profile_thread; // Thread ID for the thread that profiles the inferior 413b9c1b51eSKate Stone PThreadMutex 414b9c1b51eSKate Stone m_profile_data_mutex; // Multithreaded protection for profile info data 415b9c1b51eSKate Stone std::vector<std::string> 416b9c1b51eSKate Stone m_profile_data; // Profile data, must be protected by m_profile_data_mutex 4173cd13c46SJim Ingham PThreadEvent m_profile_events; // Used for the profile thread cancellable wait 418b9c1b51eSKate Stone DNBThreadResumeActions m_thread_actions; // The thread actions for the current 419b9c1b51eSKate Stone // MachProcess::Resume() call 420b9c1b51eSKate Stone MachException::Message::collection m_exception_messages; // A collection of 421b9c1b51eSKate Stone // exception messages 422b9c1b51eSKate Stone // caught when 423b9c1b51eSKate Stone // listening to the 424b9c1b51eSKate Stone // exception port 425b9c1b51eSKate Stone PThreadMutex m_exception_messages_mutex; // Multithreaded protection for 426b9c1b51eSKate Stone // m_exception_messages 42730fdc8d8SChris Lattner 428b9c1b51eSKate Stone MachThreadList m_thread_list; // A list of threads that is maintained/updated 429b9c1b51eSKate Stone // after each stop 430b9c1b51eSKate Stone Genealogy m_activities; // A list of activities that is updated after every 431b9c1b51eSKate Stone // stop lazily 43230fdc8d8SChris Lattner nub_state_t m_state; // The state of our process 43330fdc8d8SChris Lattner PThreadMutex m_state_mutex; // Multithreaded protection for m_state 434b9c1b51eSKate Stone PThreadEvent m_events; // Process related events in the child processes 435b9c1b51eSKate Stone // lifetime can be waited upon 436b9c1b51eSKate Stone PThreadEvent m_private_events; // Used to coordinate running and stopping the 437b9c1b51eSKate Stone // process without affecting m_events 43830fdc8d8SChris Lattner DNBBreakpointList m_breakpoints; // Breakpoint list for this process 43930fdc8d8SChris Lattner DNBBreakpointList m_watchpoints; // Watchpoint list for this process 44030fdc8d8SChris Lattner DNBCallbackNameToAddress m_name_to_addr_callback; 44130fdc8d8SChris Lattner void *m_name_to_addr_baton; 442b9c1b51eSKate Stone DNBCallbackCopyExecutableImageInfos m_image_infos_callback; 44330fdc8d8SChris Lattner void *m_image_infos_baton; 444b9c1b51eSKate Stone std::string 445b9c1b51eSKate Stone m_bundle_id; // If we are a SB or BKS process, this will be our bundle ID. 446b9c1b51eSKate Stone int m_sent_interrupt_signo; // When we call MachProcess::Interrupt(), we want 447b9c1b51eSKate Stone // to send a single signal 4484296c221SGreg Clayton // to the inferior and only send the signal if we aren't already stopped. 4494296c221SGreg Clayton // If we end up sending a signal to stop the process we store it until we 4504296c221SGreg Clayton // receive an exception with this signal. This helps us to verify we got 4514296c221SGreg Clayton // the signal that interrupted the process. We might stop due to another 4524296c221SGreg Clayton // reason after an interrupt signal is sent, so this helps us ensure that 4534296c221SGreg Clayton // we don't report a spurious stop on the next resume. 454b9c1b51eSKate Stone int m_auto_resume_signo; // If we resume the process and still haven't 455b9c1b51eSKate Stone // received our interrupt signal 456e9264b74SKazuaki Ishizaki // acknowledgement, we will shortly after the next resume. We store the 4574296c221SGreg Clayton // interrupt signal in this variable so when we get the interrupt signal 4584296c221SGreg Clayton // as the sole reason for the process being stopped, we can auto resume 4594296c221SGreg Clayton // the process. 46015fc2be7SGreg Clayton bool m_did_exec; 461a2992311SJason Molenda 462b9c1b51eSKate Stone void *(*m_dyld_process_info_create)(task_t task, uint64_t timestamp, 463b9c1b51eSKate Stone kern_return_t *kernelError); 464b9c1b51eSKate Stone void (*m_dyld_process_info_for_each_image)( 465b9c1b51eSKate Stone void *info, void (^callback)(uint64_t machHeaderAddress, 466b9c1b51eSKate Stone const uuid_t uuid, const char *path)); 467a2992311SJason Molenda void (*m_dyld_process_info_release)(void *info); 468a2992311SJason Molenda void (*m_dyld_process_info_get_cache)(void *info, void *cacheInfo); 4696cebeafaSJason Molenda uint32_t (*m_dyld_process_info_get_platform)(void *info); 47030fdc8d8SChris Lattner }; 47130fdc8d8SChris Lattner 472cdc514e4SJonas Devlieghere #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_MACHPROCESS_H 473