blob: bbd24ea65554647b05df94a2a64fdc2edbde5291 [file] [log] [blame]
Todd Fialaaf245d12014-06-30 21:05:18 +00001//===-- NativeProcessLinux.cpp -------------------------------- -*- 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
Todd Fialaaf245d12014-06-30 21:05:18 +000010#include "NativeProcessLinux.h"
11
12// C Includes
13#include <errno.h>
Todd Fialaaf245d12014-06-30 21:05:18 +000014#include <string.h>
15#include <stdint.h>
16#include <unistd.h>
Todd Fialaaf245d12014-06-30 21:05:18 +000017
18// C++ Includes
19#include <fstream>
Pavel Labathdf7c6992015-06-17 18:38:49 +000020#include <mutex>
Pavel Labathc0765592015-05-06 10:46:34 +000021#include <sstream>
Todd Fialaaf245d12014-06-30 21:05:18 +000022#include <string>
Pavel Labath5b981ab2015-05-29 12:53:54 +000023#include <unordered_map>
Todd Fialaaf245d12014-06-30 21:05:18 +000024
25// Other libraries and framework includes
Tamas Berghammerd8c338d2015-04-15 09:47:02 +000026#include "lldb/Core/EmulateInstruction.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000027#include "lldb/Core/Error.h"
Oleksiy Vyalov6edef202014-11-17 22:16:42 +000028#include "lldb/Core/ModuleSpec.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000029#include "lldb/Core/RegisterValue.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000030#include "lldb/Core/State.h"
31#include "lldb/Host/Host.h"
Zachary Turner39de3112014-09-09 20:54:56 +000032#include "lldb/Host/ThreadLauncher.h"
Pavel Labath2a86b552016-06-14 17:30:52 +000033#include "lldb/Host/common/NativeBreakpoint.h"
34#include "lldb/Host/common/NativeRegisterContext.h"
35#include "lldb/Symbol/ObjectFile.h"
Zachary Turner90aff472015-03-03 23:36:51 +000036#include "lldb/Target/Process.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000037#include "lldb/Target/ProcessLaunchInfo.h"
Pavel Labath5b981ab2015-05-29 12:53:54 +000038#include "lldb/Target/Target.h"
Chaoren Linc16f5dc2015-03-19 23:28:10 +000039#include "lldb/Utility/LLDBAssert.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000040#include "lldb/Utility/PseudoTerminal.h"
Pavel Labathf805e192015-07-07 10:08:41 +000041#include "lldb/Utility/StringExtractor.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000042
Tamas Berghammer1e209fc2015-03-13 11:36:47 +000043#include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000044#include "NativeThreadLinux.h"
45#include "ProcFileReader.h"
Tamas Berghammer1e209fc2015-03-13 11:36:47 +000046#include "Procfs.h"
Todd Fialacacde7d2014-09-27 16:54:22 +000047
Tamas Berghammerd8584872015-02-06 10:57:40 +000048// System includes - They have to be included after framework includes because they define some
49// macros which collide with variable names in other modules
50#include <linux/unistd.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000051#include <sys/socket.h>
Vince Harron8b335672015-05-12 01:10:56 +000052
Pavel Labathdf7c6992015-06-17 18:38:49 +000053#include <sys/syscall.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000054#include <sys/types.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000055#include <sys/user.h>
56#include <sys/wait.h>
57
Vince Harron8b335672015-05-12 01:10:56 +000058#include "lldb/Host/linux/Personality.h"
59#include "lldb/Host/linux/Ptrace.h"
Pavel Labathdf7c6992015-06-17 18:38:49 +000060#include "lldb/Host/linux/Uio.h"
Vince Harron8b335672015-05-12 01:10:56 +000061#include "lldb/Host/android/Android.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000062
Todd Fiala0bce1b62014-08-17 00:10:50 +000063#define LLDB_PERSONALITY_GET_CURRENT_SETTINGS 0xffffffff
Todd Fialaaf245d12014-06-30 21:05:18 +000064
65// Support hardware breakpoints in case it has not been defined
66#ifndef TRAP_HWBKPT
67 #define TRAP_HWBKPT 4
68#endif
69
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +000070using namespace lldb;
71using namespace lldb_private;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000072using namespace lldb_private::process_linux;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +000073using namespace llvm;
74
Todd Fialaaf245d12014-06-30 21:05:18 +000075// Private bits we only need internally.
Pavel Labathdf7c6992015-06-17 18:38:49 +000076
77static bool ProcessVmReadvSupported()
78{
79 static bool is_supported;
80 static std::once_flag flag;
81
82 std::call_once(flag, [] {
83 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
84
85 uint32_t source = 0x47424742;
86 uint32_t dest = 0;
87
88 struct iovec local, remote;
89 remote.iov_base = &source;
90 local.iov_base = &dest;
91 remote.iov_len = local.iov_len = sizeof source;
92
93 // We shall try if cross-process-memory reads work by attempting to read a value from our own process.
94 ssize_t res = process_vm_readv(getpid(), &local, 1, &remote, 1, 0);
95 is_supported = (res == sizeof(source) && source == dest);
96 if (log)
97 {
98 if (is_supported)
99 log->Printf("%s: Detected kernel support for process_vm_readv syscall. Fast memory reads enabled.",
100 __FUNCTION__);
101 else
102 log->Printf("%s: syscall process_vm_readv failed (error: %s). Fast memory reads disabled.",
103 __FUNCTION__, strerror(errno));
104 }
105 });
106
107 return is_supported;
108}
109
Todd Fialaaf245d12014-06-30 21:05:18 +0000110namespace
111{
Pavel Labath2a86b552016-06-14 17:30:52 +0000112Error
113ResolveProcessArchitecture(lldb::pid_t pid, ArchSpec &arch)
114{
115 // Grab process info for the running process.
116 ProcessInstanceInfo process_info;
117 if (!Host::GetProcessInfo(pid, process_info))
118 return Error("failed to get process info");
Todd Fialaaf245d12014-06-30 21:05:18 +0000119
Pavel Labath2a86b552016-06-14 17:30:52 +0000120 // Resolve the executable module.
121 ModuleSpecList module_specs;
122 if (!ObjectFile::GetModuleSpecifications(process_info.GetExecutableFile(), 0, 0, module_specs))
123 return Error("failed to get module specifications");
124 assert(module_specs.GetSize() == 1);
Todd Fialaaf245d12014-06-30 21:05:18 +0000125
Pavel Labath2a86b552016-06-14 17:30:52 +0000126 arch = module_specs.GetModuleSpecRefAtIndex(0).GetArchitecture();
127 if (arch.IsValid())
128 return Error();
129 else
130 return Error("failed to retrieve a valid architecture from the exe module");
131}
Todd Fialaaf245d12014-06-30 21:05:18 +0000132
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000133// Used to notify the parent about which part of the launch sequence failed.
134enum LaunchCallSpecifier
135{
136 ePtraceFailed,
137 eDupStdinFailed,
138 eDupStdoutFailed,
139 eDupStderrFailed,
140 eChdirFailed,
141 eExecFailed,
142 eSetGidFailed,
143 eSetSigMaskFailed,
144 eLaunchCallMax = eSetSigMaskFailed
145};
146
147static uint8_t LLVM_ATTRIBUTE_NORETURN
148ExitChildAbnormally(LaunchCallSpecifier spec)
149{
150 static_assert(eLaunchCallMax < 0x8, "Have more launch calls than we are able to represent");
151 // This may truncate the topmost bits of the errno because the exit code is only 8 bits wide.
152 // However, it should still give us a pretty good indication of what went wrong. (And the
153 // most common errors have small numbers anyway).
154 _exit(unsigned(spec) | (errno << 3));
155}
156
157// The second member is the errno (or its 5 lowermost bits anyway).
158inline std::pair<LaunchCallSpecifier, uint8_t>
159DecodeChildExitCode(int exit_code)
160{
161 return std::make_pair(LaunchCallSpecifier(exit_code & 0x7), exit_code >> 3);
162}
163
Todd Fialaaf245d12014-06-30 21:05:18 +0000164 void
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000165 DisplayBytes (StreamString &s, void *bytes, uint32_t count)
Todd Fialaaf245d12014-06-30 21:05:18 +0000166 {
167 uint8_t *ptr = (uint8_t *)bytes;
168 const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count);
169 for(uint32_t i=0; i<loop_count; i++)
170 {
171 s.Printf ("[%x]", *ptr);
172 ptr++;
173 }
174 }
175
176 void
177 PtraceDisplayBytes(int &req, void *data, size_t data_size)
178 {
179 StreamString buf;
180 Log *verbose_log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (
181 POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE));
182
183 if (verbose_log)
184 {
185 switch(req)
186 {
187 case PTRACE_POKETEXT:
188 {
189 DisplayBytes(buf, &data, 8);
190 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData());
191 break;
192 }
193 case PTRACE_POKEDATA:
194 {
195 DisplayBytes(buf, &data, 8);
196 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData());
197 break;
198 }
199 case PTRACE_POKEUSER:
200 {
201 DisplayBytes(buf, &data, 8);
202 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData());
203 break;
204 }
205 case PTRACE_SETREGS:
206 {
207 DisplayBytes(buf, data, data_size);
208 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData());
209 break;
210 }
211 case PTRACE_SETFPREGS:
212 {
213 DisplayBytes(buf, data, data_size);
214 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData());
215 break;
216 }
217 case PTRACE_SETSIGINFO:
218 {
219 DisplayBytes(buf, data, sizeof(siginfo_t));
220 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData());
221 break;
222 }
223 case PTRACE_SETREGSET:
224 {
225 // Extract iov_base from data, which is a pointer to the struct IOVEC
226 DisplayBytes(buf, *(void **)data, data_size);
227 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData());
228 break;
229 }
230 default:
231 {
232 }
233 }
234 }
235 }
236
Pavel Labath19cbe962015-07-21 13:20:32 +0000237 static constexpr unsigned k_ptrace_word_size = sizeof(void*);
238 static_assert(sizeof(long) >= k_ptrace_word_size, "Size of long must be larger than ptrace word size");
Pavel Labath1107b5a2015-04-17 14:07:49 +0000239} // end of anonymous namespace
240
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000241// Simple helper function to ensure flags are enabled on the given file
242// descriptor.
243static Error
244EnsureFDFlags(int fd, int flags)
245{
246 Error error;
247
248 int status = fcntl(fd, F_GETFL);
249 if (status == -1)
250 {
251 error.SetErrorToErrno();
252 return error;
253 }
254
255 if (fcntl(fd, F_SETFL, status | flags) == -1)
256 {
257 error.SetErrorToErrno();
258 return error;
259 }
260
261 return error;
262}
263
Pavel Labath2a86b552016-06-14 17:30:52 +0000264NativeProcessLinux::LaunchArgs::LaunchArgs(char const **argv, char const **envp, const FileSpec &stdin_file_spec,
265 const FileSpec &stdout_file_spec, const FileSpec &stderr_file_spec,
266 const FileSpec &working_dir, const ProcessLaunchInfo &launch_info)
267 : m_argv(argv),
Todd Fialaaf245d12014-06-30 21:05:18 +0000268 m_envp(envp),
Chaoren Lind3173f32015-05-29 19:52:29 +0000269 m_stdin_file_spec(stdin_file_spec),
270 m_stdout_file_spec(stdout_file_spec),
271 m_stderr_file_spec(stderr_file_spec),
Todd Fiala0bce1b62014-08-17 00:10:50 +0000272 m_working_dir(working_dir),
273 m_launch_info(launch_info)
274{
275}
Todd Fialaaf245d12014-06-30 21:05:18 +0000276
277NativeProcessLinux::LaunchArgs::~LaunchArgs()
278{ }
279
Todd Fialaaf245d12014-06-30 21:05:18 +0000280// -----------------------------------------------------------------------------
281// Public Static Methods
282// -----------------------------------------------------------------------------
283
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000284Error
Pavel Labathd5b310f2015-07-09 11:51:11 +0000285NativeProcessProtocol::Launch (
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000286 ProcessLaunchInfo &launch_info,
287 NativeProcessProtocol::NativeDelegate &native_delegate,
Pavel Labath19cbe962015-07-21 13:20:32 +0000288 MainLoop &mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000289 NativeProcessProtocolSP &native_process_sp)
290{
291 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
292
Pavel Labath2a86b552016-06-14 17:30:52 +0000293 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000294
295 // Verify the working directory is valid if one was specified.
Chaoren Lind3173f32015-05-29 19:52:29 +0000296 FileSpec working_dir{launch_info.GetWorkingDirectory()};
297 if (working_dir &&
298 (!working_dir.ResolvePath() ||
299 working_dir.GetFileType() != FileSpec::eFileTypeDirectory))
Todd Fialaaf245d12014-06-30 21:05:18 +0000300 {
Chaoren Lind3173f32015-05-29 19:52:29 +0000301 error.SetErrorStringWithFormat ("No such file or directory: %s",
302 working_dir.GetCString());
303 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000304 }
305
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000306 const FileAction *file_action;
Todd Fialaaf245d12014-06-30 21:05:18 +0000307
Chaoren Lind3173f32015-05-29 19:52:29 +0000308 // Default of empty will mean to use existing open file descriptors.
309 FileSpec stdin_file_spec{};
310 FileSpec stdout_file_spec{};
311 FileSpec stderr_file_spec{};
Todd Fialaaf245d12014-06-30 21:05:18 +0000312
313 file_action = launch_info.GetFileActionForFD (STDIN_FILENO);
Todd Fiala75f47c32014-10-11 21:42:09 +0000314 if (file_action)
Chaoren Lind3173f32015-05-29 19:52:29 +0000315 stdin_file_spec = file_action->GetFileSpec();
Todd Fialaaf245d12014-06-30 21:05:18 +0000316
317 file_action = launch_info.GetFileActionForFD (STDOUT_FILENO);
Todd Fiala75f47c32014-10-11 21:42:09 +0000318 if (file_action)
Chaoren Lind3173f32015-05-29 19:52:29 +0000319 stdout_file_spec = file_action->GetFileSpec();
Todd Fialaaf245d12014-06-30 21:05:18 +0000320
321 file_action = launch_info.GetFileActionForFD (STDERR_FILENO);
Todd Fiala75f47c32014-10-11 21:42:09 +0000322 if (file_action)
Chaoren Lind3173f32015-05-29 19:52:29 +0000323 stderr_file_spec = file_action->GetFileSpec();
Todd Fiala75f47c32014-10-11 21:42:09 +0000324
325 if (log)
326 {
Chaoren Lind3173f32015-05-29 19:52:29 +0000327 if (stdin_file_spec)
328 log->Printf ("NativeProcessLinux::%s setting STDIN to '%s'",
329 __FUNCTION__, stdin_file_spec.GetCString());
Todd Fiala75f47c32014-10-11 21:42:09 +0000330 else
331 log->Printf ("NativeProcessLinux::%s leaving STDIN as is", __FUNCTION__);
332
Chaoren Lind3173f32015-05-29 19:52:29 +0000333 if (stdout_file_spec)
334 log->Printf ("NativeProcessLinux::%s setting STDOUT to '%s'",
335 __FUNCTION__, stdout_file_spec.GetCString());
Todd Fiala75f47c32014-10-11 21:42:09 +0000336 else
337 log->Printf ("NativeProcessLinux::%s leaving STDOUT as is", __FUNCTION__);
338
Chaoren Lind3173f32015-05-29 19:52:29 +0000339 if (stderr_file_spec)
340 log->Printf ("NativeProcessLinux::%s setting STDERR to '%s'",
341 __FUNCTION__, stderr_file_spec.GetCString());
Todd Fiala75f47c32014-10-11 21:42:09 +0000342 else
343 log->Printf ("NativeProcessLinux::%s leaving STDERR as is", __FUNCTION__);
344 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000345
346 // Create the NativeProcessLinux in launch mode.
347 native_process_sp.reset (new NativeProcessLinux ());
348
349 if (log)
350 {
351 int i = 0;
352 for (const char **args = launch_info.GetArguments ().GetConstArgumentVector (); *args; ++args, ++i)
353 {
354 log->Printf ("NativeProcessLinux::%s arg %d: \"%s\"", __FUNCTION__, i, *args ? *args : "nullptr");
355 ++i;
356 }
357 }
358
359 if (!native_process_sp->RegisterNativeDelegate (native_delegate))
360 {
361 native_process_sp.reset ();
362 error.SetErrorStringWithFormat ("failed to register the native delegate");
363 return error;
364 }
365
Tamas Berghammercb84eeb2015-03-17 15:05:31 +0000366 std::static_pointer_cast<NativeProcessLinux> (native_process_sp)->LaunchInferior (
Pavel Labath19cbe962015-07-21 13:20:32 +0000367 mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000368 launch_info.GetArguments ().GetConstArgumentVector (),
369 launch_info.GetEnvironmentEntries ().GetConstArgumentVector (),
Chaoren Lind3173f32015-05-29 19:52:29 +0000370 stdin_file_spec,
371 stdout_file_spec,
372 stderr_file_spec,
Todd Fialaaf245d12014-06-30 21:05:18 +0000373 working_dir,
Todd Fiala0bce1b62014-08-17 00:10:50 +0000374 launch_info,
Todd Fialaaf245d12014-06-30 21:05:18 +0000375 error);
376
377 if (error.Fail ())
378 {
379 native_process_sp.reset ();
380 if (log)
381 log->Printf ("NativeProcessLinux::%s failed to launch process: %s", __FUNCTION__, error.AsCString ());
382 return error;
383 }
384
385 launch_info.SetProcessID (native_process_sp->GetID ());
386
387 return error;
388}
389
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000390Error
Pavel Labathd5b310f2015-07-09 11:51:11 +0000391NativeProcessProtocol::Attach (
Todd Fialaaf245d12014-06-30 21:05:18 +0000392 lldb::pid_t pid,
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000393 NativeProcessProtocol::NativeDelegate &native_delegate,
Pavel Labath19cbe962015-07-21 13:20:32 +0000394 MainLoop &mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000395 NativeProcessProtocolSP &native_process_sp)
396{
397 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
398 if (log && log->GetMask ().Test (POSIX_LOG_VERBOSE))
399 log->Printf ("NativeProcessLinux::%s(pid = %" PRIi64 ")", __FUNCTION__, pid);
400
Todd Fialaaf245d12014-06-30 21:05:18 +0000401 // Retrieve the architecture for the running process.
402 ArchSpec process_arch;
Pavel Labath2a86b552016-06-14 17:30:52 +0000403 Error error = ResolveProcessArchitecture(pid, process_arch);
Todd Fialaaf245d12014-06-30 21:05:18 +0000404 if (!error.Success ())
405 return error;
406
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000407 std::shared_ptr<NativeProcessLinux> native_process_linux_sp (new NativeProcessLinux ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000408
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000409 if (!native_process_linux_sp->RegisterNativeDelegate (native_delegate))
Todd Fialaaf245d12014-06-30 21:05:18 +0000410 {
Todd Fialaaf245d12014-06-30 21:05:18 +0000411 error.SetErrorStringWithFormat ("failed to register the native delegate");
412 return error;
413 }
414
Pavel Labath19cbe962015-07-21 13:20:32 +0000415 native_process_linux_sp->AttachToInferior (mainloop, pid, error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000416 if (!error.Success ())
Todd Fialaaf245d12014-06-30 21:05:18 +0000417 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000418
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000419 native_process_sp = native_process_linux_sp;
Todd Fialaaf245d12014-06-30 21:05:18 +0000420 return error;
421}
422
423// -----------------------------------------------------------------------------
424// Public Instance Methods
425// -----------------------------------------------------------------------------
426
427NativeProcessLinux::NativeProcessLinux () :
428 NativeProcessProtocol (LLDB_INVALID_PROCESS_ID),
429 m_arch (),
Todd Fialaaf245d12014-06-30 21:05:18 +0000430 m_supports_mem_region (eLazyBoolCalculate),
431 m_mem_region_cache (),
Pavel Labath0e1d7292015-08-20 09:06:12 +0000432 m_pending_notification_tid(LLDB_INVALID_THREAD_ID)
Todd Fialaaf245d12014-06-30 21:05:18 +0000433{
434}
435
Todd Fialaaf245d12014-06-30 21:05:18 +0000436void
437NativeProcessLinux::LaunchInferior (
Pavel Labath19cbe962015-07-21 13:20:32 +0000438 MainLoop &mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000439 const char *argv[],
440 const char *envp[],
Chaoren Lind3173f32015-05-29 19:52:29 +0000441 const FileSpec &stdin_file_spec,
442 const FileSpec &stdout_file_spec,
443 const FileSpec &stderr_file_spec,
444 const FileSpec &working_dir,
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000445 const ProcessLaunchInfo &launch_info,
446 Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000447{
Pavel Labath19cbe962015-07-21 13:20:32 +0000448 m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD,
449 [this] (MainLoopBase &) { SigchldHandler(); }, error);
450 if (! m_sigchld_handle)
451 return;
452
Chaoren Linfa03ad22015-02-03 01:50:42 +0000453 SetState (eStateLaunching);
Todd Fialaaf245d12014-06-30 21:05:18 +0000454
455 std::unique_ptr<LaunchArgs> args(
Pavel Labath2a86b552016-06-14 17:30:52 +0000456 new LaunchArgs(argv, envp, stdin_file_spec, stdout_file_spec, stderr_file_spec, working_dir, launch_info));
Todd Fialaaf245d12014-06-30 21:05:18 +0000457
Pavel Labath19cbe962015-07-21 13:20:32 +0000458 Launch(args.get(), error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000459}
460
461void
Pavel Labath19cbe962015-07-21 13:20:32 +0000462NativeProcessLinux::AttachToInferior (MainLoop &mainloop, lldb::pid_t pid, Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000463{
464 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
465 if (log)
466 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__, pid);
467
Pavel Labath19cbe962015-07-21 13:20:32 +0000468 m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD,
469 [this] (MainLoopBase &) { SigchldHandler(); }, error);
470 if (! m_sigchld_handle)
471 return;
472
Pavel Labath2a86b552016-06-14 17:30:52 +0000473 error = ResolveProcessArchitecture(pid, m_arch);
Todd Fialaaf245d12014-06-30 21:05:18 +0000474 if (!error.Success())
475 return;
476
477 // Set the architecture to the exe architecture.
Todd Fialaaf245d12014-06-30 21:05:18 +0000478 if (log)
479 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ") detected architecture %s", __FUNCTION__, pid, m_arch.GetArchitectureName ());
480
481 m_pid = pid;
482 SetState(eStateAttaching);
483
Pavel Labath19cbe962015-07-21 13:20:32 +0000484 Attach(pid, error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000485}
486
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000487void
488NativeProcessLinux::ChildFunc(const LaunchArgs &args)
489{
490 // Start tracing this child that is about to exec.
491 if (ptrace(PTRACE_TRACEME, 0, nullptr, nullptr) == -1)
492 ExitChildAbnormally(ePtraceFailed);
493
494 // Do not inherit setgid powers.
495 if (setgid(getgid()) != 0)
496 ExitChildAbnormally(eSetGidFailed);
497
498 // Attempt to have our own process group.
499 if (setpgid(0, 0) != 0)
500 {
501 // FIXME log that this failed. This is common.
502 // Don't allow this to prevent an inferior exec.
503 }
504
505 // Dup file descriptors if needed.
506 if (args.m_stdin_file_spec)
507 if (!DupDescriptor(args.m_stdin_file_spec, STDIN_FILENO, O_RDONLY))
508 ExitChildAbnormally(eDupStdinFailed);
509
510 if (args.m_stdout_file_spec)
511 if (!DupDescriptor(args.m_stdout_file_spec, STDOUT_FILENO, O_WRONLY | O_CREAT | O_TRUNC))
512 ExitChildAbnormally(eDupStdoutFailed);
513
514 if (args.m_stderr_file_spec)
515 if (!DupDescriptor(args.m_stderr_file_spec, STDERR_FILENO, O_WRONLY | O_CREAT | O_TRUNC))
516 ExitChildAbnormally(eDupStderrFailed);
517
518 // Close everything besides stdin, stdout, and stderr that has no file
519 // action to avoid leaking
520 for (int fd = 3; fd < sysconf(_SC_OPEN_MAX); ++fd)
521 if (!args.m_launch_info.GetFileActionForFD(fd))
522 close(fd);
523
524 // Change working directory
525 if (args.m_working_dir && 0 != ::chdir(args.m_working_dir.GetCString()))
526 ExitChildAbnormally(eChdirFailed);
527
528 // Disable ASLR if requested.
529 if (args.m_launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR))
530 {
531 const int old_personality = personality(LLDB_PERSONALITY_GET_CURRENT_SETTINGS);
532 if (old_personality == -1)
533 {
534 // Can't retrieve Linux personality. Cannot disable ASLR.
535 }
536 else
537 {
538 const int new_personality = personality(ADDR_NO_RANDOMIZE | old_personality);
539 if (new_personality == -1)
540 {
541 // Disabling ASLR failed.
542 }
543 else
544 {
545 // Disabling ASLR succeeded.
546 }
547 }
548 }
549
550 // Clear the signal mask to prevent the child from being affected by
551 // any masking done by the parent.
552 sigset_t set;
553 if (sigemptyset(&set) != 0 || pthread_sigmask(SIG_SETMASK, &set, nullptr) != 0)
554 ExitChildAbnormally(eSetSigMaskFailed);
555
556 // Propagate the environment if one is not supplied.
557 const char **envp = args.m_envp;
558 if (envp == NULL || envp[0] == NULL)
559 envp = const_cast<const char **>(environ);
560
561 // Execute. We should never return...
562 execve(args.m_argv[0], const_cast<char *const *>(args.m_argv), const_cast<char *const *>(envp));
563
564 // ...unless exec fails. In which case we definitely need to end the child here.
565 ExitChildAbnormally(eExecFailed);
566}
567
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000568::pid_t
569NativeProcessLinux::Launch(LaunchArgs *args, Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000570{
Todd Fiala0bce1b62014-08-17 00:10:50 +0000571 assert (args && "null args");
Todd Fialaaf245d12014-06-30 21:05:18 +0000572
Todd Fialaaf245d12014-06-30 21:05:18 +0000573 lldb_utility::PseudoTerminal terminal;
574 const size_t err_len = 1024;
575 char err_str[err_len];
576 lldb::pid_t pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000577
Todd Fialaaf245d12014-06-30 21:05:18 +0000578 if ((pid = terminal.Fork(err_str, err_len)) == static_cast<lldb::pid_t> (-1))
579 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000580 error.SetErrorToGenericError();
581 error.SetErrorStringWithFormat("Process fork failed: %s", err_str);
582 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000583 }
584
Todd Fialaaf245d12014-06-30 21:05:18 +0000585 // Child process.
586 if (pid == 0)
587 {
Pavel Labathd2c4c9b2015-08-18 08:23:35 +0000588 // First, make sure we disable all logging. If we are logging to stdout, our logs can be
589 // mistaken for inferior output.
590 Log::DisableAllLogChannels(nullptr);
Todd Fialaaf245d12014-06-30 21:05:18 +0000591
Pavel Labath493c3a12015-02-04 10:36:57 +0000592 // terminal has already dupped the tty descriptors to stdin/out/err.
593 // This closes original fd from which they were copied (and avoids
594 // leaking descriptors to the debugged process.
595 terminal.CloseSlaveFileDescriptor();
596
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000597 ChildFunc(*args);
Todd Fialaaf245d12014-06-30 21:05:18 +0000598 }
599
Todd Fiala75f47c32014-10-11 21:42:09 +0000600 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
601
Todd Fialaaf245d12014-06-30 21:05:18 +0000602 // Wait for the child process to trap on its call to execve.
603 ::pid_t wpid;
604 int status;
605 if ((wpid = waitpid(pid, &status, 0)) < 0)
606 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000607 error.SetErrorToErrno();
Todd Fialaaf245d12014-06-30 21:05:18 +0000608 if (log)
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000609 log->Printf ("NativeProcessLinux::%s waitpid for inferior failed with %s",
610 __FUNCTION__, error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000611
612 // Mark the inferior as invalid.
613 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000614 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000615
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000616 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000617 }
618 else if (WIFEXITED(status))
619 {
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000620 auto p = DecodeChildExitCode(WEXITSTATUS(status));
621 Error child_error(p.second, eErrorTypePOSIX);
622 const char *failure_reason;
623 switch (p.first)
Todd Fialaaf245d12014-06-30 21:05:18 +0000624 {
625 case ePtraceFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000626 failure_reason = "Child ptrace failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000627 break;
628 case eDupStdinFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000629 failure_reason = "Child open stdin failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000630 break;
631 case eDupStdoutFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000632 failure_reason = "Child open stdout failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000633 break;
634 case eDupStderrFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000635 failure_reason = "Child open stderr failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000636 break;
637 case eChdirFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000638 failure_reason = "Child failed to set working directory";
Todd Fialaaf245d12014-06-30 21:05:18 +0000639 break;
640 case eExecFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000641 failure_reason = "Child exec failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000642 break;
643 case eSetGidFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000644 failure_reason = "Child setgid failed";
Todd Fialaaf245d12014-06-30 21:05:18 +0000645 break;
Pavel Labath78856472015-08-19 13:47:57 +0000646 case eSetSigMaskFailed:
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000647 failure_reason = "Child failed to set signal mask";
Todd Fialaaf245d12014-06-30 21:05:18 +0000648 break;
649 }
Pavel Labath0c4f01d2016-07-06 13:18:50 +0000650 error.SetErrorStringWithFormat("%s: %d - %s (error code truncated)", failure_reason, child_error.GetError(), child_error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000651
652 if (log)
653 {
654 log->Printf ("NativeProcessLinux::%s inferior exited with status %d before issuing a STOP",
655 __FUNCTION__,
656 WEXITSTATUS(status));
657 }
658
659 // Mark the inferior as invalid.
660 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000661 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000662
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000663 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000664 }
Todd Fiala202ecd22014-07-10 04:39:13 +0000665 assert(WIFSTOPPED(status) && (wpid == static_cast< ::pid_t> (pid)) &&
Todd Fialaaf245d12014-06-30 21:05:18 +0000666 "Could not sync with inferior process.");
667
668 if (log)
669 log->Printf ("NativeProcessLinux::%s inferior started, now in stopped state", __FUNCTION__);
670
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000671 error = SetDefaultPtraceOpts(pid);
672 if (error.Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000673 {
Todd Fialaaf245d12014-06-30 21:05:18 +0000674 if (log)
675 log->Printf ("NativeProcessLinux::%s inferior failed to set default ptrace options: %s",
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000676 __FUNCTION__, error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000677
678 // Mark the inferior as invalid.
679 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000680 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000681
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000682 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000683 }
684
685 // Release the master terminal descriptor and pass it off to the
686 // NativeProcessLinux instance. Similarly stash the inferior pid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000687 m_terminal_fd = terminal.ReleaseMasterFileDescriptor();
688 m_pid = pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000689
690 // Set the terminal fd to be in non blocking mode (it simplifies the
691 // implementation of ProcessLinux::GetSTDOUT to have a non-blocking
692 // descriptor to read from).
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000693 error = EnsureFDFlags(m_terminal_fd, O_NONBLOCK);
694 if (error.Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000695 {
696 if (log)
697 log->Printf ("NativeProcessLinux::%s inferior EnsureFDFlags failed for ensuring terminal O_NONBLOCK setting: %s",
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000698 __FUNCTION__, error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000699
700 // Mark the inferior as invalid.
701 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000702 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000703
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000704 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000705 }
706
707 if (log)
708 log->Printf ("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__, pid);
709
Pavel Labath2a86b552016-06-14 17:30:52 +0000710 ResolveProcessArchitecture(m_pid, m_arch);
Pavel Labathf9077782015-08-21 09:13:53 +0000711 NativeThreadLinuxSP thread_sp = AddThread(pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000712 assert (thread_sp && "AddThread() returned a nullptr thread");
Pavel Labathf9077782015-08-21 09:13:53 +0000713 thread_sp->SetStoppedBySignal(SIGSTOP);
714 ThreadWasCreated(*thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +0000715
716 // Let our process instance know the thread has stopped.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000717 SetCurrentThreadID (thread_sp->GetID ());
718 SetState (StateType::eStateStopped);
Todd Fialaaf245d12014-06-30 21:05:18 +0000719
Todd Fialaaf245d12014-06-30 21:05:18 +0000720 if (log)
721 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000722 if (error.Success ())
Todd Fialaaf245d12014-06-30 21:05:18 +0000723 {
724 log->Printf ("NativeProcessLinux::%s inferior launching succeeded", __FUNCTION__);
725 }
726 else
727 {
728 log->Printf ("NativeProcessLinux::%s inferior launching failed: %s",
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000729 __FUNCTION__, error.AsCString ());
730 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000731 }
732 }
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000733 return pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000734}
735
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000736::pid_t
737NativeProcessLinux::Attach(lldb::pid_t pid, Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000738{
Todd Fialaaf245d12014-06-30 21:05:18 +0000739 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
740
741 // Use a map to keep track of the threads which we have attached/need to attach.
742 Host::TidMap tids_to_attach;
743 if (pid <= 1)
744 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000745 error.SetErrorToGenericError();
746 error.SetErrorString("Attaching to process 1 is not allowed.");
747 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000748 }
749
750 while (Host::FindProcessThreads(pid, tids_to_attach))
751 {
752 for (Host::TidMap::iterator it = tids_to_attach.begin();
753 it != tids_to_attach.end();)
754 {
755 if (it->second == false)
756 {
757 lldb::tid_t tid = it->first;
758
759 // Attach to the requested process.
760 // An attach will cause the thread to stop with a SIGSTOP.
Pavel Labath4a9babb2015-06-30 17:04:49 +0000761 error = PtraceWrapper(PTRACE_ATTACH, tid);
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000762 if (error.Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000763 {
764 // No such thread. The thread may have exited.
765 // More error handling may be needed.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000766 if (error.GetError() == ESRCH)
Todd Fialaaf245d12014-06-30 21:05:18 +0000767 {
768 it = tids_to_attach.erase(it);
769 continue;
770 }
771 else
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000772 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000773 }
774
775 int status;
776 // Need to use __WALL otherwise we receive an error with errno=ECHLD
777 // At this point we should have a thread stopped if waitpid succeeds.
778 if ((status = waitpid(tid, NULL, __WALL)) < 0)
779 {
780 // No such thread. The thread may have exited.
781 // More error handling may be needed.
782 if (errno == ESRCH)
783 {
784 it = tids_to_attach.erase(it);
785 continue;
786 }
787 else
788 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000789 error.SetErrorToErrno();
790 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000791 }
792 }
793
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000794 error = SetDefaultPtraceOpts(tid);
795 if (error.Fail())
796 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000797
798 if (log)
799 log->Printf ("NativeProcessLinux::%s() adding tid = %" PRIu64, __FUNCTION__, tid);
800
801 it->second = true;
802
803 // Create the thread, mark it as stopped.
Pavel Labathf9077782015-08-21 09:13:53 +0000804 NativeThreadLinuxSP thread_sp (AddThread(static_cast<lldb::tid_t>(tid)));
Todd Fialaaf245d12014-06-30 21:05:18 +0000805 assert (thread_sp && "AddThread() returned a nullptr");
Chaoren Linfa03ad22015-02-03 01:50:42 +0000806
807 // This will notify this is a new thread and tell the system it is stopped.
Pavel Labathf9077782015-08-21 09:13:53 +0000808 thread_sp->SetStoppedBySignal(SIGSTOP);
809 ThreadWasCreated(*thread_sp);
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000810 SetCurrentThreadID (thread_sp->GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000811 }
812
813 // move the loop forward
814 ++it;
815 }
816 }
817
818 if (tids_to_attach.size() > 0)
819 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000820 m_pid = pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000821 // Let our process instance know the thread has stopped.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000822 SetState (StateType::eStateStopped);
Todd Fialaaf245d12014-06-30 21:05:18 +0000823 }
824 else
825 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000826 error.SetErrorToGenericError();
827 error.SetErrorString("No such process.");
828 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000829 }
830
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000831 return pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000832}
833
Chaoren Lin97ccc292015-02-03 01:51:12 +0000834Error
Todd Fialaaf245d12014-06-30 21:05:18 +0000835NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid)
836{
837 long ptrace_opts = 0;
838
839 // Have the child raise an event on exit. This is used to keep the child in
840 // limbo until it is destroyed.
841 ptrace_opts |= PTRACE_O_TRACEEXIT;
842
843 // Have the tracer trace threads which spawn in the inferior process.
844 // TODO: if we want to support tracing the inferiors' child, add the
845 // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK)
846 ptrace_opts |= PTRACE_O_TRACECLONE;
847
848 // Have the tracer notify us before execve returns
849 // (needed to disable legacy SIGTRAP generation)
850 ptrace_opts |= PTRACE_O_TRACEEXEC;
851
Pavel Labath4a9babb2015-06-30 17:04:49 +0000852 return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void*)ptrace_opts);
Todd Fialaaf245d12014-06-30 21:05:18 +0000853}
854
855static ExitType convert_pid_status_to_exit_type (int status)
856{
857 if (WIFEXITED (status))
858 return ExitType::eExitTypeExit;
859 else if (WIFSIGNALED (status))
860 return ExitType::eExitTypeSignal;
861 else if (WIFSTOPPED (status))
862 return ExitType::eExitTypeStop;
863 else
864 {
865 // We don't know what this is.
866 return ExitType::eExitTypeInvalid;
867 }
868}
869
870static int convert_pid_status_to_return_code (int status)
871{
872 if (WIFEXITED (status))
873 return WEXITSTATUS (status);
874 else if (WIFSIGNALED (status))
875 return WTERMSIG (status);
876 else if (WIFSTOPPED (status))
877 return WSTOPSIG (status);
878 else
879 {
880 // We don't know what this is.
881 return ExitType::eExitTypeInvalid;
882 }
883}
884
Pavel Labath1107b5a2015-04-17 14:07:49 +0000885// Handles all waitpid events from the inferior process.
886void
887NativeProcessLinux::MonitorCallback(lldb::pid_t pid,
Tamas Berghammer1e209fc2015-03-13 11:36:47 +0000888 bool exited,
889 int signal,
890 int status)
Todd Fialaaf245d12014-06-30 21:05:18 +0000891{
892 Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
893
Todd Fialaaf245d12014-06-30 21:05:18 +0000894 // Certain activities differ based on whether the pid is the tid of the main thread.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000895 const bool is_main_thread = (pid == GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000896
897 // Handle when the thread exits.
898 if (exited)
899 {
900 if (log)
Chaoren Lin86fd8e42015-02-03 01:51:15 +0000901 log->Printf ("NativeProcessLinux::%s() got exit signal(%d) , tid = %" PRIu64 " (%s main thread)", __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not");
Todd Fialaaf245d12014-06-30 21:05:18 +0000902
903 // This is a thread that exited. Ensure we're not tracking it anymore.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000904 const bool thread_found = StopTrackingThread (pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000905
906 if (is_main_thread)
907 {
908 // We only set the exit status and notify the delegate if we haven't already set the process
909 // state to an exited state. We normally should have received a SIGTRAP | (PTRACE_EVENT_EXIT << 8)
910 // for the main thread.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000911 const bool already_notified = (GetState() == StateType::eStateExited) || (GetState () == StateType::eStateCrashed);
Todd Fialaaf245d12014-06-30 21:05:18 +0000912 if (!already_notified)
913 {
914 if (log)
Pavel Labath1107b5a2015-04-17 14:07:49 +0000915 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling main thread exit (%s), expected exit state already set but state was %s instead, setting exit state now", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found", StateAsCString (GetState ()));
Todd Fialaaf245d12014-06-30 21:05:18 +0000916 // The main thread exited. We're done monitoring. Report to delegate.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000917 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000918
919 // Notify delegate that our process has exited.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000920 SetState (StateType::eStateExited, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000921 }
922 else
923 {
924 if (log)
925 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " main thread now exited (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
926 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000927 }
928 else
929 {
930 // Do we want to report to the delegate in this case? I think not. If this was an orderly
931 // thread exit, we would already have received the SIGTRAP | (PTRACE_EVENT_EXIT << 8) signal,
932 // and we would have done an all-stop then.
933 if (log)
934 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling non-main thread exit (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
Todd Fialaaf245d12014-06-30 21:05:18 +0000935 }
Pavel Labath1107b5a2015-04-17 14:07:49 +0000936 return;
Todd Fialaaf245d12014-06-30 21:05:18 +0000937 }
938
Todd Fialaaf245d12014-06-30 21:05:18 +0000939 siginfo_t info;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000940 const auto info_err = GetSignalInfo(pid, &info);
941 auto thread_sp = GetThreadByID(pid);
942
943 if (! thread_sp)
944 {
945 // Normally, the only situation when we cannot find the thread is if we have just
946 // received a new thread notification. This is indicated by GetSignalInfo() returning
947 // si_code == SI_USER and si_pid == 0
948 if (log)
949 log->Printf("NativeProcessLinux::%s received notification about an unknown tid %" PRIu64 ".", __FUNCTION__, pid);
950
951 if (info_err.Fail())
952 {
953 if (log)
954 log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") GetSignalInfo failed (%s). Ingoring this notification.", __FUNCTION__, pid, info_err.AsCString());
955 return;
956 }
957
958 if (log && (info.si_code != SI_USER || info.si_pid != 0))
959 log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") unexpected signal info (si_code: %d, si_pid: %d). Treating as a new thread notification anyway.", __FUNCTION__, pid, info.si_code, info.si_pid);
960
961 auto thread_sp = AddThread(pid);
962 // Resume the newly created thread.
963 ResumeThread(*thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
964 ThreadWasCreated(*thread_sp);
965 return;
966 }
967
968 // Get details on the signal raised.
969 if (info_err.Success())
Chaoren Linfa03ad22015-02-03 01:50:42 +0000970 {
971 // We have retrieved the signal info. Dispatch appropriately.
972 if (info.si_signo == SIGTRAP)
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000973 MonitorSIGTRAP(info, *thread_sp);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000974 else
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000975 MonitorSignal(info, *thread_sp, exited);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000976 }
977 else
Todd Fialaaf245d12014-06-30 21:05:18 +0000978 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000979 if (info_err.GetError() == EINVAL)
Todd Fialaaf245d12014-06-30 21:05:18 +0000980 {
Chaoren Linfa03ad22015-02-03 01:50:42 +0000981 // This is a group stop reception for this tid.
Pavel Labath39036ac2015-05-21 08:32:18 +0000982 // We can reach here if we reinject SIGSTOP, SIGSTP, SIGTTIN or SIGTTOU into the
983 // tracee, triggering the group-stop mechanism. Normally receiving these would stop
984 // the process, pending a SIGCONT. Simulating this state in a debugger is hard and is
985 // generally not needed (one use case is debugging background task being managed by a
986 // shell). For general use, it is sufficient to stop the process in a signal-delivery
987 // stop which happens before the group stop. This done by MonitorSignal and works
988 // correctly for all signals.
Chaoren Linfa03ad22015-02-03 01:50:42 +0000989 if (log)
Pavel Labath39036ac2015-05-21 08:32:18 +0000990 log->Printf("NativeProcessLinux::%s received a group stop for pid %" PRIu64 " tid %" PRIu64 ". Transparent handling of group stops not supported, resuming the thread.", __FUNCTION__, GetID (), pid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000991 ResumeThread(*thread_sp, thread_sp->GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +0000992 }
993 else
994 {
995 // ptrace(GETSIGINFO) failed (but not due to group-stop).
996
997 // A return value of ESRCH means the thread/process is no longer on the system,
998 // so it was killed somehow outside of our control. Either way, we can't do anything
999 // with it anymore.
1000
Todd Fialaaf245d12014-06-30 21:05:18 +00001001 // Stop tracking the metadata for the thread since it's entirely off the system now.
Pavel Labath1107b5a2015-04-17 14:07:49 +00001002 const bool thread_found = StopTrackingThread (pid);
Todd Fialaaf245d12014-06-30 21:05:18 +00001003
1004 if (log)
1005 log->Printf ("NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d (%s, %s, %s)",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001006 __FUNCTION__, info_err.AsCString(), pid, signal, status, info_err.GetError() == ESRCH ? "thread/process killed" : "unknown reason", is_main_thread ? "is main thread" : "is not main thread", thread_found ? "thread metadata removed" : "thread metadata not found");
Todd Fialaaf245d12014-06-30 21:05:18 +00001007
1008 if (is_main_thread)
1009 {
1010 // Notify the delegate - our process is not available but appears to have been killed outside
1011 // our control. Is eStateExited the right exit state in this case?
Pavel Labath1107b5a2015-04-17 14:07:49 +00001012 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
1013 SetState (StateType::eStateExited, true);
Todd Fialaaf245d12014-06-30 21:05:18 +00001014 }
1015 else
1016 {
1017 // This thread was pulled out from underneath us. Anything to do here? Do we want to do an all stop?
1018 if (log)
Pavel Labath1107b5a2015-04-17 14:07:49 +00001019 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 " non-main thread exit occurred, didn't tell delegate anything since thread disappeared out from underneath us", __FUNCTION__, GetID (), pid);
Todd Fialaaf245d12014-06-30 21:05:18 +00001020 }
1021 }
1022 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001023}
1024
1025void
Pavel Labath426bdf82015-04-28 07:51:52 +00001026NativeProcessLinux::WaitForNewThread(::pid_t tid)
1027{
1028 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1029
Pavel Labathf9077782015-08-21 09:13:53 +00001030 NativeThreadLinuxSP new_thread_sp = GetThreadByID(tid);
Pavel Labath426bdf82015-04-28 07:51:52 +00001031
1032 if (new_thread_sp)
1033 {
1034 // We are already tracking the thread - we got the event on the new thread (see
1035 // MonitorSignal) before this one. We are done.
1036 return;
1037 }
1038
1039 // The thread is not tracked yet, let's wait for it to appear.
1040 int status = -1;
1041 ::pid_t wait_pid;
1042 do
1043 {
1044 if (log)
1045 log->Printf ("NativeProcessLinux::%s() received thread creation event for tid %" PRIu32 ". tid not tracked yet, waiting for thread to appear...", __FUNCTION__, tid);
1046 wait_pid = waitpid(tid, &status, __WALL);
1047 }
1048 while (wait_pid == -1 && errno == EINTR);
1049 // Since we are waiting on a specific tid, this must be the creation event. But let's do
1050 // some checks just in case.
1051 if (wait_pid != tid) {
1052 if (log)
1053 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime", __FUNCTION__, tid);
1054 // The only way I know of this could happen is if the whole process was
1055 // SIGKILLed in the mean time. In any case, we can't do anything about that now.
1056 return;
1057 }
1058 if (WIFEXITED(status))
1059 {
1060 if (log)
1061 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " returned an 'exited' event. Not tracking the thread.", __FUNCTION__, tid);
1062 // Also a very improbable event.
1063 return;
1064 }
1065
1066 siginfo_t info;
1067 Error error = GetSignalInfo(tid, &info);
1068 if (error.Fail())
1069 {
1070 if (log)
1071 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime.", __FUNCTION__, tid);
1072 return;
1073 }
1074
1075 if (((info.si_pid != 0) || (info.si_code != SI_USER)) && log)
1076 {
1077 // We should be getting a thread creation signal here, but we received something
1078 // else. There isn't much we can do about it now, so we will just log that. Since the
1079 // thread is alive and we are receiving events from it, we shall pretend that it was
1080 // created properly.
1081 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " received unexpected signal with code %d from pid %d.", __FUNCTION__, tid, info.si_code, info.si_pid);
1082 }
1083
1084 if (log)
1085 log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 ": tracking new thread tid %" PRIu32,
1086 __FUNCTION__, GetID (), tid);
1087
Pavel Labathf9077782015-08-21 09:13:53 +00001088 new_thread_sp = AddThread(tid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001089 ResumeThread(*new_thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
Pavel Labathf9077782015-08-21 09:13:53 +00001090 ThreadWasCreated(*new_thread_sp);
Pavel Labath426bdf82015-04-28 07:51:52 +00001091}
1092
1093void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001094NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thread)
Todd Fialaaf245d12014-06-30 21:05:18 +00001095{
1096 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001097 const bool is_main_thread = (thread.GetID() == GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +00001098
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001099 assert(info.si_signo == SIGTRAP && "Unexpected child signal!");
Todd Fialaaf245d12014-06-30 21:05:18 +00001100
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001101 switch (info.si_code)
Todd Fialaaf245d12014-06-30 21:05:18 +00001102 {
1103 // TODO: these two cases are required if we want to support tracing of the inferiors' children. We'd need this to debug a monitor.
1104 // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):
1105 // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):
1106
1107 case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
1108 {
Pavel Labath5fd24c62015-04-23 09:04:35 +00001109 // This is the notification on the parent thread which informs us of new thread
Pavel Labath426bdf82015-04-28 07:51:52 +00001110 // creation.
1111 // We don't want to do anything with the parent thread so we just resume it. In case we
1112 // want to implement "break on thread creation" functionality, we would need to stop
1113 // here.
Todd Fialaaf245d12014-06-30 21:05:18 +00001114
Pavel Labath426bdf82015-04-28 07:51:52 +00001115 unsigned long event_message = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001116 if (GetEventMessage(thread.GetID(), &event_message).Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +00001117 {
Pavel Labath426bdf82015-04-28 07:51:52 +00001118 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001119 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " received thread creation event but GetEventMessage failed so we don't know the new tid", __FUNCTION__, thread.GetID());
Pavel Labath426bdf82015-04-28 07:51:52 +00001120 } else
1121 WaitForNewThread(event_message);
Todd Fialaaf245d12014-06-30 21:05:18 +00001122
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001123 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +00001124 break;
1125 }
1126
1127 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)):
Todd Fialaa9882ce2014-08-28 15:46:54 +00001128 {
Pavel Labathf9077782015-08-21 09:13:53 +00001129 NativeThreadLinuxSP main_thread_sp;
Todd Fialaaf245d12014-06-30 21:05:18 +00001130 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001131 log->Printf ("NativeProcessLinux::%s() received exec event, code = %d", __FUNCTION__, info.si_code ^ SIGTRAP);
Todd Fialaa9882ce2014-08-28 15:46:54 +00001132
Pavel Labath1dbc6c92015-05-12 08:35:33 +00001133 // Exec clears any pending notifications.
Pavel Labath0e1d7292015-08-20 09:06:12 +00001134 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
Chaoren Linfa03ad22015-02-03 01:50:42 +00001135
Pavel Labath57a77112016-05-16 09:18:30 +00001136 // Remove all but the main thread here. Linux fork creates a new process which only copies the main thread.
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001137 if (log)
1138 log->Printf ("NativeProcessLinux::%s exec received, stop tracking all but main thread", __FUNCTION__);
1139
1140 for (auto thread_sp : m_threads)
Todd Fialaa9882ce2014-08-28 15:46:54 +00001141 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001142 const bool is_main_thread = thread_sp && thread_sp->GetID () == GetID ();
1143 if (is_main_thread)
Todd Fialaa9882ce2014-08-28 15:46:54 +00001144 {
Pavel Labathf9077782015-08-21 09:13:53 +00001145 main_thread_sp = std::static_pointer_cast<NativeThreadLinux>(thread_sp);
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001146 if (log)
1147 log->Printf ("NativeProcessLinux::%s found main thread with tid %" PRIu64 ", keeping", __FUNCTION__, main_thread_sp->GetID ());
Todd Fialaa9882ce2014-08-28 15:46:54 +00001148 }
1149 else
1150 {
Todd Fialaa9882ce2014-08-28 15:46:54 +00001151 if (log)
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001152 log->Printf ("NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64 " due to exec", __FUNCTION__, thread_sp->GetID ());
Todd Fialaa9882ce2014-08-28 15:46:54 +00001153 }
1154 }
1155
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001156 m_threads.clear ();
1157
1158 if (main_thread_sp)
1159 {
1160 m_threads.push_back (main_thread_sp);
1161 SetCurrentThreadID (main_thread_sp->GetID ());
Pavel Labathf9077782015-08-21 09:13:53 +00001162 main_thread_sp->SetStoppedByExec();
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001163 }
1164 else
1165 {
1166 SetCurrentThreadID (LLDB_INVALID_THREAD_ID);
1167 if (log)
1168 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 "no main thread found, discarded all threads, we're in a no-thread state!", __FUNCTION__, GetID ());
1169 }
1170
Chaoren Linfa03ad22015-02-03 01:50:42 +00001171 // Tell coordinator about about the "new" (since exec) stopped main thread.
Pavel Labathf9077782015-08-21 09:13:53 +00001172 ThreadWasCreated(*main_thread_sp);
Chaoren Linfa03ad22015-02-03 01:50:42 +00001173
Todd Fialaa9882ce2014-08-28 15:46:54 +00001174 // Let our delegate know we have just exec'd.
1175 NotifyDidExec ();
1176
1177 // If we have a main thread, indicate we are stopped.
1178 assert (main_thread_sp && "exec called during ptraced process but no main thread metadata tracked");
Chaoren Linfa03ad22015-02-03 01:50:42 +00001179
1180 // Let the process know we're stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001181 StopRunningThreads(main_thread_sp->GetID());
Todd Fialaa9882ce2014-08-28 15:46:54 +00001182
Todd Fialaaf245d12014-06-30 21:05:18 +00001183 break;
Todd Fialaa9882ce2014-08-28 15:46:54 +00001184 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001185
1186 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
1187 {
1188 // The inferior process or one of its threads is about to exit.
Pavel Labath6e351632015-05-15 13:30:59 +00001189 // We don't want to do anything with the thread so we just resume it. In case we
1190 // want to implement "break on thread exit" functionality, we would need to stop
1191 // here.
Chaoren Linfa03ad22015-02-03 01:50:42 +00001192
Todd Fialaaf245d12014-06-30 21:05:18 +00001193 unsigned long data = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001194 if (GetEventMessage(thread.GetID(), &data).Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +00001195 data = -1;
1196
1197 if (log)
1198 {
1199 log->Printf ("NativeProcessLinux::%s() received PTRACE_EVENT_EXIT, data = %lx (WIFEXITED=%s,WIFSIGNALED=%s), pid = %" PRIu64 " (%s)",
1200 __FUNCTION__,
1201 data, WIFEXITED (data) ? "true" : "false", WIFSIGNALED (data) ? "true" : "false",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001202 thread.GetID(),
Todd Fialaaf245d12014-06-30 21:05:18 +00001203 is_main_thread ? "is main thread" : "not main thread");
1204 }
1205
Todd Fialaaf245d12014-06-30 21:05:18 +00001206 if (is_main_thread)
1207 {
1208 SetExitStatus (convert_pid_status_to_exit_type (data), convert_pid_status_to_return_code (data), nullptr, true);
Todd Fialaaf245d12014-06-30 21:05:18 +00001209 }
Todd Fiala75f47c32014-10-11 21:42:09 +00001210
Pavel Labath86852d32015-09-01 10:59:36 +00001211 StateType state = thread.GetState();
1212 if (! StateIsRunningState(state))
1213 {
1214 // Due to a kernel bug, we may sometimes get this stop after the inferior gets a
1215 // SIGKILL. This confuses our state tracking logic in ResumeThread(), since normally,
1216 // we should not be receiving any ptrace events while the inferior is stopped. This
1217 // makes sure that the inferior is resumed and exits normally.
1218 state = eStateRunning;
1219 }
1220 ResumeThread(thread, state, LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +00001221
1222 break;
1223 }
1224
1225 case 0:
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001226 case TRAP_TRACE: // We receive this on single stepping.
1227 case TRAP_HWBKPT: // We receive this on watchpoint hit
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001228 {
1229 // If a watchpoint was hit, report it
1230 uint32_t wp_index;
Tamas Berghammer1fa5c4b2015-10-13 16:48:04 +00001231 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, (uintptr_t)info.si_addr);
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001232 if (error.Fail() && log)
1233 log->Printf("NativeProcessLinux::%s() "
1234 "received error while checking for watchpoint hits, "
1235 "pid = %" PRIu64 " error = %s",
1236 __FUNCTION__, thread.GetID(), error.AsCString());
1237 if (wp_index != LLDB_INVALID_INDEX32)
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001238 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001239 MonitorWatchpoint(thread, wp_index);
1240 break;
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001241 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001242
Tamas Berghammerbe379e12016-02-16 15:14:36 +00001243 // Otherwise, report step over
1244 MonitorTrace(thread);
Todd Fialaaf245d12014-06-30 21:05:18 +00001245 break;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001246 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001247
1248 case SI_KERNEL:
Mohit K. Bhakkad35799962015-06-18 04:53:18 +00001249#if defined __mips__
1250 // For mips there is no special signal for watchpoint
1251 // So we check for watchpoint in kernel trap
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001252 {
1253 // If a watchpoint was hit, report it
1254 uint32_t wp_index;
1255 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, LLDB_INVALID_ADDRESS);
1256 if (error.Fail() && log)
1257 log->Printf("NativeProcessLinux::%s() "
1258 "received error while checking for watchpoint hits, "
1259 "pid = %" PRIu64 " error = %s",
Mohit K. Bhakkad16ad0322015-08-28 12:08:26 +00001260 __FUNCTION__, thread.GetID(), error.AsCString());
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001261 if (wp_index != LLDB_INVALID_INDEX32)
Mohit K. Bhakkad35799962015-06-18 04:53:18 +00001262 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001263 MonitorWatchpoint(thread, wp_index);
1264 break;
Mohit K. Bhakkad35799962015-06-18 04:53:18 +00001265 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001266 }
Mohit K. Bhakkad35799962015-06-18 04:53:18 +00001267 // NO BREAK
1268#endif
Todd Fialaaf245d12014-06-30 21:05:18 +00001269 case TRAP_BRKPT:
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001270 MonitorBreakpoint(thread);
Todd Fialaaf245d12014-06-30 21:05:18 +00001271 break;
1272
1273 case SIGTRAP:
1274 case (SIGTRAP | 0x80):
1275 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001276 log->Printf ("NativeProcessLinux::%s() received unknown SIGTRAP system call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming", __FUNCTION__, GetID (), thread.GetID());
Chaoren Linfa03ad22015-02-03 01:50:42 +00001277
Todd Fialaaf245d12014-06-30 21:05:18 +00001278 // Ignore these signals until we know more about them.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001279 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +00001280 break;
1281
1282 default:
1283 assert(false && "Unexpected SIGTRAP code!");
1284 if (log)
Pavel Labath6e351632015-05-15 13:30:59 +00001285 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64 " received unhandled SIGTRAP code: 0x%d",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001286 __FUNCTION__, GetID(), thread.GetID(), info.si_code);
Todd Fialaaf245d12014-06-30 21:05:18 +00001287 break;
1288
1289 }
1290}
1291
1292void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001293NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001294{
1295 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1296 if (log)
1297 log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64 " (single stepping)",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001298 __FUNCTION__, thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001299
Pavel Labath0e1d7292015-08-20 09:06:12 +00001300 // This thread is currently stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001301 thread.SetStoppedByTrace();
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001302
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001303 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001304}
1305
1306void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001307NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001308{
1309 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
1310 if (log)
1311 log->Printf("NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64,
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001312 __FUNCTION__, thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001313
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001314 // Mark the thread as stopped at breakpoint.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001315 thread.SetStoppedByBreakpoint();
1316 Error error = FixupBreakpointPCAsNeeded(thread);
1317 if (error.Fail())
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001318 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001319 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s",
1320 __FUNCTION__, thread.GetID(), error.AsCString());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001321
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001322 if (m_threads_stepping_with_breakpoint.find(thread.GetID()) != m_threads_stepping_with_breakpoint.end())
1323 thread.SetStoppedByTrace();
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001324
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001325 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001326}
1327
1328void
Pavel Labathf9077782015-08-21 09:13:53 +00001329NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread, uint32_t wp_index)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001330{
1331 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS));
1332 if (log)
1333 log->Printf("NativeProcessLinux::%s() received watchpoint event, "
1334 "pid = %" PRIu64 ", wp_index = %" PRIu32,
Pavel Labathf9077782015-08-21 09:13:53 +00001335 __FUNCTION__, thread.GetID(), wp_index);
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001336
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001337 // Mark the thread as stopped at watchpoint.
1338 // The address is at (lldb::addr_t)info->si_addr if we need it.
Pavel Labathf9077782015-08-21 09:13:53 +00001339 thread.SetStoppedByWatchpoint(wp_index);
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001340
1341 // We need to tell all other running threads before we notify the delegate about this stop.
Pavel Labathf9077782015-08-21 09:13:53 +00001342 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001343}
1344
1345void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001346NativeProcessLinux::MonitorSignal(const siginfo_t &info, NativeThreadLinux &thread, bool exited)
Todd Fialaaf245d12014-06-30 21:05:18 +00001347{
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001348 const int signo = info.si_signo;
1349 const bool is_from_llgs = info.si_pid == getpid ();
Todd Fialaaf245d12014-06-30 21:05:18 +00001350
1351 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1352
1353 // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
1354 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
1355 // kill(2) or raise(3). Similarly for tgkill(2) on Linux.
1356 //
1357 // IOW, user generated signals never generate what we consider to be a
1358 // "crash".
1359 //
1360 // Similarly, ACK signals generated by this monitor.
1361
Todd Fialaaf245d12014-06-30 21:05:18 +00001362 // Handle the signal.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001363 if (info.si_code == SI_TKILL || info.si_code == SI_USER)
Todd Fialaaf245d12014-06-30 21:05:18 +00001364 {
1365 if (log)
1366 log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")",
1367 __FUNCTION__,
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001368 Host::GetSignalAsCString(signo),
Todd Fialaaf245d12014-06-30 21:05:18 +00001369 signo,
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001370 (info.si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"),
1371 info.si_pid,
Todd Fiala511e5cd2014-09-11 23:29:14 +00001372 is_from_llgs ? "from llgs" : "not from llgs",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001373 thread.GetID());
Todd Fiala58a2f662014-08-12 17:02:07 +00001374 }
1375
1376 // Check for thread stop notification.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001377 if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP))
Todd Fiala58a2f662014-08-12 17:02:07 +00001378 {
1379 // This is a tgkill()-based stop.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001380 if (log)
1381 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread stopped",
1382 __FUNCTION__,
1383 GetID (),
1384 thread.GetID());
1385
1386 // Check that we're not already marked with a stop reason.
1387 // Note this thread really shouldn't already be marked as stopped - if we were, that would imply that
1388 // the kernel signaled us with the thread stopping which we handled and marked as stopped,
1389 // and that, without an intervening resume, we received another stop. It is more likely
1390 // that we are missing the marking of a run state somewhere if we find that the thread was
1391 // marked as stopped.
1392 const StateType thread_state = thread.GetState();
1393 if (!StateIsStoppedState (thread_state, false))
Todd Fiala58a2f662014-08-12 17:02:07 +00001394 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001395 // An inferior thread has stopped because of a SIGSTOP we have sent it.
1396 // Generally, these are not important stops and we don't want to report them as
1397 // they are just used to stop other threads when one thread (the one with the
1398 // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in the
1399 // case of an asynchronous Interrupt(), this *is* the real stop reason, so we
1400 // leave the signal intact if this is the thread that was chosen as the
1401 // triggering thread.
1402 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID)
Chaoren Linaab58632015-02-03 01:50:57 +00001403 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001404 if (m_pending_notification_tid == thread.GetID())
1405 thread.SetStoppedBySignal(SIGSTOP, &info);
Pavel Labath0e1d7292015-08-20 09:06:12 +00001406 else
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001407 thread.SetStoppedWithNoReason();
1408
1409 SetCurrentThreadID (thread.GetID ());
1410 SignalIfAllThreadsStopped();
Chaoren Linaab58632015-02-03 01:50:57 +00001411 }
1412 else
1413 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001414 // We can end up here if stop was initiated by LLGS but by this time a
1415 // thread stop has occurred - maybe initiated by another event.
1416 Error error = ResumeThread(thread, thread.GetState(), 0);
1417 if (error.Fail() && log)
Chaoren Linaab58632015-02-03 01:50:57 +00001418 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001419 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s",
1420 __FUNCTION__, thread.GetID(), error.AsCString());
Chaoren Linaab58632015-02-03 01:50:57 +00001421 }
1422 }
Todd Fiala58a2f662014-08-12 17:02:07 +00001423 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001424 else
1425 {
1426 if (log)
1427 {
1428 // Retrieve the signal name if the thread was stopped by a signal.
1429 int stop_signo = 0;
1430 const bool stopped_by_signal = thread.IsStopped(&stop_signo);
1431 const char *signal_name = stopped_by_signal ? Host::GetSignalAsCString(stop_signo) : "<not stopped by signal>";
1432 if (!signal_name)
1433 signal_name = "<no-signal-name>";
1434
1435 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread was already marked as a stopped state (state=%s, signal=%d (%s)), leaving stop signal as is",
1436 __FUNCTION__,
1437 GetID (),
1438 thread.GetID(),
1439 StateAsCString (thread_state),
1440 stop_signo,
1441 signal_name);
1442 }
1443 SignalIfAllThreadsStopped();
1444 }
Todd Fiala58a2f662014-08-12 17:02:07 +00001445
1446 // Done handling.
Todd Fialaaf245d12014-06-30 21:05:18 +00001447 return;
1448 }
1449
1450 if (log)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001451 log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, Host::GetSignalAsCString(signo));
Todd Fialaaf245d12014-06-30 21:05:18 +00001452
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001453 // This thread is stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001454 thread.SetStoppedBySignal(signo, &info);
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001455
1456 // Send a stop to the debugger after we get all other threads to stop.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001457 StopRunningThreads(thread.GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001458}
1459
Tamas Berghammere7708682015-04-22 10:00:23 +00001460namespace {
1461
1462struct EmulatorBaton
1463{
1464 NativeProcessLinux* m_process;
1465 NativeRegisterContext* m_reg_context;
Tamas Berghammere7708682015-04-22 10:00:23 +00001466
Pavel Labath6648fcc2015-04-27 09:21:14 +00001467 // eRegisterKindDWARF -> RegsiterValue
1468 std::unordered_map<uint32_t, RegisterValue> m_register_values;
1469
1470 EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) :
Tamas Berghammere7708682015-04-22 10:00:23 +00001471 m_process(process), m_reg_context(reg_context) {}
1472};
1473
1474} // anonymous namespace
1475
1476static size_t
1477ReadMemoryCallback (EmulateInstruction *instruction,
1478 void *baton,
1479 const EmulateInstruction::Context &context,
1480 lldb::addr_t addr,
1481 void *dst,
1482 size_t length)
1483{
1484 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1485
Chaoren Lin3eb4b452015-04-29 17:24:48 +00001486 size_t bytes_read;
Tamas Berghammere7708682015-04-22 10:00:23 +00001487 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read);
1488 return bytes_read;
1489}
1490
1491static bool
1492ReadRegisterCallback (EmulateInstruction *instruction,
1493 void *baton,
1494 const RegisterInfo *reg_info,
1495 RegisterValue &reg_value)
1496{
1497 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1498
Pavel Labath6648fcc2015-04-27 09:21:14 +00001499 auto it = emulator_baton->m_register_values.find(reg_info->kinds[eRegisterKindDWARF]);
1500 if (it != emulator_baton->m_register_values.end())
1501 {
1502 reg_value = it->second;
1503 return true;
1504 }
1505
Tamas Berghammere7708682015-04-22 10:00:23 +00001506 // The emulator only fill in the dwarf regsiter numbers (and in some case
1507 // the generic register numbers). Get the full register info from the
1508 // register context based on the dwarf register numbers.
1509 const RegisterInfo* full_reg_info = emulator_baton->m_reg_context->GetRegisterInfo(
1510 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]);
1511
1512 Error error = emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value);
Pavel Labath6648fcc2015-04-27 09:21:14 +00001513 if (error.Success())
Pavel Labath6648fcc2015-04-27 09:21:14 +00001514 return true;
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001515
Pavel Labath6648fcc2015-04-27 09:21:14 +00001516 return false;
Tamas Berghammere7708682015-04-22 10:00:23 +00001517}
1518
1519static bool
1520WriteRegisterCallback (EmulateInstruction *instruction,
1521 void *baton,
1522 const EmulateInstruction::Context &context,
1523 const RegisterInfo *reg_info,
1524 const RegisterValue &reg_value)
1525{
1526 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
Pavel Labath6648fcc2015-04-27 09:21:14 +00001527 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value;
Tamas Berghammere7708682015-04-22 10:00:23 +00001528 return true;
1529}
1530
1531static size_t
1532WriteMemoryCallback (EmulateInstruction *instruction,
1533 void *baton,
1534 const EmulateInstruction::Context &context,
1535 lldb::addr_t addr,
1536 const void *dst,
1537 size_t length)
1538{
1539 return length;
1540}
1541
1542static lldb::addr_t
1543ReadFlags (NativeRegisterContext* regsiter_context)
1544{
1545 const RegisterInfo* flags_info = regsiter_context->GetRegisterInfo(
1546 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1547 return regsiter_context->ReadRegisterAsUnsigned(flags_info, LLDB_INVALID_ADDRESS);
1548}
1549
1550Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001551NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadLinux &thread)
Tamas Berghammere7708682015-04-22 10:00:23 +00001552{
1553 Error error;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001554 NativeRegisterContextSP register_context_sp = thread.GetRegisterContext();
Tamas Berghammere7708682015-04-22 10:00:23 +00001555
1556 std::unique_ptr<EmulateInstruction> emulator_ap(
1557 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, nullptr));
1558
1559 if (emulator_ap == nullptr)
1560 return Error("Instruction emulator not found!");
1561
1562 EmulatorBaton baton(this, register_context_sp.get());
1563 emulator_ap->SetBaton(&baton);
1564 emulator_ap->SetReadMemCallback(&ReadMemoryCallback);
1565 emulator_ap->SetReadRegCallback(&ReadRegisterCallback);
1566 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback);
1567 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback);
1568
1569 if (!emulator_ap->ReadInstruction())
1570 return Error("Read instruction failed!");
1571
Pavel Labath6648fcc2015-04-27 09:21:14 +00001572 bool emulation_result = emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC);
1573
1574 const RegisterInfo* reg_info_pc = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1575 const RegisterInfo* reg_info_flags = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1576
1577 auto pc_it = baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]);
1578 auto flags_it = baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]);
1579
Tamas Berghammere7708682015-04-22 10:00:23 +00001580 lldb::addr_t next_pc;
1581 lldb::addr_t next_flags;
Pavel Labath6648fcc2015-04-27 09:21:14 +00001582 if (emulation_result)
Tamas Berghammere7708682015-04-22 10:00:23 +00001583 {
Pavel Labath6648fcc2015-04-27 09:21:14 +00001584 assert(pc_it != baton.m_register_values.end() && "Emulation was successfull but PC wasn't updated");
1585 next_pc = pc_it->second.GetAsUInt64();
1586
1587 if (flags_it != baton.m_register_values.end())
1588 next_flags = flags_it->second.GetAsUInt64();
Tamas Berghammere7708682015-04-22 10:00:23 +00001589 else
1590 next_flags = ReadFlags (register_context_sp.get());
1591 }
Pavel Labath6648fcc2015-04-27 09:21:14 +00001592 else if (pc_it == baton.m_register_values.end())
Tamas Berghammere7708682015-04-22 10:00:23 +00001593 {
1594 // Emulate instruction failed and it haven't changed PC. Advance PC
1595 // with the size of the current opcode because the emulation of all
1596 // PC modifying instruction should be successful. The failure most
1597 // likely caused by a not supported instruction which don't modify PC.
1598 next_pc = register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize();
1599 next_flags = ReadFlags (register_context_sp.get());
1600 }
1601 else
1602 {
1603 // The instruction emulation failed after it modified the PC. It is an
1604 // unknown error where we can't continue because the next instruction is
1605 // modifying the PC but we don't know how.
1606 return Error ("Instruction emulation failed unexpectedly.");
1607 }
1608
1609 if (m_arch.GetMachine() == llvm::Triple::arm)
1610 {
1611 if (next_flags & 0x20)
1612 {
1613 // Thumb mode
1614 error = SetSoftwareBreakpoint(next_pc, 2);
1615 }
1616 else
1617 {
1618 // Arm mode
1619 error = SetSoftwareBreakpoint(next_pc, 4);
1620 }
1621 }
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001622 else if (m_arch.GetMachine() == llvm::Triple::mips64
Jaydeep Patilc60c9452015-06-23 03:37:08 +00001623 || m_arch.GetMachine() == llvm::Triple::mips64el
1624 || m_arch.GetMachine() == llvm::Triple::mips
1625 || m_arch.GetMachine() == llvm::Triple::mipsel)
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001626 error = SetSoftwareBreakpoint(next_pc, 4);
Tamas Berghammere7708682015-04-22 10:00:23 +00001627 else
1628 {
1629 // No size hint is given for the next breakpoint
1630 error = SetSoftwareBreakpoint(next_pc, 0);
1631 }
1632
Tamas Berghammere7708682015-04-22 10:00:23 +00001633 if (error.Fail())
1634 return error;
1635
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001636 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc});
Tamas Berghammere7708682015-04-22 10:00:23 +00001637
1638 return Error();
1639}
1640
1641bool
1642NativeProcessLinux::SupportHardwareSingleStepping() const
1643{
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001644 if (m_arch.GetMachine() == llvm::Triple::arm
Jaydeep Patilc60c9452015-06-23 03:37:08 +00001645 || m_arch.GetMachine() == llvm::Triple::mips64 || m_arch.GetMachine() == llvm::Triple::mips64el
1646 || m_arch.GetMachine() == llvm::Triple::mips || m_arch.GetMachine() == llvm::Triple::mipsel)
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001647 return false;
1648 return true;
Tamas Berghammere7708682015-04-22 10:00:23 +00001649}
1650
Todd Fialaaf245d12014-06-30 21:05:18 +00001651Error
1652NativeProcessLinux::Resume (const ResumeActionList &resume_actions)
1653{
Todd Fialaaf245d12014-06-30 21:05:18 +00001654 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD));
1655 if (log)
1656 log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ());
1657
Tamas Berghammere7708682015-04-22 10:00:23 +00001658 bool software_single_step = !SupportHardwareSingleStepping();
Todd Fialaaf245d12014-06-30 21:05:18 +00001659
Tamas Berghammere7708682015-04-22 10:00:23 +00001660 if (software_single_step)
1661 {
1662 for (auto thread_sp : m_threads)
1663 {
1664 assert (thread_sp && "thread list should not contain NULL threads");
1665
1666 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1667 if (action == nullptr)
1668 continue;
1669
1670 if (action->state == eStateStepping)
1671 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001672 Error error = SetupSoftwareSingleStepping(static_cast<NativeThreadLinux &>(*thread_sp));
Tamas Berghammere7708682015-04-22 10:00:23 +00001673 if (error.Fail())
1674 return error;
1675 }
1676 }
1677 }
1678
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001679 for (auto thread_sp : m_threads)
Todd Fialaaf245d12014-06-30 21:05:18 +00001680 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001681 assert (thread_sp && "thread list should not contain NULL threads");
1682
1683 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1684
1685 if (action == nullptr)
Todd Fialaaf245d12014-06-30 21:05:18 +00001686 {
Chaoren Linfa03ad22015-02-03 01:50:42 +00001687 if (log)
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001688 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64,
1689 __FUNCTION__, GetID (), thread_sp->GetID ());
1690 continue;
1691 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001692
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001693 if (log)
1694 {
1695 log->Printf ("NativeProcessLinux::%s processing resume action state %s for pid %" PRIu64 " tid %" PRIu64,
1696 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
1697 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001698
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001699 switch (action->state)
1700 {
1701 case eStateRunning:
Pavel Labath0e1d7292015-08-20 09:06:12 +00001702 case eStateStepping:
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001703 {
1704 // Run the thread, possibly feeding it the signal.
1705 const int signo = action->signal;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001706 ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state, signo);
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001707 break;
1708 }
1709
1710 case eStateSuspended:
1711 case eStateStopped:
Pavel Labath108c3252015-05-12 09:03:18 +00001712 lldbassert(0 && "Unexpected state");
Chaoren Linfa03ad22015-02-03 01:50:42 +00001713
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001714 default:
1715 return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64,
1716 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +00001717 }
1718 }
1719
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001720 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001721}
1722
1723Error
1724NativeProcessLinux::Halt ()
1725{
1726 Error error;
1727
Todd Fialaaf245d12014-06-30 21:05:18 +00001728 if (kill (GetID (), SIGSTOP) != 0)
1729 error.SetErrorToErrno ();
1730
1731 return error;
1732}
1733
1734Error
1735NativeProcessLinux::Detach ()
1736{
1737 Error error;
1738
Todd Fialaaf245d12014-06-30 21:05:18 +00001739 // Stop monitoring the inferior.
Pavel Labath19cbe962015-07-21 13:20:32 +00001740 m_sigchld_handle.reset();
Todd Fialaaf245d12014-06-30 21:05:18 +00001741
Pavel Labath7a9495b2015-09-01 15:00:51 +00001742 // Tell ptrace to detach from the process.
1743 if (GetID () == LLDB_INVALID_PROCESS_ID)
1744 return error;
1745
1746 for (auto thread_sp : m_threads)
1747 {
1748 Error e = Detach(thread_sp->GetID());
1749 if (e.Fail())
1750 error = e; // Save the error, but still attempt to detach from other threads.
1751 }
1752
Todd Fialaaf245d12014-06-30 21:05:18 +00001753 return error;
1754}
1755
1756Error
1757NativeProcessLinux::Signal (int signo)
1758{
1759 Error error;
1760
1761 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1762 if (log)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001763 log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64,
1764 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001765
1766 if (kill(GetID(), signo))
1767 error.SetErrorToErrno();
1768
1769 return error;
1770}
1771
1772Error
Chaoren Line9547b82015-02-03 01:51:00 +00001773NativeProcessLinux::Interrupt ()
1774{
1775 // Pick a running thread (or if none, a not-dead stopped thread) as
1776 // the chosen thread that will be the stop-reason thread.
Chaoren Line9547b82015-02-03 01:51:00 +00001777 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1778
1779 NativeThreadProtocolSP running_thread_sp;
1780 NativeThreadProtocolSP stopped_thread_sp;
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001781
1782 if (log)
1783 log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__);
1784
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001785 for (auto thread_sp : m_threads)
Chaoren Line9547b82015-02-03 01:51:00 +00001786 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001787 // The thread shouldn't be null but lets just cover that here.
1788 if (!thread_sp)
1789 continue;
Chaoren Line9547b82015-02-03 01:51:00 +00001790
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001791 // If we have a running or stepping thread, we'll call that the
1792 // target of the interrupt.
1793 const auto thread_state = thread_sp->GetState ();
1794 if (thread_state == eStateRunning ||
1795 thread_state == eStateStepping)
Chaoren Line9547b82015-02-03 01:51:00 +00001796 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001797 running_thread_sp = thread_sp;
1798 break;
1799 }
1800 else if (!stopped_thread_sp && StateIsStoppedState (thread_state, true))
1801 {
1802 // Remember the first non-dead stopped thread. We'll use that as a backup if there are no running threads.
1803 stopped_thread_sp = thread_sp;
Chaoren Line9547b82015-02-03 01:51:00 +00001804 }
1805 }
1806
1807 if (!running_thread_sp && !stopped_thread_sp)
1808 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001809 Error error("found no running/stepping or live stopped threads as target for interrupt");
Chaoren Line9547b82015-02-03 01:51:00 +00001810 if (log)
Chaoren Line9547b82015-02-03 01:51:00 +00001811 log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ());
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001812
Chaoren Line9547b82015-02-03 01:51:00 +00001813 return error;
1814 }
1815
1816 NativeThreadProtocolSP deferred_signal_thread_sp = running_thread_sp ? running_thread_sp : stopped_thread_sp;
1817
1818 if (log)
1819 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64 " chosen for interrupt target",
1820 __FUNCTION__,
1821 GetID (),
1822 running_thread_sp ? "running" : "stopped",
1823 deferred_signal_thread_sp->GetID ());
1824
Pavel Labathed89c7f2015-05-06 12:22:37 +00001825 StopRunningThreads(deferred_signal_thread_sp->GetID());
Pavel Labath45f5cb32015-05-05 15:05:50 +00001826
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001827 return Error();
Chaoren Line9547b82015-02-03 01:51:00 +00001828}
1829
1830Error
Todd Fialaaf245d12014-06-30 21:05:18 +00001831NativeProcessLinux::Kill ()
1832{
1833 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1834 if (log)
1835 log->Printf ("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__, GetID ());
1836
1837 Error error;
1838
1839 switch (m_state)
1840 {
1841 case StateType::eStateInvalid:
1842 case StateType::eStateExited:
1843 case StateType::eStateCrashed:
1844 case StateType::eStateDetached:
1845 case StateType::eStateUnloaded:
1846 // Nothing to do - the process is already dead.
1847 if (log)
1848 log->Printf ("NativeProcessLinux::%s ignored for PID %" PRIu64 " due to current state: %s", __FUNCTION__, GetID (), StateAsCString (m_state));
1849 return error;
1850
1851 case StateType::eStateConnected:
1852 case StateType::eStateAttaching:
1853 case StateType::eStateLaunching:
1854 case StateType::eStateStopped:
1855 case StateType::eStateRunning:
1856 case StateType::eStateStepping:
1857 case StateType::eStateSuspended:
1858 // We can try to kill a process in these states.
1859 break;
1860 }
1861
1862 if (kill (GetID (), SIGKILL) != 0)
1863 {
1864 error.SetErrorToErrno ();
1865 return error;
1866 }
1867
1868 return error;
1869}
1870
1871static Error
1872ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info)
1873{
1874 memory_region_info.Clear();
1875
1876 StringExtractor line_extractor (maps_line.c_str ());
1877
1878 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode pathname
1879 // perms: rwxp (letter is present if set, '-' if not, final character is p=private, s=shared).
1880
1881 // Parse out the starting address
1882 lldb::addr_t start_address = line_extractor.GetHexMaxU64 (false, 0);
1883
1884 // Parse out hyphen separating start and end address from range.
1885 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != '-'))
1886 return Error ("malformed /proc/{pid}/maps entry, missing dash between address range");
1887
1888 // Parse out the ending address
1889 lldb::addr_t end_address = line_extractor.GetHexMaxU64 (false, start_address);
1890
1891 // Parse out the space after the address.
1892 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != ' '))
1893 return Error ("malformed /proc/{pid}/maps entry, missing space after range");
1894
1895 // Save the range.
1896 memory_region_info.GetRange ().SetRangeBase (start_address);
1897 memory_region_info.GetRange ().SetRangeEnd (end_address);
1898
Howard Hellyerad007562016-07-07 08:21:28 +00001899 // Any memory region in /proc/{pid}/maps is by definition mapped into the process.
1900 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes);
1901
Todd Fialaaf245d12014-06-30 21:05:18 +00001902 // Parse out each permission entry.
1903 if (line_extractor.GetBytesLeft () < 4)
1904 return Error ("malformed /proc/{pid}/maps entry, missing some portion of permissions");
1905
1906 // Handle read permission.
1907 const char read_perm_char = line_extractor.GetChar ();
1908 if (read_perm_char == 'r')
1909 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eYes);
1910 else
1911 {
1912 assert ( (read_perm_char == '-') && "unexpected /proc/{pid}/maps read permission char" );
1913 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1914 }
1915
1916 // Handle write permission.
1917 const char write_perm_char = line_extractor.GetChar ();
1918 if (write_perm_char == 'w')
1919 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eYes);
1920 else
1921 {
1922 assert ( (write_perm_char == '-') && "unexpected /proc/{pid}/maps write permission char" );
1923 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1924 }
1925
1926 // Handle execute permission.
1927 const char exec_perm_char = line_extractor.GetChar ();
1928 if (exec_perm_char == 'x')
1929 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eYes);
1930 else
1931 {
1932 assert ( (exec_perm_char == '-') && "unexpected /proc/{pid}/maps exec permission char" );
1933 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
1934 }
1935
1936 return Error ();
1937}
1938
1939Error
1940NativeProcessLinux::GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &range_info)
1941{
1942 // FIXME review that the final memory region returned extends to the end of the virtual address space,
1943 // with no perms if it is not mapped.
1944
1945 // Use an approach that reads memory regions from /proc/{pid}/maps.
1946 // Assume proc maps entries are in ascending order.
1947 // FIXME assert if we find differently.
Todd Fialaaf245d12014-06-30 21:05:18 +00001948
1949 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1950 Error error;
1951
1952 if (m_supports_mem_region == LazyBool::eLazyBoolNo)
1953 {
1954 // We're done.
1955 error.SetErrorString ("unsupported");
1956 return error;
1957 }
1958
1959 // If our cache is empty, pull the latest. There should always be at least one memory region
1960 // if memory region handling is supported.
1961 if (m_mem_region_cache.empty ())
1962 {
1963 error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
1964 [&] (const std::string &line) -> bool
1965 {
1966 MemoryRegionInfo info;
1967 const Error parse_error = ParseMemoryRegionInfoFromProcMapsLine (line, info);
1968 if (parse_error.Success ())
1969 {
1970 m_mem_region_cache.push_back (info);
1971 return true;
1972 }
1973 else
1974 {
1975 if (log)
1976 log->Printf ("NativeProcessLinux::%s failed to parse proc maps line '%s': %s", __FUNCTION__, line.c_str (), error.AsCString ());
1977 return false;
1978 }
1979 });
1980
1981 // If we had an error, we'll mark unsupported.
1982 if (error.Fail ())
1983 {
1984 m_supports_mem_region = LazyBool::eLazyBoolNo;
1985 return error;
1986 }
1987 else if (m_mem_region_cache.empty ())
1988 {
1989 // No entries after attempting to read them. This shouldn't happen if /proc/{pid}/maps
1990 // is supported. Assume we don't support map entries via procfs.
1991 if (log)
1992 log->Printf ("NativeProcessLinux::%s failed to find any procfs maps entries, assuming no support for memory region metadata retrieval", __FUNCTION__);
1993 m_supports_mem_region = LazyBool::eLazyBoolNo;
1994 error.SetErrorString ("not supported");
1995 return error;
1996 }
1997
1998 if (log)
1999 log->Printf ("NativeProcessLinux::%s read %" PRIu64 " memory region entries from /proc/%" PRIu64 "/maps", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()), GetID ());
2000
2001 // We support memory retrieval, remember that.
2002 m_supports_mem_region = LazyBool::eLazyBoolYes;
2003 }
2004 else
2005 {
2006 if (log)
2007 log->Printf ("NativeProcessLinux::%s reusing %" PRIu64 " cached memory region entries", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
2008 }
2009
2010 lldb::addr_t prev_base_address = 0;
2011
2012 // FIXME start by finding the last region that is <= target address using binary search. Data is sorted.
2013 // There can be a ton of regions on pthreads apps with lots of threads.
2014 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end (); ++it)
2015 {
2016 MemoryRegionInfo &proc_entry_info = *it;
2017
2018 // Sanity check assumption that /proc/{pid}/maps entries are ascending.
2019 assert ((proc_entry_info.GetRange ().GetRangeBase () >= prev_base_address) && "descending /proc/pid/maps entries detected, unexpected");
2020 prev_base_address = proc_entry_info.GetRange ().GetRangeBase ();
2021
2022 // If the target address comes before this entry, indicate distance to next region.
2023 if (load_addr < proc_entry_info.GetRange ().GetRangeBase ())
2024 {
2025 range_info.GetRange ().SetRangeBase (load_addr);
2026 range_info.GetRange ().SetByteSize (proc_entry_info.GetRange ().GetRangeBase () - load_addr);
2027 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
2028 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
2029 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
Howard Hellyerad007562016-07-07 08:21:28 +00002030 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
Todd Fialaaf245d12014-06-30 21:05:18 +00002031
2032 return error;
2033 }
2034 else if (proc_entry_info.GetRange ().Contains (load_addr))
2035 {
2036 // The target address is within the memory region we're processing here.
2037 range_info = proc_entry_info;
2038 return error;
2039 }
2040
2041 // The target memory address comes somewhere after the region we just parsed.
2042 }
2043
Tamas Berghammer09839c32015-07-03 09:30:19 +00002044 // If we made it here, we didn't find an entry that contained the given address. Return the
2045 // load_addr as start and the amount of bytes betwwen load address and the end of the memory as
2046 // size.
2047 range_info.GetRange ().SetRangeBase (load_addr);
Howard Hellyerad007562016-07-07 08:21:28 +00002048 range_info.GetRange ().SetRangeEnd(LLDB_INVALID_ADDRESS);
Tamas Berghammer09839c32015-07-03 09:30:19 +00002049 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
2050 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
2051 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
Howard Hellyerad007562016-07-07 08:21:28 +00002052 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
Todd Fialaaf245d12014-06-30 21:05:18 +00002053 return error;
2054}
2055
2056void
2057NativeProcessLinux::DoStopIDBumped (uint32_t newBumpId)
2058{
2059 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2060 if (log)
2061 log->Printf ("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called", __FUNCTION__, newBumpId);
2062
Todd Fialaaf245d12014-06-30 21:05:18 +00002063 if (log)
2064 log->Printf ("NativeProcessLinux::%s clearing %" PRIu64 " entries from the cache", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
2065 m_mem_region_cache.clear ();
Todd Fialaaf245d12014-06-30 21:05:18 +00002066}
2067
2068Error
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002069NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr)
Todd Fialaaf245d12014-06-30 21:05:18 +00002070{
2071 // FIXME implementing this requires the equivalent of
2072 // InferiorCallPOSIX::InferiorCallMmap, which depends on
2073 // functional ThreadPlans working with Native*Protocol.
2074#if 1
2075 return Error ("not implemented yet");
2076#else
2077 addr = LLDB_INVALID_ADDRESS;
2078
2079 unsigned prot = 0;
2080 if (permissions & lldb::ePermissionsReadable)
2081 prot |= eMmapProtRead;
2082 if (permissions & lldb::ePermissionsWritable)
2083 prot |= eMmapProtWrite;
2084 if (permissions & lldb::ePermissionsExecutable)
2085 prot |= eMmapProtExec;
2086
2087 // TODO implement this directly in NativeProcessLinux
2088 // (and lift to NativeProcessPOSIX if/when that class is
2089 // refactored out).
2090 if (InferiorCallMmap(this, addr, 0, size, prot,
2091 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
2092 m_addr_to_mmap_size[addr] = size;
2093 return Error ();
2094 } else {
2095 addr = LLDB_INVALID_ADDRESS;
2096 return Error("unable to allocate %" PRIu64 " bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
2097 }
2098#endif
2099}
2100
2101Error
2102NativeProcessLinux::DeallocateMemory (lldb::addr_t addr)
2103{
2104 // FIXME see comments in AllocateMemory - required lower-level
2105 // bits not in place yet (ThreadPlans)
2106 return Error ("not implemented");
2107}
2108
2109lldb::addr_t
2110NativeProcessLinux::GetSharedLibraryInfoAddress ()
2111{
Todd Fialaaf245d12014-06-30 21:05:18 +00002112 // punt on this for now
2113 return LLDB_INVALID_ADDRESS;
Todd Fialaaf245d12014-06-30 21:05:18 +00002114}
2115
2116size_t
2117NativeProcessLinux::UpdateThreads ()
2118{
2119 // The NativeProcessLinux monitoring threads are always up to date
2120 // with respect to thread state and they keep the thread list
2121 // populated properly. All this method needs to do is return the
2122 // thread count.
Todd Fialaaf245d12014-06-30 21:05:18 +00002123 return m_threads.size ();
2124}
2125
2126bool
2127NativeProcessLinux::GetArchitecture (ArchSpec &arch) const
2128{
2129 arch = m_arch;
2130 return true;
2131}
2132
2133Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002134NativeProcessLinux::GetSoftwareBreakpointPCOffset(uint32_t &actual_opcode_size)
Todd Fialaaf245d12014-06-30 21:05:18 +00002135{
2136 // FIXME put this behind a breakpoint protocol class that can be
2137 // set per architecture. Need ARM, MIPS support here.
2138 static const uint8_t g_i386_opcode [] = { 0xCC };
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00002139 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
Todd Fialaaf245d12014-06-30 21:05:18 +00002140
2141 switch (m_arch.GetMachine ())
2142 {
2143 case llvm::Triple::x86:
2144 case llvm::Triple::x86_64:
2145 actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode));
2146 return Error ();
2147
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00002148 case llvm::Triple::systemz:
2149 actual_opcode_size = static_cast<uint32_t> (sizeof(g_s390x_opcode));
2150 return Error ();
2151
Tamas Berghammerff7fd902015-07-03 12:51:30 +00002152 case llvm::Triple::arm:
2153 case llvm::Triple::aarch64:
Mohit K. Bhakkade8659b52015-04-23 06:36:20 +00002154 case llvm::Triple::mips64:
2155 case llvm::Triple::mips64el:
Sagar Thakurce815e42015-06-03 10:14:24 +00002156 case llvm::Triple::mips:
2157 case llvm::Triple::mipsel:
Tamas Berghammerff7fd902015-07-03 12:51:30 +00002158 // On these architectures the PC don't get updated for breakpoint hits
Jaydeep Patilc60c9452015-06-23 03:37:08 +00002159 actual_opcode_size = 0;
Mohit K. Bhakkade8659b52015-04-23 06:36:20 +00002160 return Error ();
2161
Todd Fialaaf245d12014-06-30 21:05:18 +00002162 default:
2163 assert(false && "CPU type not supported!");
2164 return Error ("CPU type not supported");
2165 }
2166}
2167
2168Error
2169NativeProcessLinux::SetBreakpoint (lldb::addr_t addr, uint32_t size, bool hardware)
2170{
2171 if (hardware)
2172 return Error ("NativeProcessLinux does not support hardware breakpoints");
2173 else
2174 return SetSoftwareBreakpoint (addr, size);
2175}
2176
2177Error
Tamas Berghammer63c8be92015-04-15 09:38:48 +00002178NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint,
2179 size_t &actual_opcode_size,
2180 const uint8_t *&trap_opcode_bytes)
Todd Fialaaf245d12014-06-30 21:05:18 +00002181{
Tamas Berghammer63c8be92015-04-15 09:38:48 +00002182 // FIXME put this behind a breakpoint protocol class that can be set per
2183 // architecture. Need MIPS support here.
Todd Fiala2afc5962014-08-21 16:42:31 +00002184 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 };
Tamas Berghammerbe379e12016-02-16 15:14:36 +00002185 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
2186 // linux kernel does otherwise.
2187 static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
Todd Fialaaf245d12014-06-30 21:05:18 +00002188 static const uint8_t g_i386_opcode [] = { 0xCC };
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00002189 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d };
Mohit K. Bhakkad2c2acf92015-04-09 07:12:15 +00002190 static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 };
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00002191 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
Tamas Berghammerbe379e12016-02-16 15:14:36 +00002192 static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
Todd Fialaaf245d12014-06-30 21:05:18 +00002193
2194 switch (m_arch.GetMachine ())
2195 {
Todd Fiala2afc5962014-08-21 16:42:31 +00002196 case llvm::Triple::aarch64:
2197 trap_opcode_bytes = g_aarch64_opcode;
2198 actual_opcode_size = sizeof(g_aarch64_opcode);
2199 return Error ();
2200
Tamas Berghammer63c8be92015-04-15 09:38:48 +00002201 case llvm::Triple::arm:
2202 switch (trap_opcode_size_hint)
2203 {
2204 case 2:
2205 trap_opcode_bytes = g_thumb_breakpoint_opcode;
2206 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
2207 return Error ();
2208 case 4:
2209 trap_opcode_bytes = g_arm_breakpoint_opcode;
2210 actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
2211 return Error ();
2212 default:
2213 assert(false && "Unrecognised trap opcode size hint!");
2214 return Error ("Unrecognised trap opcode size hint!");
2215 }
2216
Todd Fialaaf245d12014-06-30 21:05:18 +00002217 case llvm::Triple::x86:
2218 case llvm::Triple::x86_64:
2219 trap_opcode_bytes = g_i386_opcode;
2220 actual_opcode_size = sizeof(g_i386_opcode);
2221 return Error ();
2222
Sagar Thakurce815e42015-06-03 10:14:24 +00002223 case llvm::Triple::mips:
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00002224 case llvm::Triple::mips64:
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00002225 trap_opcode_bytes = g_mips64_opcode;
2226 actual_opcode_size = sizeof(g_mips64_opcode);
2227 return Error ();
2228
Sagar Thakurce815e42015-06-03 10:14:24 +00002229 case llvm::Triple::mipsel:
Mohit K. Bhakkad2c2acf92015-04-09 07:12:15 +00002230 case llvm::Triple::mips64el:
2231 trap_opcode_bytes = g_mips64el_opcode;
2232 actual_opcode_size = sizeof(g_mips64el_opcode);
2233 return Error ();
2234
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00002235 case llvm::Triple::systemz:
2236 trap_opcode_bytes = g_s390x_opcode;
2237 actual_opcode_size = sizeof(g_s390x_opcode);
2238 return Error ();
2239
Todd Fialaaf245d12014-06-30 21:05:18 +00002240 default:
2241 assert(false && "CPU type not supported!");
2242 return Error ("CPU type not supported");
2243 }
2244}
2245
2246#if 0
2247ProcessMessage::CrashReason
2248NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info)
2249{
2250 ProcessMessage::CrashReason reason;
2251 assert(info->si_signo == SIGSEGV);
2252
2253 reason = ProcessMessage::eInvalidCrashReason;
2254
2255 switch (info->si_code)
2256 {
2257 default:
2258 assert(false && "unexpected si_code for SIGSEGV");
2259 break;
2260 case SI_KERNEL:
2261 // Linux will occasionally send spurious SI_KERNEL codes.
2262 // (this is poorly documented in sigaction)
2263 // One way to get this is via unaligned SIMD loads.
2264 reason = ProcessMessage::eInvalidAddress; // for lack of anything better
2265 break;
2266 case SEGV_MAPERR:
2267 reason = ProcessMessage::eInvalidAddress;
2268 break;
2269 case SEGV_ACCERR:
2270 reason = ProcessMessage::ePrivilegedAddress;
2271 break;
2272 }
2273
2274 return reason;
2275}
2276#endif
2277
2278
2279#if 0
2280ProcessMessage::CrashReason
2281NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info)
2282{
2283 ProcessMessage::CrashReason reason;
2284 assert(info->si_signo == SIGILL);
2285
2286 reason = ProcessMessage::eInvalidCrashReason;
2287
2288 switch (info->si_code)
2289 {
2290 default:
2291 assert(false && "unexpected si_code for SIGILL");
2292 break;
2293 case ILL_ILLOPC:
2294 reason = ProcessMessage::eIllegalOpcode;
2295 break;
2296 case ILL_ILLOPN:
2297 reason = ProcessMessage::eIllegalOperand;
2298 break;
2299 case ILL_ILLADR:
2300 reason = ProcessMessage::eIllegalAddressingMode;
2301 break;
2302 case ILL_ILLTRP:
2303 reason = ProcessMessage::eIllegalTrap;
2304 break;
2305 case ILL_PRVOPC:
2306 reason = ProcessMessage::ePrivilegedOpcode;
2307 break;
2308 case ILL_PRVREG:
2309 reason = ProcessMessage::ePrivilegedRegister;
2310 break;
2311 case ILL_COPROC:
2312 reason = ProcessMessage::eCoprocessorError;
2313 break;
2314 case ILL_BADSTK:
2315 reason = ProcessMessage::eInternalStackError;
2316 break;
2317 }
2318
2319 return reason;
2320}
2321#endif
2322
2323#if 0
2324ProcessMessage::CrashReason
2325NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info)
2326{
2327 ProcessMessage::CrashReason reason;
2328 assert(info->si_signo == SIGFPE);
2329
2330 reason = ProcessMessage::eInvalidCrashReason;
2331
2332 switch (info->si_code)
2333 {
2334 default:
2335 assert(false && "unexpected si_code for SIGFPE");
2336 break;
2337 case FPE_INTDIV:
2338 reason = ProcessMessage::eIntegerDivideByZero;
2339 break;
2340 case FPE_INTOVF:
2341 reason = ProcessMessage::eIntegerOverflow;
2342 break;
2343 case FPE_FLTDIV:
2344 reason = ProcessMessage::eFloatDivideByZero;
2345 break;
2346 case FPE_FLTOVF:
2347 reason = ProcessMessage::eFloatOverflow;
2348 break;
2349 case FPE_FLTUND:
2350 reason = ProcessMessage::eFloatUnderflow;
2351 break;
2352 case FPE_FLTRES:
2353 reason = ProcessMessage::eFloatInexactResult;
2354 break;
2355 case FPE_FLTINV:
2356 reason = ProcessMessage::eFloatInvalidOperation;
2357 break;
2358 case FPE_FLTSUB:
2359 reason = ProcessMessage::eFloatSubscriptRange;
2360 break;
2361 }
2362
2363 return reason;
2364}
2365#endif
2366
2367#if 0
2368ProcessMessage::CrashReason
2369NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info)
2370{
2371 ProcessMessage::CrashReason reason;
2372 assert(info->si_signo == SIGBUS);
2373
2374 reason = ProcessMessage::eInvalidCrashReason;
2375
2376 switch (info->si_code)
2377 {
2378 default:
2379 assert(false && "unexpected si_code for SIGBUS");
2380 break;
2381 case BUS_ADRALN:
2382 reason = ProcessMessage::eIllegalAlignment;
2383 break;
2384 case BUS_ADRERR:
2385 reason = ProcessMessage::eIllegalAddress;
2386 break;
2387 case BUS_OBJERR:
2388 reason = ProcessMessage::eHardwareError;
2389 break;
2390 }
2391
2392 return reason;
2393}
2394#endif
2395
Todd Fialaaf245d12014-06-30 21:05:18 +00002396Error
Chaoren Lin26438d22015-05-05 17:50:53 +00002397NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
Todd Fialaaf245d12014-06-30 21:05:18 +00002398{
Pavel Labathdf7c6992015-06-17 18:38:49 +00002399 if (ProcessVmReadvSupported()) {
2400 // The process_vm_readv path is about 50 times faster than ptrace api. We want to use
2401 // this syscall if it is supported.
2402
2403 const ::pid_t pid = GetID();
2404
2405 struct iovec local_iov, remote_iov;
2406 local_iov.iov_base = buf;
2407 local_iov.iov_len = size;
2408 remote_iov.iov_base = reinterpret_cast<void *>(addr);
2409 remote_iov.iov_len = size;
2410
2411 bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0);
2412 const bool success = bytes_read == size;
2413
2414 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2415 if (log)
2416 log->Printf ("NativeProcessLinux::%s using process_vm_readv to read %zd bytes from inferior address 0x%" PRIx64": %s",
2417 __FUNCTION__, size, addr, success ? "Success" : strerror(errno));
2418
2419 if (success)
2420 return Error();
2421 // else
2422 // the call failed for some reason, let's retry the read using ptrace api.
2423 }
2424
Pavel Labath19cbe962015-07-21 13:20:32 +00002425 unsigned char *dst = static_cast<unsigned char*>(buf);
2426 size_t remainder;
2427 long data;
2428
2429 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2430 if (log)
2431 ProcessPOSIXLog::IncNestLevel();
2432 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
2433 log->Printf ("NativeProcessLinux::%s(%p, %p, %zd, _)", __FUNCTION__, (void*)addr, buf, size);
2434
2435 for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
2436 {
2437 Error error = NativeProcessLinux::PtraceWrapper(PTRACE_PEEKDATA, GetID(), (void*)addr, nullptr, 0, &data);
2438 if (error.Fail())
2439 {
2440 if (log)
2441 ProcessPOSIXLog::DecNestLevel();
2442 return error;
2443 }
2444
2445 remainder = size - bytes_read;
2446 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2447
2448 // Copy the data into our buffer
Mohit K. Bhakkadf6ef1872015-12-23 12:34:58 +00002449 memcpy(dst, &data, remainder);
Pavel Labath19cbe962015-07-21 13:20:32 +00002450
2451 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2452 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2453 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2454 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2455 {
2456 uintptr_t print_dst = 0;
2457 // Format bytes from data by moving into print_dst for log output
2458 for (unsigned i = 0; i < remainder; ++i)
2459 print_dst |= (((data >> i*8) & 0xFF) << i*8);
Pavel Labath79203992015-07-23 13:07:37 +00002460 log->Printf ("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64 " (0x%" PRIx64 ")",
2461 __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data));
Pavel Labath19cbe962015-07-21 13:20:32 +00002462 }
2463 addr += k_ptrace_word_size;
2464 dst += k_ptrace_word_size;
2465 }
2466
2467 if (log)
2468 ProcessPOSIXLog::DecNestLevel();
2469 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00002470}
2471
2472Error
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002473NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
2474{
2475 Error error = ReadMemory(addr, buf, size, bytes_read);
2476 if (error.Fail()) return error;
2477 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size);
2478}
2479
2480Error
2481NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written)
Todd Fialaaf245d12014-06-30 21:05:18 +00002482{
Pavel Labath19cbe962015-07-21 13:20:32 +00002483 const unsigned char *src = static_cast<const unsigned char*>(buf);
2484 size_t remainder;
2485 Error error;
2486
2487 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2488 if (log)
2489 ProcessPOSIXLog::IncNestLevel();
2490 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
Pavel Labath79203992015-07-23 13:07:37 +00002491 log->Printf ("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__, addr, buf, size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002492
2493 for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
2494 {
2495 remainder = size - bytes_written;
2496 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2497
2498 if (remainder == k_ptrace_word_size)
2499 {
2500 unsigned long data = 0;
Mohit K. Bhakkadf6ef1872015-12-23 12:34:58 +00002501 memcpy(&data, src, k_ptrace_word_size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002502
2503 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2504 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2505 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2506 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2507 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2508 (void*)addr, *(const unsigned long*)src, data);
2509
2510 error = NativeProcessLinux::PtraceWrapper(PTRACE_POKEDATA, GetID(), (void*)addr, (void*)data);
2511 if (error.Fail())
2512 {
2513 if (log)
2514 ProcessPOSIXLog::DecNestLevel();
2515 return error;
2516 }
2517 }
2518 else
2519 {
2520 unsigned char buff[8];
2521 size_t bytes_read;
2522 error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read);
2523 if (error.Fail())
2524 {
2525 if (log)
2526 ProcessPOSIXLog::DecNestLevel();
2527 return error;
2528 }
2529
2530 memcpy(buff, src, remainder);
2531
2532 size_t bytes_written_rec;
2533 error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec);
2534 if (error.Fail())
2535 {
2536 if (log)
2537 ProcessPOSIXLog::DecNestLevel();
2538 return error;
2539 }
2540
2541 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2542 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2543 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2544 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2545 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2546 (void*)addr, *(const unsigned long*)src, *(unsigned long*)buff);
2547 }
2548
2549 addr += k_ptrace_word_size;
2550 src += k_ptrace_word_size;
2551 }
2552 if (log)
2553 ProcessPOSIXLog::DecNestLevel();
2554 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002555}
2556
Chaoren Lin97ccc292015-02-03 01:51:12 +00002557Error
Chaoren Lin97ccc292015-02-03 01:51:12 +00002558NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo)
Todd Fialaaf245d12014-06-30 21:05:18 +00002559{
Pavel Labath19cbe962015-07-21 13:20:32 +00002560 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo);
Todd Fialaaf245d12014-06-30 21:05:18 +00002561}
2562
Chaoren Lin97ccc292015-02-03 01:51:12 +00002563Error
Todd Fialaaf245d12014-06-30 21:05:18 +00002564NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message)
2565{
Pavel Labath19cbe962015-07-21 13:20:32 +00002566 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message);
Todd Fialaaf245d12014-06-30 21:05:18 +00002567}
2568
Tamas Berghammerdb264a62015-03-31 09:52:22 +00002569Error
Todd Fialaaf245d12014-06-30 21:05:18 +00002570NativeProcessLinux::Detach(lldb::tid_t tid)
2571{
Chaoren Lin97ccc292015-02-03 01:51:12 +00002572 if (tid == LLDB_INVALID_THREAD_ID)
2573 return Error();
2574
Pavel Labath19cbe962015-07-21 13:20:32 +00002575 return PtraceWrapper(PTRACE_DETACH, tid);
Todd Fialaaf245d12014-06-30 21:05:18 +00002576}
2577
2578bool
Chaoren Lind3173f32015-05-29 19:52:29 +00002579NativeProcessLinux::DupDescriptor(const FileSpec &file_spec, int fd, int flags)
Todd Fialaaf245d12014-06-30 21:05:18 +00002580{
Chaoren Lind3173f32015-05-29 19:52:29 +00002581 int target_fd = open(file_spec.GetCString(), flags, 0666);
Todd Fialaaf245d12014-06-30 21:05:18 +00002582
2583 if (target_fd == -1)
2584 return false;
2585
Pavel Labath493c3a12015-02-04 10:36:57 +00002586 if (dup2(target_fd, fd) == -1)
2587 return false;
2588
2589 return (close(target_fd) == -1) ? false : true;
Todd Fialaaf245d12014-06-30 21:05:18 +00002590}
2591
Todd Fialaaf245d12014-06-30 21:05:18 +00002592bool
2593NativeProcessLinux::HasThreadNoLock (lldb::tid_t thread_id)
2594{
2595 for (auto thread_sp : m_threads)
2596 {
2597 assert (thread_sp && "thread list should not contain NULL threads");
2598 if (thread_sp->GetID () == thread_id)
2599 {
2600 // We have this thread.
2601 return true;
2602 }
2603 }
2604
2605 // We don't have this thread.
2606 return false;
2607}
2608
Todd Fialaaf245d12014-06-30 21:05:18 +00002609bool
2610NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id)
2611{
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002612 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2613
2614 if (log)
2615 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread_id);
2616
2617 bool found = false;
2618
Todd Fialaaf245d12014-06-30 21:05:18 +00002619 for (auto it = m_threads.begin (); it != m_threads.end (); ++it)
2620 {
2621 if (*it && ((*it)->GetID () == thread_id))
2622 {
2623 m_threads.erase (it);
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002624 found = true;
2625 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00002626 }
2627 }
2628
Pavel Labath0e1d7292015-08-20 09:06:12 +00002629 SignalIfAllThreadsStopped();
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002630
2631 return found;
Todd Fialaaf245d12014-06-30 21:05:18 +00002632}
2633
Pavel Labathf9077782015-08-21 09:13:53 +00002634NativeThreadLinuxSP
Todd Fialaaf245d12014-06-30 21:05:18 +00002635NativeProcessLinux::AddThread (lldb::tid_t thread_id)
2636{
2637 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
2638
Todd Fialaaf245d12014-06-30 21:05:18 +00002639 if (log)
2640 {
2641 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " adding thread with tid %" PRIu64,
2642 __FUNCTION__,
2643 GetID (),
2644 thread_id);
2645 }
2646
2647 assert (!HasThreadNoLock (thread_id) && "attempted to add a thread by id that already exists");
2648
2649 // If this is the first thread, save it as the current thread
2650 if (m_threads.empty ())
2651 SetCurrentThreadID (thread_id);
2652
Pavel Labathf9077782015-08-21 09:13:53 +00002653 auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id);
Todd Fialaaf245d12014-06-30 21:05:18 +00002654 m_threads.push_back (thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +00002655 return thread_sp;
2656}
2657
Todd Fialaaf245d12014-06-30 21:05:18 +00002658Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002659NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread)
Todd Fialaaf245d12014-06-30 21:05:18 +00002660{
Todd Fiala75f47c32014-10-11 21:42:09 +00002661 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Todd Fialaaf245d12014-06-30 21:05:18 +00002662
2663 Error error;
2664
Todd Fialaaf245d12014-06-30 21:05:18 +00002665 // Find out the size of a breakpoint (might depend on where we are in the code).
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002666 NativeRegisterContextSP context_sp = thread.GetRegisterContext();
Todd Fialaaf245d12014-06-30 21:05:18 +00002667 if (!context_sp)
2668 {
2669 error.SetErrorString ("cannot get a NativeRegisterContext for the thread");
2670 if (log)
2671 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ());
2672 return error;
2673 }
2674
2675 uint32_t breakpoint_size = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002676 error = GetSoftwareBreakpointPCOffset(breakpoint_size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002677 if (error.Fail ())
2678 {
2679 if (log)
2680 log->Printf ("NativeProcessLinux::%s GetBreakpointSize() failed: %s", __FUNCTION__, error.AsCString ());
2681 return error;
2682 }
2683 else
2684 {
2685 if (log)
2686 log->Printf ("NativeProcessLinux::%s breakpoint size: %" PRIu32, __FUNCTION__, breakpoint_size);
2687 }
2688
2689 // First try probing for a breakpoint at a software breakpoint location: PC - breakpoint size.
Jaydeep Patilc60c9452015-06-23 03:37:08 +00002690 const lldb::addr_t initial_pc_addr = context_sp->GetPCfromBreakpointLocation ();
Todd Fialaaf245d12014-06-30 21:05:18 +00002691 lldb::addr_t breakpoint_addr = initial_pc_addr;
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002692 if (breakpoint_size > 0)
Todd Fialaaf245d12014-06-30 21:05:18 +00002693 {
2694 // Do not allow breakpoint probe to wrap around.
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002695 if (breakpoint_addr >= breakpoint_size)
2696 breakpoint_addr -= breakpoint_size;
Todd Fialaaf245d12014-06-30 21:05:18 +00002697 }
2698
2699 // Check if we stopped because of a breakpoint.
2700 NativeBreakpointSP breakpoint_sp;
2701 error = m_breakpoint_list.GetBreakpoint (breakpoint_addr, breakpoint_sp);
2702 if (!error.Success () || !breakpoint_sp)
2703 {
2704 // We didn't find one at a software probe location. Nothing to do.
2705 if (log)
2706 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64, __FUNCTION__, GetID (), breakpoint_addr);
2707 return Error ();
2708 }
2709
2710 // If the breakpoint is not a software breakpoint, nothing to do.
2711 if (!breakpoint_sp->IsSoftwareBreakpoint ())
2712 {
2713 if (log)
2714 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", not software, nothing to adjust", __FUNCTION__, GetID (), breakpoint_addr);
2715 return Error ();
2716 }
2717
2718 //
2719 // We have a software breakpoint and need to adjust the PC.
2720 //
2721
2722 // Sanity check.
2723 if (breakpoint_size == 0)
2724 {
2725 // Nothing to do! How did we get here?
2726 if (log)
2727 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", it is software, but the size is zero, nothing to do (unexpected)", __FUNCTION__, GetID (), breakpoint_addr);
2728 return Error ();
2729 }
2730
2731 // Change the program counter.
2732 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002733 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64, __FUNCTION__, GetID(), thread.GetID(), initial_pc_addr, breakpoint_addr);
Todd Fialaaf245d12014-06-30 21:05:18 +00002734
2735 error = context_sp->SetPC (breakpoint_addr);
2736 if (error.Fail ())
2737 {
2738 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002739 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID(), thread.GetID(), error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +00002740 return error;
2741 }
2742
2743 return error;
2744}
Chaoren Linfa03ad22015-02-03 01:50:42 +00002745
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002746Error
2747NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec)
2748{
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002749 FileSpec module_file_spec(module_path, true);
2750
Pavel Labath162fb8e2015-07-23 14:47:33 +00002751 bool found = false;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002752 file_spec.Clear();
Pavel Labath162fb8e2015-07-23 14:47:33 +00002753 ProcFileReader::ProcessLineByLine(GetID(), "maps",
2754 [&] (const std::string &line)
2755 {
2756 SmallVector<StringRef, 16> columns;
2757 StringRef(line).split(columns, " ", -1, false);
2758 if (columns.size() < 6)
2759 return true; // continue searching
2760
2761 FileSpec this_file_spec(columns[5].str().c_str(), false);
2762 if (this_file_spec.GetFilename() != module_file_spec.GetFilename())
2763 return true; // continue searching
2764
2765 file_spec = this_file_spec;
2766 found = true;
2767 return false; // we are done
2768 });
2769
2770 if (! found)
2771 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
2772 module_file_spec.GetFilename().AsCString(), GetID());
2773
2774 return Error();
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002775}
Pavel Labathc0765592015-05-06 10:46:34 +00002776
Pavel Labath5eb721e2015-05-07 08:30:31 +00002777Error
Tamas Berghammer783bfc82015-06-18 20:43:56 +00002778NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef& file_name, lldb::addr_t& load_addr)
2779{
2780 load_addr = LLDB_INVALID_ADDRESS;
2781 Error error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
2782 [&] (const std::string &line) -> bool
2783 {
2784 StringRef maps_row(line);
2785
2786 SmallVector<StringRef, 16> maps_columns;
2787 maps_row.split(maps_columns, StringRef(" "), -1, false);
2788
2789 if (maps_columns.size() < 6)
2790 {
2791 // Return true to continue reading the proc file
2792 return true;
2793 }
2794
2795 if (maps_columns[5] == file_name)
2796 {
2797 StringExtractor addr_extractor(maps_columns[0].str().c_str());
2798 load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2799
2800 // Return false to stop reading the proc file further
2801 return false;
2802 }
2803
2804 // Return true to continue reading the proc file
2805 return true;
2806 });
2807 return error;
2808}
2809
Pavel Labathf9077782015-08-21 09:13:53 +00002810NativeThreadLinuxSP
2811NativeProcessLinux::GetThreadByID(lldb::tid_t tid)
2812{
2813 return std::static_pointer_cast<NativeThreadLinux>(NativeProcessProtocol::GetThreadByID(tid));
2814}
2815
Tamas Berghammer783bfc82015-06-18 20:43:56 +00002816Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002817NativeProcessLinux::ResumeThread(NativeThreadLinux &thread, lldb::StateType state, int signo)
Pavel Labathc0765592015-05-06 10:46:34 +00002818{
Pavel Labath5eb721e2015-05-07 08:30:31 +00002819 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002820
2821 if (log)
Pavel Labath0e1d7292015-08-20 09:06:12 +00002822 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002823 __FUNCTION__, thread.GetID());
Pavel Labath5eb721e2015-05-07 08:30:31 +00002824
Pavel Labathc0765592015-05-06 10:46:34 +00002825 // Before we do the resume below, first check if we have a pending
Pavel Labath108c3252015-05-12 09:03:18 +00002826 // stop notification that is currently waiting for
Pavel Labath0e1d7292015-08-20 09:06:12 +00002827 // all threads to stop. This is potentially a buggy situation since
Pavel Labathc0765592015-05-06 10:46:34 +00002828 // we're ostensibly waiting for threads to stop before we send out the
2829 // pending notification, and here we are resuming one before we send
2830 // out the pending stop notification.
Pavel Labath0e1d7292015-08-20 09:06:12 +00002831 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log)
Pavel Labathc0765592015-05-06 10:46:34 +00002832 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002833 log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64 " per explicit request but we have a pending stop notification (tid %" PRIu64 ") that is actively waiting for this thread to stop. Valid sequence of events?", __FUNCTION__, thread.GetID(), m_pending_notification_tid);
Pavel Labathc0765592015-05-06 10:46:34 +00002834 }
2835
2836 // Request a resume. We expect this to be synchronous and the system
2837 // to reflect it is running after this completes.
Pavel Labath0e1d7292015-08-20 09:06:12 +00002838 switch (state)
Pavel Labathc0765592015-05-06 10:46:34 +00002839 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002840 case eStateRunning:
2841 {
Pavel Labath605b51b2016-02-23 13:56:30 +00002842 const auto resume_result = thread.Resume(signo);
Pavel Labath0e1d7292015-08-20 09:06:12 +00002843 if (resume_result.Success())
2844 SetState(eStateRunning, true);
2845 return resume_result;
Pavel Labathc0765592015-05-06 10:46:34 +00002846 }
Pavel Labath0e1d7292015-08-20 09:06:12 +00002847 case eStateStepping:
2848 {
Pavel Labath605b51b2016-02-23 13:56:30 +00002849 const auto step_result = thread.SingleStep(signo);
Pavel Labath0e1d7292015-08-20 09:06:12 +00002850 if (step_result.Success())
2851 SetState(eStateRunning, true);
2852 return step_result;
2853 }
2854 default:
2855 if (log)
2856 log->Printf("NativeProcessLinux::%s Unhandled state %s.",
2857 __FUNCTION__, StateAsCString(state));
2858 llvm_unreachable("Unhandled state for resume");
2859 }
Pavel Labathc0765592015-05-06 10:46:34 +00002860}
2861
2862//===----------------------------------------------------------------------===//
2863
2864void
Pavel Labath337f3eb2015-05-08 08:57:45 +00002865NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid)
Pavel Labathc0765592015-05-06 10:46:34 +00002866{
Pavel Labath5eb721e2015-05-07 08:30:31 +00002867 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
Pavel Labathc0765592015-05-06 10:46:34 +00002868
Pavel Labath5eb721e2015-05-07 08:30:31 +00002869 if (log)
Pavel Labathc0765592015-05-06 10:46:34 +00002870 {
Pavel Labath5eb721e2015-05-07 08:30:31 +00002871 log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")",
Pavel Labathc0765592015-05-06 10:46:34 +00002872 __FUNCTION__, triggering_tid);
2873 }
2874
Pavel Labath0e1d7292015-08-20 09:06:12 +00002875 m_pending_notification_tid = triggering_tid;
2876
2877 // Request a stop for all the thread stops that need to be stopped
2878 // and are not already known to be stopped.
2879 for (const auto &thread_sp: m_threads)
2880 {
2881 if (StateIsRunningState(thread_sp->GetState()))
2882 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop();
2883 }
2884
2885 SignalIfAllThreadsStopped();
Pavel Labathc0765592015-05-06 10:46:34 +00002886
Pavel Labath5eb721e2015-05-07 08:30:31 +00002887 if (log)
Pavel Labathc0765592015-05-06 10:46:34 +00002888 {
Pavel Labath5eb721e2015-05-07 08:30:31 +00002889 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__);
Pavel Labathc0765592015-05-06 10:46:34 +00002890 }
2891}
2892
2893void
Pavel Labath9eb1ecb2015-05-15 13:49:01 +00002894NativeProcessLinux::SignalIfAllThreadsStopped()
Pavel Labathc0765592015-05-06 10:46:34 +00002895{
Pavel Labath0e1d7292015-08-20 09:06:12 +00002896 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID)
2897 return; // No pending notification. Nothing to do.
Pavel Labath9eb1ecb2015-05-15 13:49:01 +00002898
Pavel Labath8c8ff7a2015-05-11 10:03:10 +00002899 for (const auto &thread_sp: m_threads)
Pavel Labathc0765592015-05-06 10:46:34 +00002900 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002901 if (StateIsRunningState(thread_sp->GetState()))
2902 return; // Some threads are still running. Don't signal yet.
Pavel Labathc0765592015-05-06 10:46:34 +00002903 }
2904
Pavel Labath0e1d7292015-08-20 09:06:12 +00002905 // We have a pending notification and all threads have stopped.
2906 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
Pavel Labathc0765592015-05-06 10:46:34 +00002907
Pavel Labath0e1d7292015-08-20 09:06:12 +00002908 // Clear any temporary breakpoints we used to implement software single stepping.
2909 for (const auto &thread_info: m_threads_stepping_with_breakpoint)
Pavel Labathc0765592015-05-06 10:46:34 +00002910 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002911 Error error = RemoveBreakpoint (thread_info.second);
2912 if (error.Fail())
2913 if (log)
2914 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " remove stepping breakpoint: %s",
2915 __FUNCTION__, thread_info.first, error.AsCString());
Pavel Labathc0765592015-05-06 10:46:34 +00002916 }
Pavel Labath0e1d7292015-08-20 09:06:12 +00002917 m_threads_stepping_with_breakpoint.clear();
Pavel Labathc0765592015-05-06 10:46:34 +00002918
Pavel Labath0e1d7292015-08-20 09:06:12 +00002919 // Notify the delegate about the stop
2920 SetCurrentThreadID(m_pending_notification_tid);
2921 SetState(StateType::eStateStopped, true);
2922 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
Pavel Labathc0765592015-05-06 10:46:34 +00002923}
2924
2925void
Pavel Labathf9077782015-08-21 09:13:53 +00002926NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread)
Pavel Labathc0765592015-05-06 10:46:34 +00002927{
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002928 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2929
2930 if (log)
Pavel Labathf9077782015-08-21 09:13:53 +00002931 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread.GetID());
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002932
Pavel Labathf9077782015-08-21 09:13:53 +00002933 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && StateIsRunningState(thread.GetState()))
Pavel Labathc0765592015-05-06 10:46:34 +00002934 {
2935 // We will need to wait for this new thread to stop as well before firing the
2936 // notification.
Pavel Labathf9077782015-08-21 09:13:53 +00002937 thread.RequestStop();
Pavel Labathc0765592015-05-06 10:46:34 +00002938 }
2939}
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002940
Pavel Labath19cbe962015-07-21 13:20:32 +00002941void
2942NativeProcessLinux::SigchldHandler()
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002943{
Pavel Labath19cbe962015-07-21 13:20:32 +00002944 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
2945 // Process all pending waitpid notifications.
2946 while (true)
2947 {
2948 int status = -1;
2949 ::pid_t wait_pid = waitpid(-1, &status, __WALL | __WNOTHREAD | WNOHANG);
2950
2951 if (wait_pid == 0)
2952 break; // We are done.
2953
2954 if (wait_pid == -1)
2955 {
2956 if (errno == EINTR)
2957 continue;
2958
2959 Error error(errno, eErrorTypePOSIX);
2960 if (log)
2961 log->Printf("NativeProcessLinux::%s waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG) failed: %s",
2962 __FUNCTION__, error.AsCString());
2963 break;
2964 }
2965
2966 bool exited = false;
2967 int signal = 0;
2968 int exit_status = 0;
2969 const char *status_cstr = nullptr;
2970 if (WIFSTOPPED(status))
2971 {
2972 signal = WSTOPSIG(status);
2973 status_cstr = "STOPPED";
2974 }
2975 else if (WIFEXITED(status))
2976 {
2977 exit_status = WEXITSTATUS(status);
2978 status_cstr = "EXITED";
2979 exited = true;
2980 }
2981 else if (WIFSIGNALED(status))
2982 {
2983 signal = WTERMSIG(status);
2984 status_cstr = "SIGNALED";
Omair Javaiddee4a862015-08-19 10:44:16 +00002985 if (wait_pid == static_cast< ::pid_t>(GetID())) {
Pavel Labath19cbe962015-07-21 13:20:32 +00002986 exited = true;
2987 exit_status = -1;
2988 }
2989 }
2990 else
2991 status_cstr = "(\?\?\?)";
2992
2993 if (log)
2994 log->Printf("NativeProcessLinux::%s: waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG)"
2995 "=> pid = %" PRIi32 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
2996 __FUNCTION__, wait_pid, status, status_cstr, signal, exit_status);
2997
2998 MonitorCallback (wait_pid, exited, signal, exit_status);
2999 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003000}
3001
3002// Wrapper for ptrace to catch errors and log calls.
3003// Note that ptrace sets errno on error because -1 can be a valid result (i.e. for PTRACE_PEEK*)
Pavel Labath4a9babb2015-06-30 17:04:49 +00003004Error
3005NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, long *result)
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003006{
Pavel Labath4a9babb2015-06-30 17:04:49 +00003007 Error error;
3008 long int ret;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003009
3010 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE));
3011
3012 PtraceDisplayBytes(req, data, data_size);
3013
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003014 errno = 0;
3015 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
Pavel Labath4a9babb2015-06-30 17:04:49 +00003016 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003017 else
Pavel Labath4a9babb2015-06-30 17:04:49 +00003018 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003019
Pavel Labath4a9babb2015-06-30 17:04:49 +00003020 if (ret == -1)
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003021 error.SetErrorToErrno();
3022
Pavel Labath4a9babb2015-06-30 17:04:49 +00003023 if (result)
3024 *result = ret;
3025
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003026 if (log)
Pavel Labath4a9babb2015-06-30 17:04:49 +00003027 log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr, data, data_size, ret);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003028
3029 PtraceDisplayBytes(req, data, data_size);
3030
3031 if (log && error.GetError() != 0)
3032 {
3033 const char* str;
3034 switch (error.GetError())
3035 {
3036 case ESRCH: str = "ESRCH"; break;
3037 case EINVAL: str = "EINVAL"; break;
3038 case EBUSY: str = "EBUSY"; break;
3039 case EPERM: str = "EPERM"; break;
3040 default: str = error.AsCString();
3041 }
3042 log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str);
3043 }
3044
Pavel Labath4a9babb2015-06-30 17:04:49 +00003045 return error;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00003046}