93 lines · c
1//===-- HistoryThread.h -----------------------------------------*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H10#define LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H11 12#include <mutex>13 14#include "lldb/Core/UserSettingsController.h"15#include "lldb/Target/ExecutionContextScope.h"16#include "lldb/Target/StackFrameList.h"17#include "lldb/Target/Thread.h"18#include "lldb/Utility/Broadcaster.h"19#include "lldb/Utility/Event.h"20#include "lldb/Utility/UserID.h"21#include "lldb/lldb-private.h"22 23namespace lldb_private {24 25/// \class HistoryThread HistoryThread.h "HistoryThread.h"26/// A thread object representing a backtrace from a previous point in the27/// process execution28///29/// This subclass of Thread is used to provide a backtrace from earlier in30/// process execution. It is given a backtrace list of pcs (return or call31/// addresses) and it will create stack frames for them.32 33class HistoryThread : public lldb_private::Thread {34public:35 HistoryThread(lldb_private::Process &process, lldb::tid_t tid,36 std::vector<lldb::addr_t> pcs,37 HistoryPCType pc_type = HistoryPCType::Returns);38 39 ~HistoryThread() override;40 41 lldb::RegisterContextSP GetRegisterContext() override;42 43 lldb::RegisterContextSP44 CreateRegisterContextForFrame(StackFrame *frame) override;45 46 void RefreshStateAfterStop() override {}47 48 bool CalculateStopInfo() override { return false; }49 50 void SetExtendedBacktraceToken(uint64_t token) override {51 m_extended_unwind_token = token;52 }53 54 uint64_t GetExtendedBacktraceToken() override {55 return m_extended_unwind_token;56 }57 58 const char *GetQueueName() override { return m_queue_name.c_str(); }59 60 void SetQueueName(const char *name) override { m_queue_name = name; }61 62 lldb::queue_id_t GetQueueID() override { return m_queue_id; }63 64 void SetQueueID(lldb::queue_id_t queue) override { m_queue_id = queue; }65 66 const char *GetThreadName() { return m_thread_name.c_str(); }67 68 uint32_t GetExtendedBacktraceOriginatingIndexID() override;69 70 void SetThreadName(const char *name) { m_thread_name = name; }71 72 const char *GetName() override { return m_thread_name.c_str(); }73 74 void SetName(const char *name) override { m_thread_name = name; }75 76protected:77 virtual lldb::StackFrameListSP GetStackFrameList();78 79 mutable std::mutex m_framelist_mutex;80 lldb::StackFrameListSP m_framelist;81 std::vector<lldb::addr_t> m_pcs;82 83 uint64_t m_extended_unwind_token;84 std::string m_queue_name;85 std::string m_thread_name;86 lldb::tid_t m_originating_unique_thread_id;87 lldb::queue_id_t m_queue_id;88};89 90} // namespace lldb_private91 92#endif // LLDB_SOURCE_PLUGINS_PROCESS_UTILITY_HISTORYTHREAD_H93