1*30fdc8d8SChris Lattner //===-- SBProcess.cpp -------------------------------------------*- C++ -*-===//
2*30fdc8d8SChris Lattner //
3*30fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
4*30fdc8d8SChris Lattner //
5*30fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
6*30fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
7*30fdc8d8SChris Lattner //
8*30fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
9*30fdc8d8SChris Lattner 
10*30fdc8d8SChris Lattner #include "SBProcess.h"
11*30fdc8d8SChris Lattner 
12*30fdc8d8SChris Lattner #include "lldb/lldb-defines.h"
13*30fdc8d8SChris Lattner #include "lldb/lldb-types.h"
14*30fdc8d8SChris Lattner 
15*30fdc8d8SChris Lattner #include "lldb/Core/Args.h"
16*30fdc8d8SChris Lattner #include "lldb/Core/DataBufferHeap.h"
17*30fdc8d8SChris Lattner #include "lldb/Core/DataExtractor.h"
18*30fdc8d8SChris Lattner #include "lldb/Core/State.h"
19*30fdc8d8SChris Lattner #include "lldb/Core/Stream.h"
20*30fdc8d8SChris Lattner #include "lldb/Core/StreamFile.h"
21*30fdc8d8SChris Lattner #include "lldb/Target/Process.h"
22*30fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
23*30fdc8d8SChris Lattner #include "lldb/Target/RegisterContext.h"
24*30fdc8d8SChris Lattner 
25*30fdc8d8SChris Lattner // Project includes
26*30fdc8d8SChris Lattner 
27*30fdc8d8SChris Lattner #include "SBBroadcaster.h"
28*30fdc8d8SChris Lattner #include "SBDebugger.h"
29*30fdc8d8SChris Lattner #include "SBCommandReturnObject.h"
30*30fdc8d8SChris Lattner #include "SBEvent.h"
31*30fdc8d8SChris Lattner #include "SBThread.h"
32*30fdc8d8SChris Lattner #include "SBStringList.h"
33*30fdc8d8SChris Lattner 
34*30fdc8d8SChris Lattner using namespace lldb;
35*30fdc8d8SChris Lattner using namespace lldb_private;
36*30fdc8d8SChris Lattner 
37*30fdc8d8SChris Lattner 
38*30fdc8d8SChris Lattner 
39*30fdc8d8SChris Lattner SBProcess::SBProcess () :
40*30fdc8d8SChris Lattner     m_lldb_object_sp()
41*30fdc8d8SChris Lattner {
42*30fdc8d8SChris Lattner }
43*30fdc8d8SChris Lattner 
44*30fdc8d8SChris Lattner 
45*30fdc8d8SChris Lattner //----------------------------------------------------------------------
46*30fdc8d8SChris Lattner // SBProcess constructor
47*30fdc8d8SChris Lattner //----------------------------------------------------------------------
48*30fdc8d8SChris Lattner 
49*30fdc8d8SChris Lattner SBProcess::SBProcess (const SBProcess& rhs) :
50*30fdc8d8SChris Lattner     m_lldb_object_sp (rhs.m_lldb_object_sp)
51*30fdc8d8SChris Lattner {
52*30fdc8d8SChris Lattner }
53*30fdc8d8SChris Lattner 
54*30fdc8d8SChris Lattner 
55*30fdc8d8SChris Lattner SBProcess::SBProcess (const lldb::ProcessSP &process_sp) :
56*30fdc8d8SChris Lattner     m_lldb_object_sp (process_sp)
57*30fdc8d8SChris Lattner {
58*30fdc8d8SChris Lattner }
59*30fdc8d8SChris Lattner 
60*30fdc8d8SChris Lattner //----------------------------------------------------------------------
61*30fdc8d8SChris Lattner // Destructor
62*30fdc8d8SChris Lattner //----------------------------------------------------------------------
63*30fdc8d8SChris Lattner SBProcess::~SBProcess()
64*30fdc8d8SChris Lattner {
65*30fdc8d8SChris Lattner }
66*30fdc8d8SChris Lattner 
67*30fdc8d8SChris Lattner void
68*30fdc8d8SChris Lattner SBProcess::SetProcess (const ProcessSP &process_sp)
69*30fdc8d8SChris Lattner {
70*30fdc8d8SChris Lattner     m_lldb_object_sp = process_sp;
71*30fdc8d8SChris Lattner }
72*30fdc8d8SChris Lattner 
73*30fdc8d8SChris Lattner void
74*30fdc8d8SChris Lattner SBProcess::Clear ()
75*30fdc8d8SChris Lattner {
76*30fdc8d8SChris Lattner     m_lldb_object_sp.reset();
77*30fdc8d8SChris Lattner }
78*30fdc8d8SChris Lattner 
79*30fdc8d8SChris Lattner 
80*30fdc8d8SChris Lattner bool
81*30fdc8d8SChris Lattner SBProcess::IsValid() const
82*30fdc8d8SChris Lattner {
83*30fdc8d8SChris Lattner     return m_lldb_object_sp.get() != NULL;
84*30fdc8d8SChris Lattner }
85*30fdc8d8SChris Lattner 
86*30fdc8d8SChris Lattner 
87*30fdc8d8SChris Lattner uint32_t
88*30fdc8d8SChris Lattner SBProcess::GetNumThreads ()
89*30fdc8d8SChris Lattner {
90*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
91*30fdc8d8SChris Lattner     {
92*30fdc8d8SChris Lattner         const bool can_update = true;
93*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().GetSize(can_update);
94*30fdc8d8SChris Lattner     }
95*30fdc8d8SChris Lattner     return 0;
96*30fdc8d8SChris Lattner }
97*30fdc8d8SChris Lattner 
98*30fdc8d8SChris Lattner SBThread
99*30fdc8d8SChris Lattner SBProcess::GetCurrentThread () const
100*30fdc8d8SChris Lattner {
101*30fdc8d8SChris Lattner     SBThread sb_thread;
102*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
103*30fdc8d8SChris Lattner         sb_thread.SetThread (m_lldb_object_sp->GetThreadList().GetCurrentThread());
104*30fdc8d8SChris Lattner     return sb_thread;
105*30fdc8d8SChris Lattner }
106*30fdc8d8SChris Lattner 
107*30fdc8d8SChris Lattner SBTarget
108*30fdc8d8SChris Lattner SBProcess::GetTarget() const
109*30fdc8d8SChris Lattner {
110*30fdc8d8SChris Lattner     SBTarget sb_target;
111*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
112*30fdc8d8SChris Lattner         sb_target = SBDebugger::FindTargetWithLLDBProcess (m_lldb_object_sp);
113*30fdc8d8SChris Lattner     return sb_target;
114*30fdc8d8SChris Lattner }
115*30fdc8d8SChris Lattner 
116*30fdc8d8SChris Lattner 
117*30fdc8d8SChris Lattner size_t
118*30fdc8d8SChris Lattner SBProcess::PutSTDIN (const char *src, size_t src_len)
119*30fdc8d8SChris Lattner {
120*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
121*30fdc8d8SChris Lattner     {
122*30fdc8d8SChris Lattner         Error error;
123*30fdc8d8SChris Lattner         return m_lldb_object_sp->PutSTDIN (src, src_len, error);
124*30fdc8d8SChris Lattner     }
125*30fdc8d8SChris Lattner     else
126*30fdc8d8SChris Lattner         return 0;
127*30fdc8d8SChris Lattner }
128*30fdc8d8SChris Lattner 
129*30fdc8d8SChris Lattner size_t
130*30fdc8d8SChris Lattner SBProcess::GetSTDOUT (char *dst, size_t dst_len) const
131*30fdc8d8SChris Lattner {
132*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
133*30fdc8d8SChris Lattner     {
134*30fdc8d8SChris Lattner         Error error;
135*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetSTDOUT (dst, dst_len, error);
136*30fdc8d8SChris Lattner     }
137*30fdc8d8SChris Lattner     else
138*30fdc8d8SChris Lattner         return 0;
139*30fdc8d8SChris Lattner }
140*30fdc8d8SChris Lattner 
141*30fdc8d8SChris Lattner size_t
142*30fdc8d8SChris Lattner SBProcess::GetSTDERR (char *dst, size_t dst_len) const
143*30fdc8d8SChris Lattner {
144*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
145*30fdc8d8SChris Lattner     {
146*30fdc8d8SChris Lattner         Error error;
147*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetSTDERR (dst, dst_len, error);
148*30fdc8d8SChris Lattner     }
149*30fdc8d8SChris Lattner     else
150*30fdc8d8SChris Lattner         return 0;
151*30fdc8d8SChris Lattner }
152*30fdc8d8SChris Lattner 
153*30fdc8d8SChris Lattner void
154*30fdc8d8SChris Lattner SBProcess::ReportCurrentState (const SBEvent &event, FILE *out) const
155*30fdc8d8SChris Lattner {
156*30fdc8d8SChris Lattner     if (out == NULL)
157*30fdc8d8SChris Lattner         return;
158*30fdc8d8SChris Lattner 
159*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
160*30fdc8d8SChris Lattner     {
161*30fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
162*30fdc8d8SChris Lattner         char message[1024];
163*30fdc8d8SChris Lattner         int message_len = ::snprintf (message,
164*30fdc8d8SChris Lattner                                       sizeof (message),
165*30fdc8d8SChris Lattner                                       "Process %d %s\n",
166*30fdc8d8SChris Lattner                                       m_lldb_object_sp->GetID(),
167*30fdc8d8SChris Lattner                                       SBDebugger::StateAsCString (event_state));
168*30fdc8d8SChris Lattner 
169*30fdc8d8SChris Lattner         if (message_len > 0)
170*30fdc8d8SChris Lattner             ::fwrite (message, 1, message_len, out);
171*30fdc8d8SChris Lattner     }
172*30fdc8d8SChris Lattner }
173*30fdc8d8SChris Lattner 
174*30fdc8d8SChris Lattner void
175*30fdc8d8SChris Lattner SBProcess::AppendCurrentStateReport (const SBEvent &event, SBCommandReturnObject &result)
176*30fdc8d8SChris Lattner {
177*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
178*30fdc8d8SChris Lattner     {
179*30fdc8d8SChris Lattner         const StateType event_state = SBProcess::GetStateFromEvent (event);
180*30fdc8d8SChris Lattner         char message[1024];
181*30fdc8d8SChris Lattner         ::snprintf (message,
182*30fdc8d8SChris Lattner                     sizeof (message),
183*30fdc8d8SChris Lattner                     "Process %d %s\n",
184*30fdc8d8SChris Lattner                     m_lldb_object_sp->GetID(),
185*30fdc8d8SChris Lattner                     SBDebugger::StateAsCString (event_state));
186*30fdc8d8SChris Lattner 
187*30fdc8d8SChris Lattner         result.AppendMessage (message);
188*30fdc8d8SChris Lattner     }
189*30fdc8d8SChris Lattner }
190*30fdc8d8SChris Lattner 
191*30fdc8d8SChris Lattner bool
192*30fdc8d8SChris Lattner SBProcess::SetCurrentThread (const SBThread &thread)
193*30fdc8d8SChris Lattner {
194*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
195*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (thread.GetThreadID());
196*30fdc8d8SChris Lattner     return false;
197*30fdc8d8SChris Lattner }
198*30fdc8d8SChris Lattner 
199*30fdc8d8SChris Lattner bool
200*30fdc8d8SChris Lattner SBProcess::SetCurrentThreadByID (uint32_t tid)
201*30fdc8d8SChris Lattner {
202*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
203*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetThreadList().SetCurrentThreadByID (tid);
204*30fdc8d8SChris Lattner     return false;
205*30fdc8d8SChris Lattner }
206*30fdc8d8SChris Lattner 
207*30fdc8d8SChris Lattner SBThread
208*30fdc8d8SChris Lattner SBProcess::GetThreadAtIndex (size_t index)
209*30fdc8d8SChris Lattner {
210*30fdc8d8SChris Lattner     SBThread thread;
211*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
212*30fdc8d8SChris Lattner         thread.SetThread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(index));
213*30fdc8d8SChris Lattner     return thread;
214*30fdc8d8SChris Lattner }
215*30fdc8d8SChris Lattner 
216*30fdc8d8SChris Lattner StateType
217*30fdc8d8SChris Lattner SBProcess::GetState ()
218*30fdc8d8SChris Lattner {
219*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
220*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetState();
221*30fdc8d8SChris Lattner     else
222*30fdc8d8SChris Lattner         return eStateInvalid;
223*30fdc8d8SChris Lattner }
224*30fdc8d8SChris Lattner 
225*30fdc8d8SChris Lattner 
226*30fdc8d8SChris Lattner int
227*30fdc8d8SChris Lattner SBProcess::GetExitStatus ()
228*30fdc8d8SChris Lattner {
229*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
230*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetExitStatus ();
231*30fdc8d8SChris Lattner     else
232*30fdc8d8SChris Lattner         return 0;
233*30fdc8d8SChris Lattner }
234*30fdc8d8SChris Lattner 
235*30fdc8d8SChris Lattner const char *
236*30fdc8d8SChris Lattner SBProcess::GetExitDescription ()
237*30fdc8d8SChris Lattner {
238*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
239*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetExitDescription ();
240*30fdc8d8SChris Lattner     else
241*30fdc8d8SChris Lattner         return NULL;
242*30fdc8d8SChris Lattner }
243*30fdc8d8SChris Lattner 
244*30fdc8d8SChris Lattner lldb::pid_t
245*30fdc8d8SChris Lattner SBProcess::GetProcessID ()
246*30fdc8d8SChris Lattner {
247*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
248*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetID();
249*30fdc8d8SChris Lattner     else
250*30fdc8d8SChris Lattner         return LLDB_INVALID_PROCESS_ID;
251*30fdc8d8SChris Lattner }
252*30fdc8d8SChris Lattner 
253*30fdc8d8SChris Lattner uint32_t
254*30fdc8d8SChris Lattner SBProcess::GetAddressByteSize () const
255*30fdc8d8SChris Lattner {
256*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
257*30fdc8d8SChris Lattner         return m_lldb_object_sp->GetAddressByteSize();
258*30fdc8d8SChris Lattner     else
259*30fdc8d8SChris Lattner         return 0;
260*30fdc8d8SChris Lattner }
261*30fdc8d8SChris Lattner 
262*30fdc8d8SChris Lattner 
263*30fdc8d8SChris Lattner void
264*30fdc8d8SChris Lattner SBProcess::DisplayThreadsInfo (FILE *out, FILE *err, bool only_threads_with_stop_reason)
265*30fdc8d8SChris Lattner {
266*30fdc8d8SChris Lattner     if (m_lldb_object_sp != NULL)
267*30fdc8d8SChris Lattner     {
268*30fdc8d8SChris Lattner         size_t num_thread_infos_dumped = 0;
269*30fdc8d8SChris Lattner         size_t num_threads = GetNumThreads();
270*30fdc8d8SChris Lattner 
271*30fdc8d8SChris Lattner         if (out == NULL)
272*30fdc8d8SChris Lattner             out = SBDebugger::GetOutputFileHandle();
273*30fdc8d8SChris Lattner 
274*30fdc8d8SChris Lattner         if (err == NULL)
275*30fdc8d8SChris Lattner             err = SBDebugger::GetErrorFileHandle();
276*30fdc8d8SChris Lattner 
277*30fdc8d8SChris Lattner         if ((out == NULL) ||(err == NULL))
278*30fdc8d8SChris Lattner             return;
279*30fdc8d8SChris Lattner 
280*30fdc8d8SChris Lattner         if (num_threads > 0)
281*30fdc8d8SChris Lattner         {
282*30fdc8d8SChris Lattner             Thread::StopInfo thread_stop_info;
283*30fdc8d8SChris Lattner             SBThread curr_thread (m_lldb_object_sp->GetThreadList().GetCurrentThread());
284*30fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
285*30fdc8d8SChris Lattner             {
286*30fdc8d8SChris Lattner                 SBThread thread (m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i));
287*30fdc8d8SChris Lattner                 if (thread.IsValid())
288*30fdc8d8SChris Lattner                 {
289*30fdc8d8SChris Lattner                     bool is_current_thread = false;
290*30fdc8d8SChris Lattner                     StreamFile str (out);
291*30fdc8d8SChris Lattner                     if (thread == curr_thread)
292*30fdc8d8SChris Lattner                         is_current_thread = true;
293*30fdc8d8SChris Lattner                     StopReason thread_stop_reason = eStopReasonNone;
294*30fdc8d8SChris Lattner                     if (thread->GetStopInfo (&thread_stop_info))
295*30fdc8d8SChris Lattner                     {
296*30fdc8d8SChris Lattner                         thread_stop_reason = thread_stop_info.GetStopReason();
297*30fdc8d8SChris Lattner                         if (thread_stop_reason == eStopReasonNone)
298*30fdc8d8SChris Lattner                         {
299*30fdc8d8SChris Lattner                             if (only_threads_with_stop_reason && !is_current_thread)
300*30fdc8d8SChris Lattner                                 continue;
301*30fdc8d8SChris Lattner                         }
302*30fdc8d8SChris Lattner                     }
303*30fdc8d8SChris Lattner                     ++num_thread_infos_dumped;
304*30fdc8d8SChris Lattner                     fprintf (out, "  %c thread #%u: tid = 0x%4.4x, pc = 0x%16.16llx",
305*30fdc8d8SChris Lattner                              (is_current_thread ? '*' : ' '),
306*30fdc8d8SChris Lattner                              thread->GetIndexID(), thread->GetID(), thread->GetRegisterContext()->GetPC());
307*30fdc8d8SChris Lattner 
308*30fdc8d8SChris Lattner                     StackFrameSP frame_sp(thread->GetStackFrameAtIndex (0));
309*30fdc8d8SChris Lattner                     if (frame_sp)
310*30fdc8d8SChris Lattner                     {
311*30fdc8d8SChris Lattner                         SymbolContext sc (frame_sp->GetSymbolContext (eSymbolContextEverything));
312*30fdc8d8SChris Lattner                         fprintf (out, ", where = ");
313*30fdc8d8SChris Lattner                         sc.DumpStopContext (&str, m_lldb_object_sp.get(), frame_sp->GetPC ());
314*30fdc8d8SChris Lattner                     }
315*30fdc8d8SChris Lattner 
316*30fdc8d8SChris Lattner                     if (thread_stop_reason != eStopReasonNone)
317*30fdc8d8SChris Lattner                     {
318*30fdc8d8SChris Lattner                         fprintf (out, ", stop reason = ");
319*30fdc8d8SChris Lattner                         thread_stop_info.Dump (&str);
320*30fdc8d8SChris Lattner                     }
321*30fdc8d8SChris Lattner 
322*30fdc8d8SChris Lattner                     const char *thread_name = thread->GetName();
323*30fdc8d8SChris Lattner                     if (thread_name && thread_name[0])
324*30fdc8d8SChris Lattner                         fprintf (out, ", thread_name = '%s'", thread_name);
325*30fdc8d8SChris Lattner 
326*30fdc8d8SChris Lattner                     fprintf (out, "\n");
327*30fdc8d8SChris Lattner 
328*30fdc8d8SChris Lattner                     SBThread sb_thread (thread);
329*30fdc8d8SChris Lattner                     sb_thread.DisplayFramesForCurrentContext (out, err, 0, 1, false, 1);
330*30fdc8d8SChris Lattner                 }
331*30fdc8d8SChris Lattner             }
332*30fdc8d8SChris Lattner         }
333*30fdc8d8SChris Lattner     }
334*30fdc8d8SChris Lattner }
335*30fdc8d8SChris Lattner bool
336*30fdc8d8SChris Lattner SBProcess::WaitUntilProcessHasStopped (SBCommandReturnObject &result)
337*30fdc8d8SChris Lattner {
338*30fdc8d8SChris Lattner     bool state_changed = false;
339*30fdc8d8SChris Lattner 
340*30fdc8d8SChris Lattner     if (IsValid())
341*30fdc8d8SChris Lattner     {
342*30fdc8d8SChris Lattner         EventSP event_sp;
343*30fdc8d8SChris Lattner         StateType state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp);
344*30fdc8d8SChris Lattner 
345*30fdc8d8SChris Lattner         while (StateIsStoppedState (state))
346*30fdc8d8SChris Lattner         {
347*30fdc8d8SChris Lattner             state = m_lldb_object_sp->WaitForStateChangedEvents (NULL, event_sp);
348*30fdc8d8SChris Lattner             SBEvent event (event_sp);
349*30fdc8d8SChris Lattner             AppendCurrentStateReport (event, result);
350*30fdc8d8SChris Lattner             state_changed = true;
351*30fdc8d8SChris Lattner         }
352*30fdc8d8SChris Lattner     }
353*30fdc8d8SChris Lattner     return state_changed;
354*30fdc8d8SChris Lattner }
355*30fdc8d8SChris Lattner 
356*30fdc8d8SChris Lattner SBError
357*30fdc8d8SChris Lattner SBProcess::Continue ()
358*30fdc8d8SChris Lattner {
359*30fdc8d8SChris Lattner     SBError sb_error;
360*30fdc8d8SChris Lattner     if (IsValid())
361*30fdc8d8SChris Lattner         sb_error.SetError(m_lldb_object_sp->Resume());
362*30fdc8d8SChris Lattner     else
363*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
364*30fdc8d8SChris Lattner 
365*30fdc8d8SChris Lattner     return sb_error;
366*30fdc8d8SChris Lattner }
367*30fdc8d8SChris Lattner 
368*30fdc8d8SChris Lattner 
369*30fdc8d8SChris Lattner SBError
370*30fdc8d8SChris Lattner SBProcess::Destroy ()
371*30fdc8d8SChris Lattner {
372*30fdc8d8SChris Lattner     SBError sb_error;
373*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
374*30fdc8d8SChris Lattner         sb_error.SetError(m_lldb_object_sp->Destroy());
375*30fdc8d8SChris Lattner     else
376*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
377*30fdc8d8SChris Lattner 
378*30fdc8d8SChris Lattner     return sb_error;
379*30fdc8d8SChris Lattner }
380*30fdc8d8SChris Lattner 
381*30fdc8d8SChris Lattner 
382*30fdc8d8SChris Lattner SBError
383*30fdc8d8SChris Lattner SBProcess::Stop ()
384*30fdc8d8SChris Lattner {
385*30fdc8d8SChris Lattner     SBError sb_error;
386*30fdc8d8SChris Lattner     if (IsValid())
387*30fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Halt());
388*30fdc8d8SChris Lattner     else
389*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
390*30fdc8d8SChris Lattner     return sb_error;
391*30fdc8d8SChris Lattner }
392*30fdc8d8SChris Lattner 
393*30fdc8d8SChris Lattner SBError
394*30fdc8d8SChris Lattner SBProcess::Kill ()
395*30fdc8d8SChris Lattner {
396*30fdc8d8SChris Lattner     SBError sb_error;
397*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
398*30fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Destroy());
399*30fdc8d8SChris Lattner     else
400*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
401*30fdc8d8SChris Lattner     return sb_error;
402*30fdc8d8SChris Lattner }
403*30fdc8d8SChris Lattner 
404*30fdc8d8SChris Lattner 
405*30fdc8d8SChris Lattner SBError
406*30fdc8d8SChris Lattner SBProcess::AttachByName (const char *name, bool wait_for_launch)
407*30fdc8d8SChris Lattner {
408*30fdc8d8SChris Lattner     SBError sb_error;
409*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
410*30fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Attach (name, wait_for_launch));
411*30fdc8d8SChris Lattner     else
412*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
413*30fdc8d8SChris Lattner     return sb_error;
414*30fdc8d8SChris Lattner }
415*30fdc8d8SChris Lattner 
416*30fdc8d8SChris Lattner lldb::pid_t
417*30fdc8d8SChris Lattner SBProcess::AttachByPID (lldb::pid_t attach_pid)  // DEPRECATED: will be removed in a few builds in favor of SBError AttachByPID(pid_t)
418*30fdc8d8SChris Lattner {
419*30fdc8d8SChris Lattner     Attach (attach_pid);
420*30fdc8d8SChris Lattner     return GetProcessID();
421*30fdc8d8SChris Lattner }
422*30fdc8d8SChris Lattner 
423*30fdc8d8SChris Lattner 
424*30fdc8d8SChris Lattner SBError
425*30fdc8d8SChris Lattner SBProcess::Attach (lldb::pid_t attach_pid)
426*30fdc8d8SChris Lattner {
427*30fdc8d8SChris Lattner     SBError sb_error;
428*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
429*30fdc8d8SChris Lattner         sb_error.SetError  (m_lldb_object_sp->Attach (attach_pid));
430*30fdc8d8SChris Lattner     else
431*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
432*30fdc8d8SChris Lattner     return sb_error;
433*30fdc8d8SChris Lattner }
434*30fdc8d8SChris Lattner 
435*30fdc8d8SChris Lattner SBError
436*30fdc8d8SChris Lattner SBProcess::Detach ()
437*30fdc8d8SChris Lattner {
438*30fdc8d8SChris Lattner     SBError sb_error;
439*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
440*30fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Detach());
441*30fdc8d8SChris Lattner     else
442*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
443*30fdc8d8SChris Lattner 
444*30fdc8d8SChris Lattner     return sb_error;
445*30fdc8d8SChris Lattner }
446*30fdc8d8SChris Lattner 
447*30fdc8d8SChris Lattner SBError
448*30fdc8d8SChris Lattner SBProcess::Signal (int signal)
449*30fdc8d8SChris Lattner {
450*30fdc8d8SChris Lattner     SBError sb_error;
451*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
452*30fdc8d8SChris Lattner         sb_error.SetError (m_lldb_object_sp->Signal (signal));
453*30fdc8d8SChris Lattner     else
454*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
455*30fdc8d8SChris Lattner     return sb_error;
456*30fdc8d8SChris Lattner }
457*30fdc8d8SChris Lattner 
458*30fdc8d8SChris Lattner void
459*30fdc8d8SChris Lattner SBProcess::ListThreads ()
460*30fdc8d8SChris Lattner {
461*30fdc8d8SChris Lattner     FILE *out = SBDebugger::GetOutputFileHandle();
462*30fdc8d8SChris Lattner     if (out == NULL)
463*30fdc8d8SChris Lattner         return;
464*30fdc8d8SChris Lattner 
465*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
466*30fdc8d8SChris Lattner     {
467*30fdc8d8SChris Lattner         size_t num_threads = GetNumThreads ();
468*30fdc8d8SChris Lattner         if (num_threads > 0)
469*30fdc8d8SChris Lattner         {
470*30fdc8d8SChris Lattner             Thread *cur_thread = m_lldb_object_sp->GetThreadList().GetCurrentThread().get();
471*30fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
472*30fdc8d8SChris Lattner             {
473*30fdc8d8SChris Lattner                 Thread *thread = m_lldb_object_sp->GetThreadList().GetThreadAtIndex(i).get();
474*30fdc8d8SChris Lattner                 if (thread)
475*30fdc8d8SChris Lattner                 {
476*30fdc8d8SChris Lattner                     bool is_current_thread = false;
477*30fdc8d8SChris Lattner                     if (thread == cur_thread)
478*30fdc8d8SChris Lattner                         is_current_thread = true;
479*30fdc8d8SChris Lattner                     fprintf (out, "  [%u] %c tid = 0x%4.4x, pc = 0x%16.16llx",
480*30fdc8d8SChris Lattner                              i,
481*30fdc8d8SChris Lattner                              (is_current_thread ? '*' : ' '),
482*30fdc8d8SChris Lattner                              thread->GetID(),
483*30fdc8d8SChris Lattner                              thread->GetRegisterContext()->GetPC());
484*30fdc8d8SChris Lattner                     const char *thread_name = thread->GetName();
485*30fdc8d8SChris Lattner                     if (thread_name && thread_name[0])
486*30fdc8d8SChris Lattner                         fprintf (out, ", name = %s", thread_name);
487*30fdc8d8SChris Lattner                     const char *queue_name = thread->GetQueueName();
488*30fdc8d8SChris Lattner                     if (queue_name && queue_name[0])
489*30fdc8d8SChris Lattner                         fprintf (out, ", queue = %s", queue_name);
490*30fdc8d8SChris Lattner                     fprintf (out, "\n");
491*30fdc8d8SChris Lattner                 }
492*30fdc8d8SChris Lattner             }
493*30fdc8d8SChris Lattner         }
494*30fdc8d8SChris Lattner     }
495*30fdc8d8SChris Lattner }
496*30fdc8d8SChris Lattner 
497*30fdc8d8SChris Lattner SBThread
498*30fdc8d8SChris Lattner SBProcess::GetThreadByID (tid_t sb_thread_id)
499*30fdc8d8SChris Lattner {
500*30fdc8d8SChris Lattner     SBThread thread;
501*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
502*30fdc8d8SChris Lattner         thread.SetThread (m_lldb_object_sp->GetThreadList().FindThreadByID ((tid_t) sb_thread_id));
503*30fdc8d8SChris Lattner     return thread;
504*30fdc8d8SChris Lattner }
505*30fdc8d8SChris Lattner 
506*30fdc8d8SChris Lattner void
507*30fdc8d8SChris Lattner SBProcess::Backtrace (bool all_threads, uint32_t num_frames)
508*30fdc8d8SChris Lattner {
509*30fdc8d8SChris Lattner     if (m_lldb_object_sp)
510*30fdc8d8SChris Lattner     {
511*30fdc8d8SChris Lattner         if (!all_threads)
512*30fdc8d8SChris Lattner         {
513*30fdc8d8SChris Lattner             SBDebugger::UpdateCurrentThread (*this);
514*30fdc8d8SChris Lattner             SBThread cur_thread = GetCurrentThread();
515*30fdc8d8SChris Lattner             if (cur_thread.IsValid())
516*30fdc8d8SChris Lattner               cur_thread.Backtrace (num_frames);
517*30fdc8d8SChris Lattner         }
518*30fdc8d8SChris Lattner         else
519*30fdc8d8SChris Lattner         {
520*30fdc8d8SChris Lattner             int num_threads = GetNumThreads ();
521*30fdc8d8SChris Lattner             for (int i = 0; i < num_threads; ++i)
522*30fdc8d8SChris Lattner             {
523*30fdc8d8SChris Lattner                 SBThread sb_thread = GetThreadAtIndex (i);
524*30fdc8d8SChris Lattner                 sb_thread.Backtrace (num_frames);
525*30fdc8d8SChris Lattner             }
526*30fdc8d8SChris Lattner         }
527*30fdc8d8SChris Lattner     }
528*30fdc8d8SChris Lattner }
529*30fdc8d8SChris Lattner 
530*30fdc8d8SChris Lattner StateType
531*30fdc8d8SChris Lattner SBProcess::GetStateFromEvent (const SBEvent &event)
532*30fdc8d8SChris Lattner {
533*30fdc8d8SChris Lattner     return Process::ProcessEventData::GetStateFromEvent (event.GetLLDBObjectPtr());
534*30fdc8d8SChris Lattner }
535*30fdc8d8SChris Lattner 
536*30fdc8d8SChris Lattner 
537*30fdc8d8SChris Lattner bool
538*30fdc8d8SChris Lattner SBProcess::GetRestartedFromEvent (const SBEvent &event)
539*30fdc8d8SChris Lattner {
540*30fdc8d8SChris Lattner     return Process::ProcessEventData::GetRestartedFromEvent (event.GetLLDBObjectPtr());
541*30fdc8d8SChris Lattner }
542*30fdc8d8SChris Lattner 
543*30fdc8d8SChris Lattner SBProcess
544*30fdc8d8SChris Lattner SBProcess::GetProcessFromEvent (const SBEvent &event)
545*30fdc8d8SChris Lattner {
546*30fdc8d8SChris Lattner     SBProcess process(Process::ProcessEventData::GetProcessFromEvent (event.GetLLDBObjectPtr()));
547*30fdc8d8SChris Lattner     return process;
548*30fdc8d8SChris Lattner }
549*30fdc8d8SChris Lattner 
550*30fdc8d8SChris Lattner 
551*30fdc8d8SChris Lattner SBBroadcaster
552*30fdc8d8SChris Lattner SBProcess::GetBroadcaster () const
553*30fdc8d8SChris Lattner {
554*30fdc8d8SChris Lattner     SBBroadcaster broadcaster(m_lldb_object_sp.get(), false);
555*30fdc8d8SChris Lattner     return broadcaster;
556*30fdc8d8SChris Lattner }
557*30fdc8d8SChris Lattner 
558*30fdc8d8SChris Lattner lldb_private::Process *
559*30fdc8d8SChris Lattner SBProcess::operator->() const
560*30fdc8d8SChris Lattner {
561*30fdc8d8SChris Lattner     return m_lldb_object_sp.get();
562*30fdc8d8SChris Lattner }
563*30fdc8d8SChris Lattner 
564*30fdc8d8SChris Lattner size_t
565*30fdc8d8SChris Lattner SBProcess::ReadMemory (addr_t addr, void *dst, size_t dst_len, SBError &sb_error)
566*30fdc8d8SChris Lattner {
567*30fdc8d8SChris Lattner     size_t bytes_read = 0;
568*30fdc8d8SChris Lattner 
569*30fdc8d8SChris Lattner     if (IsValid())
570*30fdc8d8SChris Lattner     {
571*30fdc8d8SChris Lattner         Error error;
572*30fdc8d8SChris Lattner         bytes_read = m_lldb_object_sp->ReadMemory (addr, dst, dst_len, error);
573*30fdc8d8SChris Lattner         sb_error.SetError (error);
574*30fdc8d8SChris Lattner     }
575*30fdc8d8SChris Lattner     else
576*30fdc8d8SChris Lattner     {
577*30fdc8d8SChris Lattner         sb_error.SetErrorString ("SBProcess is invalid");
578*30fdc8d8SChris Lattner     }
579*30fdc8d8SChris Lattner 
580*30fdc8d8SChris Lattner     return bytes_read;
581*30fdc8d8SChris Lattner }
582*30fdc8d8SChris Lattner 
583*30fdc8d8SChris Lattner size_t
584*30fdc8d8SChris Lattner SBProcess::WriteMemory (addr_t addr, const void *src, size_t src_len, SBError &sb_error)
585*30fdc8d8SChris Lattner {
586*30fdc8d8SChris Lattner     size_t bytes_written = 0;
587*30fdc8d8SChris Lattner 
588*30fdc8d8SChris Lattner     if (IsValid())
589*30fdc8d8SChris Lattner     {
590*30fdc8d8SChris Lattner         Error error;
591*30fdc8d8SChris Lattner         bytes_written = m_lldb_object_sp->WriteMemory (addr, src, src_len, error);
592*30fdc8d8SChris Lattner         sb_error.SetError (error);
593*30fdc8d8SChris Lattner     }
594*30fdc8d8SChris Lattner 
595*30fdc8d8SChris Lattner     return bytes_written;
596*30fdc8d8SChris Lattner }
597*30fdc8d8SChris Lattner 
598*30fdc8d8SChris Lattner // Mimic shared pointer...
599*30fdc8d8SChris Lattner lldb_private::Process *
600*30fdc8d8SChris Lattner SBProcess::get() const
601*30fdc8d8SChris Lattner {
602*30fdc8d8SChris Lattner     return m_lldb_object_sp.get();
603*30fdc8d8SChris Lattner }
604*30fdc8d8SChris Lattner 
605