1061da546Spatrick //===-- Genealogy.h ---------------------------------------------*- C++ -*-===// 2061da546Spatrick //-*-===// 3061da546Spatrick // 4061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 6061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7061da546Spatrick // 8061da546Spatrick //===----------------------------------------------------------------------===// 9061da546Spatrick 10*dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H 11*dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H 12061da546Spatrick 13061da546Spatrick #include <mach/task.h> 14061da546Spatrick #include <map> 15061da546Spatrick #include <pthread.h> 16061da546Spatrick #include <string> 17061da546Spatrick #include <vector> 18061da546Spatrick 19061da546Spatrick #include "GenealogySPI.h" 20061da546Spatrick #include "MachThreadList.h" 21061da546Spatrick 22061da546Spatrick class Genealogy { 23061da546Spatrick public: 24061da546Spatrick Genealogy(); 25061da546Spatrick ~Genealogy()26061da546Spatrick ~Genealogy() {} 27061da546Spatrick 28061da546Spatrick void Clear(); 29061da546Spatrick 30061da546Spatrick struct Breadcrumb { 31061da546Spatrick uint32_t breadcrumb_id; 32061da546Spatrick uint64_t activity_id; 33061da546Spatrick uint64_t timestamp; 34061da546Spatrick std::string name; 35061da546Spatrick }; 36061da546Spatrick 37061da546Spatrick struct Activity { 38061da546Spatrick uint64_t activity_start; 39061da546Spatrick uint64_t activity_id; 40061da546Spatrick uint64_t parent_id; 41061da546Spatrick std::string activity_name; 42061da546Spatrick std::string reason; 43061da546Spatrick }; 44061da546Spatrick 45061da546Spatrick struct Message { 46061da546Spatrick uint64_t timestamp; 47061da546Spatrick uint64_t activity_id; 48061da546Spatrick uint64_t trace_id; 49061da546Spatrick uint64_t thread; 50061da546Spatrick uint8_t type; // OS_TRACE_TYPE_RELEASE, OS_TRACE_TYPE_DEBUG, 51061da546Spatrick // OS_TRACE_TYPE_ERROR, OS_TRACE_TYPE_FAULT 52061da546Spatrick uint32_t process_info_index; // index # of the image uuid/file path, 0 means 53061da546Spatrick // unknown 54061da546Spatrick std::string message; 55061da546Spatrick }; 56061da546Spatrick 57061da546Spatrick typedef std::vector<Message> MessageList; 58061da546Spatrick typedef std::vector<Breadcrumb> BreadcrumbList; 59061da546Spatrick typedef std::vector<Activity> ActivityList; 60061da546Spatrick 61061da546Spatrick struct ThreadActivity { 62061da546Spatrick Activity current_activity; 63061da546Spatrick MessageList messages; 64061da546Spatrick BreadcrumbList breadcrumbs; // should be 0 or 1 breadcrumbs; no more than 1 65061da546Spatrick // BC for any given activity 66061da546Spatrick }; 67061da546Spatrick 68061da546Spatrick typedef std::shared_ptr<ThreadActivity> ThreadActivitySP; 69061da546Spatrick 70061da546Spatrick ThreadActivitySP GetGenealogyInfoForThread(pid_t pid, nub_thread_t tid, 71061da546Spatrick const MachThreadList &thread_list, 72061da546Spatrick task_t task, bool &timed_out); 73061da546Spatrick 74061da546Spatrick struct ProcessExecutableInfo { 75061da546Spatrick std::string image_path; 76061da546Spatrick uuid_t image_uuid; 77061da546Spatrick }; 78061da546Spatrick 79061da546Spatrick typedef std::shared_ptr<ProcessExecutableInfo> ProcessExecutableInfoSP; 80061da546Spatrick 81061da546Spatrick ProcessExecutableInfoSP GetProcessExecutableInfosAtIndex(size_t idx); 82061da546Spatrick 83061da546Spatrick uint32_t AddProcessExecutableInfo(ProcessExecutableInfoSP process_exe_info); 84061da546Spatrick 85061da546Spatrick private: 86061da546Spatrick void GetActivities(pid_t pid, const MachThreadList &thread_list, task_t task); 87061da546Spatrick 88061da546Spatrick // the spi we need to call into libtrace - look them up via dlsym at runtime 89061da546Spatrick bool (*m_os_activity_diagnostic_for_pid)(pid_t pid, os_activity_t activity, 90061da546Spatrick uint32_t flags, 91061da546Spatrick os_diagnostic_block_t block); 92061da546Spatrick void (*m_os_activity_iterate_processes)( 93061da546Spatrick os_activity_process_list_t processes, 94061da546Spatrick bool (^iterator)(os_activity_process_t process_info)); 95061da546Spatrick void (*m_os_activity_iterate_breadcrumbs)( 96061da546Spatrick os_activity_process_t process_info, 97061da546Spatrick bool (^iterator)(os_activity_breadcrumb_t breadcrumb)); 98061da546Spatrick void (*m_os_activity_iterate_messages)( 99061da546Spatrick os_trace_message_list_t messages, os_activity_process_t process_info, 100061da546Spatrick bool (^iterator)(os_trace_message_t tracemsg)); 101061da546Spatrick void (*m_os_activity_iterate_activities)( 102061da546Spatrick os_activity_list_t activities, os_activity_process_t process_info, 103061da546Spatrick bool (^iterator)(os_activity_entry_t activity)); 104061da546Spatrick uint8_t (*m_os_trace_get_type)(os_trace_message_t trace_msg); 105061da546Spatrick char *(*m_os_trace_copy_formatted_message)(os_trace_message_t trace_msg); 106061da546Spatrick os_activity_t (*m_os_activity_for_thread)(os_activity_process_t process, 107061da546Spatrick uint64_t thread_id); 108061da546Spatrick os_activity_t (*m_os_activity_for_task_thread)(task_t target, 109061da546Spatrick uint64_t thread_id); 110061da546Spatrick os_trace_message_list_t (*m_os_activity_messages_for_thread)( 111061da546Spatrick os_activity_process_t process, os_activity_t activity, 112061da546Spatrick uint64_t thread_id); 113061da546Spatrick 114061da546Spatrick std::map<nub_thread_t, ThreadActivitySP> m_thread_activities; 115061da546Spatrick std::vector<ProcessExecutableInfoSP> m_process_executable_infos; 116061da546Spatrick bool m_diagnosticd_call_timed_out; 117061da546Spatrick }; 118061da546Spatrick 119*dda28197Spatrick #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H 120