1//===-- Host.h --------------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_Host_h_
11#define liblldb_Host_h_
12#if defined(__cplusplus)
13
14#include <stdarg.h>
15
16#include <map>
17#include <string>
18
19#include "lldb/lldb-private.h"
20#include "lldb/Core/StringList.h"
21
22namespace lldb_private {
23
24//----------------------------------------------------------------------
25/// @class Host Host.h "lldb/Host/Host.h"
26/// @brief A class that provides host computer information.
27///
28/// Host is a class that answers information about the host operating
29/// system.
30//----------------------------------------------------------------------
31class Host
32{
33public:
34    typedef bool (*MonitorChildProcessCallback) (void *callback_baton,
35                                                 lldb::pid_t pid,
36                                                 bool exited,
37                                                 int signal,    // Zero for no signal
38                                                 int status);   // Exit value of process if signal is zero
39
40    //------------------------------------------------------------------
41    /// Start monitoring a child process.
42    ///
43    /// Allows easy monitoring of child processes. \a callback will be
44    /// called when the child process exits or if it gets a signal. The
45    /// callback will only be called with signals if \a monitor_signals
46    /// is \b true. \a callback will usually be called from another
47    /// thread so the callback function must be thread safe.
48    ///
49    /// When the callback gets called, the return value indicates if
50    /// minotoring should stop. If \b true is returned from \a callback
51    /// the information will be removed. If \b false is returned then
52    /// monitoring will continue. If the child process exits, the
53    /// monitoring will automatically stop after the callback returned
54    /// ragardless of the callback return value.
55    ///
56    /// @param[in] callback
57    ///     A function callback to call when a child receives a signal
58    ///     (if \a monitor_signals is true) or a child exits.
59    ///
60    /// @param[in] callback_baton
61    ///     A void * of user data that will be pass back when
62    ///     \a callback is called.
63    ///
64    /// @param[in] pid
65    ///     The process ID of a child process to monitor, -1 for all
66    ///     processes.
67    ///
68    /// @param[in] monitor_signals
69    ///     If \b true the callback will get called when the child
70    ///     process gets a signal. If \b false, the callback will only
71    ///     get called if the child process exits.
72    ///
73    /// @return
74    ///     A thread handle that can be used to cancel the thread that
75    ///     was spawned to monitor \a pid.
76    ///
77    /// @see static void Host::StopMonitoringChildProcess (uint32_t)
78    //------------------------------------------------------------------
79    static lldb::thread_t
80    StartMonitoringChildProcess (MonitorChildProcessCallback callback,
81                                 void *callback_baton,
82                                 lldb::pid_t pid,
83                                 bool monitor_signals);
84
85    //------------------------------------------------------------------
86    /// Get the host page size.
87    ///
88    /// @return
89    ///     The size in bytes of a VM page on the host system.
90    //------------------------------------------------------------------
91    static size_t
92    GetPageSize();
93
94    //------------------------------------------------------------------
95    /// Returns the endianness of the host system.
96    ///
97    /// @return
98    ///     Returns the endianness of the host system as a lldb::ByteOrder
99    ///     enumeration.
100    //------------------------------------------------------------------
101    static lldb::ByteOrder
102    GetByteOrder ();
103
104    //------------------------------------------------------------------
105    /// Returns the number of CPUs on this current host.
106    ///
107    /// @return
108    ///     Number of CPUs on this current host, or zero if the number
109    ///     of CPUs can't be determined on this host.
110    //------------------------------------------------------------------
111    static uint32_t
112    GetNumberCPUS ();
113
114    static bool
115    GetOSVersion (uint32_t &major,
116                  uint32_t &minor,
117                  uint32_t &update);
118
119    static bool
120    GetOSBuildString (std::string &s);
121
122    static bool
123    GetOSKernelDescription (std::string &s);
124
125    static bool
126    GetHostname (std::string &s);
127
128    static const char *
129    GetUserName (uint32_t uid, std::string &user_name);
130
131    static const char *
132    GetGroupName (uint32_t gid, std::string &group_name);
133
134    static uint32_t
135    GetUserID ();
136
137    static uint32_t
138    GetGroupID ();
139
140    static uint32_t
141    GetEffectiveUserID ();
142
143    static uint32_t
144    GetEffectiveGroupID ();
145
146
147    enum SystemLogType
148    {
149        eSystemLogWarning,
150        eSystemLogError
151    };
152
153    static void
154    SystemLog (SystemLogType type, const char *format, ...) __attribute__ ((format (printf, 2, 3)));
155
156    static void
157    SystemLog (SystemLogType type, const char *format, va_list args);
158
159    //------------------------------------------------------------------
160    /// Gets the host architecture.
161    ///
162    /// @return
163    ///     A const architecture object that represents the host
164    ///     architecture.
165    //------------------------------------------------------------------
166    enum SystemDefaultArchitecture
167    {
168        eSystemDefaultArchitecture,     // The overall default architecture that applications will run on this host
169        eSystemDefaultArchitecture32,   // If this host supports 32 bit programs, return the default 32 bit arch
170        eSystemDefaultArchitecture64    // If this host supports 64 bit programs, return the default 64 bit arch
171    };
172
173    static const ArchSpec &
174    GetArchitecture (SystemDefaultArchitecture arch_kind = eSystemDefaultArchitecture);
175
176    //------------------------------------------------------------------
177    /// Gets the host vendor string.
178    ///
179    /// @return
180    ///     A const string object containing the host vendor name.
181    //------------------------------------------------------------------
182    static const ConstString &
183    GetVendorString ();
184
185    //------------------------------------------------------------------
186    /// Gets the host Operating System (OS) string.
187    ///
188    /// @return
189    ///     A const string object containing the host OS name.
190    //------------------------------------------------------------------
191    static const ConstString &
192    GetOSString ();
193
194    //------------------------------------------------------------------
195    /// Gets the host target triple as a const string.
196    ///
197    /// @return
198    ///     A const string object containing the host target triple.
199    //------------------------------------------------------------------
200    static const ConstString &
201    GetTargetTriple ();
202
203    //------------------------------------------------------------------
204    /// Get the process ID for the calling process.
205    ///
206    /// @return
207    ///     The process ID for the current process.
208    //------------------------------------------------------------------
209    static lldb::pid_t
210    GetCurrentProcessID ();
211
212    //------------------------------------------------------------------
213    /// Get the thread ID for the calling thread in the current process.
214    ///
215    /// @return
216    ///     The thread ID for the calling thread in the current process.
217    //------------------------------------------------------------------
218    static lldb::tid_t
219    GetCurrentThreadID ();
220
221    //------------------------------------------------------------------
222    /// Get the thread token (the one returned by ThreadCreate when the thread was created) for the
223    /// calling thread in the current process.
224    ///
225    /// @return
226    ///     The thread token for the calling thread in the current process.
227    //------------------------------------------------------------------
228    static lldb::thread_t
229    GetCurrentThread ();
230
231    static const char *
232    GetSignalAsCString (int signo);
233
234    static void
235    WillTerminate ();
236    //------------------------------------------------------------------
237    /// Host specific thread created function call.
238    ///
239    /// This function call lets the current host OS do any thread
240    /// specific initialization that it needs, including naming the
241    /// thread. No cleanup routine is exptected to be called
242    ///
243    /// @param[in] name
244    ///     The current thread's name in the current process.
245    //------------------------------------------------------------------
246    static void
247    ThreadCreated (const char *name);
248
249    static lldb::thread_t
250    ThreadCreate (const char *name,
251                  lldb::thread_func_t function,
252                  lldb::thread_arg_t thread_arg,
253                  Error *err);
254
255    static bool
256    ThreadCancel (lldb::thread_t thread,
257                  Error *error);
258
259    static bool
260    ThreadDetach (lldb::thread_t thread,
261                  Error *error);
262    static bool
263    ThreadJoin (lldb::thread_t thread,
264                lldb::thread_result_t *thread_result_ptr,
265                Error *error);
266
267    //------------------------------------------------------------------
268    /// Gets the name of a thread in a process.
269    ///
270    /// This function will name a thread in a process using it's own
271    /// thread name pool, and also will attempt to set a thread name
272    /// using any supported host OS APIs.
273    ///
274    /// @param[in] pid
275    ///     The process ID in which we are trying to get the name of
276    ///     a thread.
277    ///
278    /// @param[in] tid
279    ///     The thread ID for which we are trying retrieve the name of.
280    ///
281    /// @return
282    ///     A std::string containing the thread name.
283    //------------------------------------------------------------------
284    static std::string
285    GetThreadName (lldb::pid_t pid, lldb::tid_t tid);
286
287    //------------------------------------------------------------------
288    /// Sets the name of a thread in the current process.
289    ///
290    /// @param[in] pid
291    ///     The process ID in which we are trying to name a thread.
292    ///
293    /// @param[in] tid
294    ///     The thread ID which we are trying to name.
295    ///
296    /// @param[in] name
297    ///     The current thread's name in the current process to \a name.
298    ///
299    /// @return
300    ///     \b true if the thread name was able to be set, \b false
301    ///     otherwise.
302    //------------------------------------------------------------------
303    static bool
304    SetThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name);
305
306    //------------------------------------------------------------------
307    /// Sets a shortened name of a thread in the current process.
308    ///
309    /// @param[in] pid
310    ///     The process ID in which we are trying to name a thread.
311    ///
312    /// @param[in] tid
313    ///     The thread ID which we are trying to name.
314    ///
315    /// @param[in] name
316    ///     The current thread's name in the current process to \a name.
317    ///
318    /// @param[in] len
319    ///     The maximum length for the thread's shortened name.
320    ///
321    /// @return
322    ///     \b true if the thread name was able to be set, \b false
323    ///     otherwise.
324    static bool
325    SetShortThreadName (lldb::pid_t pid, lldb::tid_t tid, const char *name, size_t len);
326
327    //------------------------------------------------------------------
328    /// Gets the FileSpec of the current process (the process that
329    /// that is running the LLDB code).
330    ///
331    /// @return
332    ///     \b A file spec with the program name.
333    //------------------------------------------------------------------
334    static FileSpec
335    GetProgramFileSpec ();
336
337    //------------------------------------------------------------------
338    /// Given an address in the current process (the process that
339    /// is running the LLDB code), return the name of the module that
340    /// it comes from. This can be useful when you need to know the
341    /// path to the shared library that your code is running in for
342    /// loading resources that are relative to your binary.
343    ///
344    /// @param[in] host_addr
345    ///     The pointer to some code in the current process.
346    ///
347    /// @return
348    ///     \b A file spec with the module that contains \a host_addr,
349    ///     which may be invalid if \a host_addr doesn't fall into
350    ///     any valid module address range.
351    //------------------------------------------------------------------
352    static FileSpec
353    GetModuleFileSpecForHostAddress (const void *host_addr);
354
355
356
357    //------------------------------------------------------------------
358    /// If you have an executable that is in a bundle and want to get
359    /// back to the bundle directory from the path itself, this
360    /// function will change a path to a file within a bundle to the
361    /// bundle directory itself.
362    ///
363    /// @param[in] file
364    ///     A file spec that might point to a file in a bundle.
365    ///
366    /// @param[out] bundle_directory
367    ///     An object will be filled in with the bundle directory for
368    ///     the bundle when \b true is returned. Otherwise \a file is
369    ///     left untouched and \b false is returned.
370    ///
371    /// @return
372    ///     \b true if \a file was resolved in \a bundle_directory,
373    ///     \b false otherwise.
374    //------------------------------------------------------------------
375    static bool
376    GetBundleDirectory (const FileSpec &file, FileSpec &bundle_directory);
377
378    //------------------------------------------------------------------
379    /// When executable files may live within a directory, where the
380    /// directory represents an executable bundle (like the MacOSX
381    /// app bundles), the locate the executable within the containing
382    /// bundle.
383    ///
384    /// @param[in,out] file
385    ///     A file spec that currently points to the bundle that will
386    ///     be filled in with the executable path within the bundle
387    ///     if \b true is returned. Otherwise \a file is left untouched.
388    ///
389    /// @return
390    ///     \b true if \a file was resolved, \b false if this function
391    ///     was not able to resolve the path.
392    //------------------------------------------------------------------
393    static bool
394    ResolveExecutableInBundle (FileSpec &file);
395
396    //------------------------------------------------------------------
397    /// Find a resource files that are related to LLDB.
398    ///
399    /// Operating systems have different ways of storing shared
400    /// libraries and related resources. This function abstracts the
401    /// access to these paths.
402    ///
403    /// @param[in] path_type
404    ///     The type of LLDB resource path you are looking for. If the
405    ///     enumeration ends with "Dir", then only the \a file_spec's
406    ///     directory member gets filled in.
407    ///
408    /// @param[in] file_spec
409    ///     A file spec that gets filled in with the appriopriate path.
410    ///
411    /// @return
412    ///     \b true if \a resource_path was resolved, \a false otherwise.
413    //------------------------------------------------------------------
414    static bool
415    GetLLDBPath (PathType path_type,
416                 FileSpec &file_spec);
417
418    //------------------------------------------------------------------
419    /// Set a string that can be displayed if host application crashes.
420    ///
421    /// Some operating systems have the ability to print a description
422    /// for shared libraries when a program crashes. If the host OS
423    /// supports such a mechanism, it should be implemented to help
424    /// with crash triage.
425    ///
426    /// @param[in] format
427    ///     A printf format that will be used to form a new crash
428    ///     description string.
429    //------------------------------------------------------------------
430    static void
431    SetCrashDescriptionWithFormat (const char *format, ...)  __attribute__ ((format (printf, 1, 2)));
432
433    static void
434    SetCrashDescription (const char *description);
435
436    static uint32_t
437    FindProcesses (const ProcessInstanceInfoMatch &match_info,
438                   ProcessInstanceInfoList &proc_infos);
439
440    typedef std::map<lldb::pid_t, bool> TidMap;
441    typedef std::pair<lldb::pid_t, bool> TidPair;
442    static bool
443    FindProcessThreads (const lldb::pid_t pid, TidMap &tids_to_attach);
444
445    static bool
446    GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &proc_info);
447
448    static lldb::pid_t
449    LaunchApplication (const FileSpec &app_file_spec);
450
451    static Error
452    LaunchProcess (ProcessLaunchInfo &launch_info);
453
454    static Error
455    RunShellCommand (const char *command,           // Shouldn't be NULL
456                     const char *working_dir,       // Pass NULL to use the current working directory
457                     int *status_ptr,               // Pass NULL if you don't want the process exit status
458                     int *signo_ptr,                // Pass NULL if you don't want the signal that caused the process to exit
459                     std::string *command_output,   // Pass NULL if you don't want the command output
460                     uint32_t timeout_sec,
461                     const char *shell = "/bin/bash");
462
463    static lldb::DataBufferSP
464    GetAuxvData (lldb_private::Process *process);
465
466    static lldb::TargetSP
467    GetDummyTarget (Debugger &debugger);
468
469    static bool
470    OpenFileInExternalEditor (const FileSpec &file_spec,
471                              uint32_t line_no);
472
473    static void
474    Backtrace (Stream &strm, uint32_t max_frames);
475
476    static size_t
477    GetEnvironment (StringList &env);
478
479    enum DynamicLibraryOpenOptions
480    {
481        eDynamicLibraryOpenOptionLazy           = (1u << 0),  // Lazily resolve symbols in this dynamic library
482        eDynamicLibraryOpenOptionLocal          = (1u << 1),  // Only open a shared library with local access (hide it from the global symbol namespace)
483        eDynamicLibraryOpenOptionLimitGetSymbol = (1u << 2)   // DynamicLibraryGetSymbol calls on this handle will only return matches from this shared library
484    };
485    static void *
486    DynamicLibraryOpen (const FileSpec &file_spec,
487                        uint32_t options,
488                        Error &error);
489
490    static Error
491    DynamicLibraryClose (void *dynamic_library_handle);
492
493    static void *
494    DynamicLibraryGetSymbol (void *dynamic_library_handle,
495                             const char *symbol_name,
496                             Error &error);
497};
498
499} // namespace lldb_private
500
501#endif  // #if defined(__cplusplus)
502#endif  // liblldb_Host_h_
503