You've already forked linux-packaging-mono
acceptance-tests
data
debian
docs
external
Newtonsoft.Json
api-doc-tools
api-snapshot
aspnetwebstack
bdwgc
binary-reference-assemblies
bockbuild
boringssl
cecil
cecil-legacy
corefx
corert
helix-binaries
ikdasm
ikvm
illinker-test-assets
linker
llvm-project
clang
clang-tools-extra
compiler-rt
libcxx
libcxxabi
libunwind
lld
lldb
cmake
docs
examples
include
lit
lldb.xcodeproj
lldb.xcworkspace
packages
resources
scripts
source
third_party
tools
argdumper
compact-unwind
darwin-debug
darwin-threads
debugserver
debugserver.xcodeproj
resources
scripts
source
MacOSX
DarwinLog
arm
arm64
i386
ppc
x86_64
CFBundle.cpp
CFBundle.h
CFString.cpp
CFString.h
CFUtils.h
CMakeLists.txt
Genealogy.cpp
Genealogy.h
GenealogySPI.h
MachException.cpp
MachException.h
MachProcess.h
MachProcess.mm.REMOVED.git-id
MachTask.h
MachTask.mm
MachThread.cpp
MachThread.h
MachThreadList.cpp
MachThreadList.h
MachVMMemory.cpp
MachVMMemory.h
MachVMRegion.cpp
MachVMRegion.h
OsLogger.cpp
OsLogger.h
ThreadInfo.h
dbgnub-mig.defs
stack_logging.h
ARM_DWARF_Registers.h
ARM_ehframe_Registers.h
CMakeLists.txt
ChangeLog
DNB.cpp
DNB.h
DNBArch.cpp
DNBArch.h
DNBBreakpoint.cpp
DNBBreakpoint.h
DNBDataRef.cpp
DNBDataRef.h
DNBDefs.h
DNBError.cpp
DNBError.h
DNBLog.cpp
DNBLog.h
DNBRegisterInfo.cpp
DNBRegisterInfo.h
DNBRuntimeAction.h
DNBThreadResumeActions.cpp
DNBThreadResumeActions.h
DNBTimer.h
JSON.cpp
JSON.h
JSONGenerator.h
PThreadCondition.h
PThreadEvent.cpp
PThreadEvent.h
PThreadMutex.cpp
PThreadMutex.h
PseudoTerminal.cpp
PseudoTerminal.h
RNBContext.cpp
RNBContext.h
RNBDefs.h
RNBRemote.cpp.REMOVED.git-id
RNBRemote.h
RNBServices.cpp
RNBServices.h
RNBSocket.cpp
RNBSocket.h
StdStringExtractor.cpp
StdStringExtractor.h
SysSignal.cpp
SysSignal.h
TTYState.cpp
TTYState.h
com.apple.debugserver.applist.internal.plist
com.apple.debugserver.applist.plist
com.apple.debugserver.internal.plist
com.apple.debugserver.plist
com.apple.debugserver.posix.plist
debugserver-entitlements.plist
debugserver-macosx-entitlements.plist
debugserver.cpp
libdebugserver.cpp
libdebugserver.h
CMakeLists.txt
debugnub-exports
driver
install-headers
intel-features
lldb-mi
lldb-perf
lldb-server
lldb-test
CMakeLists.txt
unittests
utils
www
.arcconfig
.clang-format
.gitignore
CMakeLists.txt
CODE_OWNERS.txt
INSTALL.txt
LICENSE.TXT
use_lldb_suite_root.py
llvm
openmp
polly
nuget-buildtasks
nunit-lite
roslyn-binaries
rx
xunit-binaries
how-to-bump-roslyn-binaries.md
ikvm-native
llvm
m4
man
mcs
mono
msvc
netcore
po
runtime
samples
scripts
support
tools
COPYING.LIB
LICENSE
Makefile.am
Makefile.in
NEWS
README.md
acinclude.m4
aclocal.m4
autogen.sh
code_of_conduct.md
compile
config.guess
config.h.in
config.rpath
config.sub
configure.REMOVED.git-id
configure.ac.REMOVED.git-id
depcomp
install-sh
ltmain.sh.REMOVED.git-id
missing
mkinstalldirs
mono-uninstalled.pc.in
test-driver
winconfig.h
171 lines
6.5 KiB
C
171 lines
6.5 KiB
C
![]() |
//===-- MachThread.h --------------------------------------------*- C++ -*-===//
|
||
|
//
|
||
|
// The LLVM Compiler Infrastructure
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
//
|
||
|
// Created by Greg Clayton on 6/19/07.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
|
||
|
#ifndef __MachThread_h__
|
||
|
#define __MachThread_h__
|
||
|
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
#include <libproc.h>
|
||
|
#include <mach/mach.h>
|
||
|
#include <pthread.h>
|
||
|
#include <sys/signal.h>
|
||
|
|
||
|
#include "DNBArch.h"
|
||
|
#include "DNBRegisterInfo.h"
|
||
|
#include "MachException.h"
|
||
|
#include "PThreadCondition.h"
|
||
|
#include "PThreadMutex.h"
|
||
|
|
||
|
#include "ThreadInfo.h"
|
||
|
|
||
|
class DNBBreakpoint;
|
||
|
class MachProcess;
|
||
|
class MachThreadList;
|
||
|
|
||
|
class MachThread {
|
||
|
public:
|
||
|
MachThread(MachProcess *process, bool is_64_bit,
|
||
|
uint64_t unique_thread_id = 0, thread_t mach_port_number = 0);
|
||
|
~MachThread();
|
||
|
|
||
|
MachProcess *Process() { return m_process; }
|
||
|
const MachProcess *Process() const { return m_process; }
|
||
|
nub_process_t ProcessID() const;
|
||
|
void Dump(uint32_t index);
|
||
|
uint64_t ThreadID() const { return m_unique_id; }
|
||
|
thread_t MachPortNumber() const { return m_mach_port_number; }
|
||
|
thread_t InferiorThreadID() const;
|
||
|
|
||
|
uint32_t SequenceID() const { return m_seq_id; }
|
||
|
static bool ThreadIDIsValid(
|
||
|
uint64_t thread); // The 64-bit system-wide unique thread identifier
|
||
|
static bool MachPortNumberIsValid(thread_t thread); // The mach port # for
|
||
|
// this thread in
|
||
|
// debugserver namespace
|
||
|
void Resume(bool others_stopped);
|
||
|
void Suspend();
|
||
|
bool SetSuspendCountBeforeResume(bool others_stopped);
|
||
|
bool RestoreSuspendCountAfterStop();
|
||
|
|
||
|
bool GetRegisterState(int flavor, bool force);
|
||
|
bool SetRegisterState(int flavor);
|
||
|
uint64_t
|
||
|
GetPC(uint64_t failValue = INVALID_NUB_ADDRESS); // Get program counter
|
||
|
bool SetPC(uint64_t value); // Set program counter
|
||
|
uint64_t GetSP(uint64_t failValue = INVALID_NUB_ADDRESS); // Get stack pointer
|
||
|
|
||
|
DNBBreakpoint *CurrentBreakpoint();
|
||
|
uint32_t EnableHardwareBreakpoint(const DNBBreakpoint *breakpoint);
|
||
|
uint32_t EnableHardwareWatchpoint(const DNBBreakpoint *watchpoint,
|
||
|
bool also_set_on_task);
|
||
|
bool DisableHardwareBreakpoint(const DNBBreakpoint *breakpoint);
|
||
|
bool DisableHardwareWatchpoint(const DNBBreakpoint *watchpoint,
|
||
|
bool also_set_on_task);
|
||
|
uint32_t NumSupportedHardwareWatchpoints() const;
|
||
|
bool RollbackTransForHWP();
|
||
|
bool FinishTransForHWP();
|
||
|
|
||
|
nub_state_t GetState();
|
||
|
void SetState(nub_state_t state);
|
||
|
|
||
|
void ThreadWillResume(const DNBThreadResumeAction *thread_action,
|
||
|
bool others_stopped = false);
|
||
|
bool ShouldStop(bool &step_more);
|
||
|
bool IsStepping();
|
||
|
bool ThreadDidStop();
|
||
|
bool NotifyException(MachException::Data &exc);
|
||
|
const MachException::Data &GetStopException() { return m_stop_exception; }
|
||
|
|
||
|
nub_size_t GetNumRegistersInSet(nub_size_t regSet) const;
|
||
|
const char *GetRegisterSetName(nub_size_t regSet) const;
|
||
|
const DNBRegisterInfo *GetRegisterInfo(nub_size_t regSet,
|
||
|
nub_size_t regIndex) const;
|
||
|
void DumpRegisterState(nub_size_t regSet);
|
||
|
const DNBRegisterSetInfo *GetRegisterSetInfo(nub_size_t *num_reg_sets) const;
|
||
|
bool GetRegisterValue(uint32_t reg_set_idx, uint32_t reg_idx,
|
||
|
DNBRegisterValue *reg_value);
|
||
|
bool SetRegisterValue(uint32_t reg_set_idx, uint32_t reg_idx,
|
||
|
const DNBRegisterValue *reg_value);
|
||
|
nub_size_t GetRegisterContext(void *buf, nub_size_t buf_len);
|
||
|
nub_size_t SetRegisterContext(const void *buf, nub_size_t buf_len);
|
||
|
uint32_t SaveRegisterState();
|
||
|
bool RestoreRegisterState(uint32_t save_id);
|
||
|
|
||
|
void NotifyBreakpointChanged(const DNBBreakpoint *bp) {}
|
||
|
|
||
|
bool IsUserReady();
|
||
|
struct thread_basic_info *GetBasicInfo();
|
||
|
const char *GetBasicInfoAsString() const;
|
||
|
const char *GetName();
|
||
|
|
||
|
DNBArchProtocol *GetArchProtocol() { return m_arch_ap.get(); }
|
||
|
|
||
|
ThreadInfo::QoS GetRequestedQoS(nub_addr_t tsd, uint64_t dti_qos_class_index);
|
||
|
nub_addr_t GetPThreadT();
|
||
|
nub_addr_t GetDispatchQueueT();
|
||
|
nub_addr_t
|
||
|
GetTSDAddressForThread(uint64_t plo_pthread_tsd_base_address_offset,
|
||
|
uint64_t plo_pthread_tsd_base_offset,
|
||
|
uint64_t plo_pthread_tsd_entry_size);
|
||
|
|
||
|
static uint64_t GetGloballyUniqueThreadIDForMachPortID(thread_t mach_port_id);
|
||
|
|
||
|
protected:
|
||
|
static bool GetBasicInfo(thread_t threadID,
|
||
|
struct thread_basic_info *basic_info);
|
||
|
|
||
|
bool GetIdentifierInfo();
|
||
|
|
||
|
// const char *
|
||
|
// GetDispatchQueueName();
|
||
|
//
|
||
|
MachProcess *m_process; // The process that owns this thread
|
||
|
uint64_t m_unique_id; // The globally unique ID for this thread (nub_thread_t)
|
||
|
thread_t m_mach_port_number; // The mach port # for this thread in debugserver
|
||
|
// namesp.
|
||
|
uint32_t m_seq_id; // A Sequential ID that increments with each new thread
|
||
|
nub_state_t m_state; // The state of our process
|
||
|
PThreadMutex m_state_mutex; // Multithreaded protection for m_state
|
||
|
struct thread_basic_info m_basic_info; // Basic information for a thread used
|
||
|
// to see if a thread is valid
|
||
|
int32_t m_suspend_count; // The current suspend count > 0 means we have
|
||
|
// suspended m_suspendCount times,
|
||
|
// < 0 means we have resumed it m_suspendCount
|
||
|
// times.
|
||
|
MachException::Data m_stop_exception; // The best exception that describes why
|
||
|
// this thread is stopped
|
||
|
std::unique_ptr<DNBArchProtocol>
|
||
|
m_arch_ap; // Arch specific information for register state and more
|
||
|
const DNBRegisterSetInfo
|
||
|
*m_reg_sets; // Register set information for this thread
|
||
|
nub_size_t m_num_reg_sets;
|
||
|
thread_identifier_info_data_t m_ident_info;
|
||
|
struct proc_threadinfo m_proc_threadinfo;
|
||
|
std::string m_dispatch_queue_name;
|
||
|
bool m_is_64_bit;
|
||
|
|
||
|
// qos_class_t _pthread_qos_class_decode(pthread_priority_t priority, int *,
|
||
|
// unsigned long *);
|
||
|
unsigned int (*m_pthread_qos_class_decode)(unsigned long priority, int *,
|
||
|
unsigned long *);
|
||
|
|
||
|
private:
|
||
|
friend class MachThreadList;
|
||
|
};
|
||
|
|
||
|
typedef std::shared_ptr<MachThread> MachThreadSP;
|
||
|
|
||
|
#endif
|