• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===-- ProcessMessage.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef liblldb_ProcessMessage_H_
10 #define liblldb_ProcessMessage_H_
11 
12 #include "CrashReason.h"
13 
14 #include <cassert>
15 #include <string>
16 
17 #include "lldb/lldb-defines.h"
18 #include "lldb/lldb-types.h"
19 
20 class ProcessMessage {
21 public:
22   /// The type of signal this message can correspond to.
23   enum Kind {
24     eInvalidMessage,
25     eAttachMessage,
26     eExitMessage,
27     eLimboMessage,
28     eSignalMessage,
29     eSignalDeliveredMessage,
30     eTraceMessage,
31     eBreakpointMessage,
32     eWatchpointMessage,
33     eCrashMessage,
34     eNewThreadMessage,
35     eExecMessage
36   };
37 
ProcessMessage()38   ProcessMessage()
39       : m_tid(LLDB_INVALID_PROCESS_ID), m_kind(eInvalidMessage),
40         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
41         m_addr(0) {}
42 
GetKind()43   Kind GetKind() const { return m_kind; }
44 
GetTID()45   lldb::tid_t GetTID() const { return m_tid; }
46 
47   /// Indicates that the process \p pid has successfully attached.
Attach(lldb::pid_t pid)48   static ProcessMessage Attach(lldb::pid_t pid) {
49     return ProcessMessage(pid, eAttachMessage);
50   }
51 
52   /// Indicates that the thread \p tid is about to exit with status \p status.
Limbo(lldb::tid_t tid,int status)53   static ProcessMessage Limbo(lldb::tid_t tid, int status) {
54     return ProcessMessage(tid, eLimboMessage, status);
55   }
56 
57   /// Indicates that the thread \p tid had the signal \p signum delivered.
Signal(lldb::tid_t tid,int signum)58   static ProcessMessage Signal(lldb::tid_t tid, int signum) {
59     return ProcessMessage(tid, eSignalMessage, signum);
60   }
61 
62   /// Indicates that a signal \p signum generated by the debugging process was
63   /// delivered to the thread \p tid.
SignalDelivered(lldb::tid_t tid,int signum)64   static ProcessMessage SignalDelivered(lldb::tid_t tid, int signum) {
65     return ProcessMessage(tid, eSignalDeliveredMessage, signum);
66   }
67 
68   /// Indicates that the thread \p tid encountered a trace point.
Trace(lldb::tid_t tid)69   static ProcessMessage Trace(lldb::tid_t tid) {
70     return ProcessMessage(tid, eTraceMessage);
71   }
72 
73   /// Indicates that the thread \p tid encountered a break point.
Break(lldb::tid_t tid)74   static ProcessMessage Break(lldb::tid_t tid) {
75     return ProcessMessage(tid, eBreakpointMessage);
76   }
77 
Watch(lldb::tid_t tid,lldb::addr_t wp_addr)78   static ProcessMessage Watch(lldb::tid_t tid, lldb::addr_t wp_addr) {
79     return ProcessMessage(tid, eWatchpointMessage, 0, wp_addr);
80   }
81 
82   /// Indicates that the thread \p tid crashed.
Crash(lldb::pid_t pid,CrashReason reason,int signo,lldb::addr_t fault_addr)83   static ProcessMessage Crash(lldb::pid_t pid, CrashReason reason, int signo,
84                               lldb::addr_t fault_addr) {
85     ProcessMessage message(pid, eCrashMessage, signo, fault_addr);
86     message.m_crash_reason = reason;
87     return message;
88   }
89 
90   /// Indicates that the thread \p child_tid was spawned.
NewThread(lldb::tid_t parent_tid,lldb::tid_t child_tid)91   static ProcessMessage NewThread(lldb::tid_t parent_tid,
92                                   lldb::tid_t child_tid) {
93     return ProcessMessage(parent_tid, eNewThreadMessage, child_tid);
94   }
95 
96   /// Indicates that the thread \p tid is about to exit with status \p status.
Exit(lldb::tid_t tid,int status)97   static ProcessMessage Exit(lldb::tid_t tid, int status) {
98     return ProcessMessage(tid, eExitMessage, status);
99   }
100 
101   /// Indicates that the thread \p pid has exec'd.
Exec(lldb::tid_t tid)102   static ProcessMessage Exec(lldb::tid_t tid) {
103     return ProcessMessage(tid, eExecMessage);
104   }
105 
GetExitStatus()106   int GetExitStatus() const {
107     assert(GetKind() == eExitMessage || GetKind() == eLimboMessage);
108     return m_status;
109   }
110 
GetSignal()111   int GetSignal() const {
112     assert(GetKind() == eSignalMessage || GetKind() == eCrashMessage ||
113            GetKind() == eSignalDeliveredMessage);
114     return m_status;
115   }
116 
GetStopStatus()117   int GetStopStatus() const {
118     assert(GetKind() == eSignalMessage);
119     return m_status;
120   }
121 
GetCrashReason()122   CrashReason GetCrashReason() const {
123     assert(GetKind() == eCrashMessage);
124     return m_crash_reason;
125   }
126 
GetFaultAddress()127   lldb::addr_t GetFaultAddress() const {
128     assert(GetKind() == eCrashMessage);
129     return m_addr;
130   }
131 
GetHWAddress()132   lldb::addr_t GetHWAddress() const {
133     assert(GetKind() == eWatchpointMessage || GetKind() == eTraceMessage);
134     return m_addr;
135   }
136 
GetChildTID()137   lldb::tid_t GetChildTID() const {
138     assert(GetKind() == eNewThreadMessage);
139     return m_child_tid;
140   }
141 
142   const char *PrintCrashReason() const;
143 
144   const char *PrintKind() const;
145 
146   static const char *PrintKind(Kind);
147 
148 private:
149   ProcessMessage(lldb::tid_t tid, Kind kind, int status = 0,
150                  lldb::addr_t addr = 0)
m_tid(tid)151       : m_tid(tid), m_kind(kind),
152         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(status),
153         m_addr(addr), m_child_tid(0) {}
154 
ProcessMessage(lldb::tid_t tid,Kind kind,lldb::tid_t child_tid)155   ProcessMessage(lldb::tid_t tid, Kind kind, lldb::tid_t child_tid)
156       : m_tid(tid), m_kind(kind),
157         m_crash_reason(CrashReason::eInvalidCrashReason), m_status(0),
158         m_addr(0), m_child_tid(child_tid) {}
159 
160   lldb::tid_t m_tid;
161   Kind m_kind : 8;
162   CrashReason m_crash_reason;
163   int m_status;
164   lldb::addr_t m_addr;
165   lldb::tid_t m_child_tid;
166 };
167 
168 #endif // #ifndef liblldb_ProcessMessage_H_
169