blob: 8e2587bce0e22f16f78737703ea89478bd47b8dd [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 <stdint.h>
Kate Stoneb9c1b512016-09-06 20:57:50 +000015#include <string.h>
Todd Fialaaf245d12014-06-30 21:05:18 +000016#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"
Pavel Labath5ad891f2016-07-21 14:54:03 +000032#include "lldb/Host/HostProcess.h"
Zachary Turner39de3112014-09-09 20:54:56 +000033#include "lldb/Host/ThreadLauncher.h"
Pavel Labath2a86b552016-06-14 17:30:52 +000034#include "lldb/Host/common/NativeBreakpoint.h"
35#include "lldb/Host/common/NativeRegisterContext.h"
Pavel Labath5ad891f2016-07-21 14:54:03 +000036#include "lldb/Host/linux/ProcessLauncherLinux.h"
Pavel Labath2a86b552016-06-14 17:30:52 +000037#include "lldb/Symbol/ObjectFile.h"
Zachary Turner90aff472015-03-03 23:36:51 +000038#include "lldb/Target/Process.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000039#include "lldb/Target/ProcessLaunchInfo.h"
Pavel Labath5b981ab2015-05-29 12:53:54 +000040#include "lldb/Target/Target.h"
Chaoren Linc16f5dc2015-03-19 23:28:10 +000041#include "lldb/Utility/LLDBAssert.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000042#include "lldb/Utility/PseudoTerminal.h"
Pavel Labathf805e192015-07-07 10:08:41 +000043#include "lldb/Utility/StringExtractor.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000044
Todd Fialaaf245d12014-06-30 21:05:18 +000045#include "NativeThreadLinux.h"
Kate Stoneb9c1b512016-09-06 20:57:50 +000046#include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000047#include "ProcFileReader.h"
Tamas Berghammer1e209fc2015-03-13 11:36:47 +000048#include "Procfs.h"
Todd Fialacacde7d2014-09-27 16:54:22 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050// System includes - They have to be included after framework includes because
51// they define some
Tamas Berghammerd8584872015-02-06 10:57:40 +000052// macros which collide with variable names in other modules
53#include <linux/unistd.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000054#include <sys/socket.h>
Vince Harron8b335672015-05-12 01:10:56 +000055
Pavel Labathdf7c6992015-06-17 18:38:49 +000056#include <sys/syscall.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000057#include <sys/types.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000058#include <sys/user.h>
59#include <sys/wait.h>
60
Vince Harron8b335672015-05-12 01:10:56 +000061#include "lldb/Host/linux/Personality.h"
62#include "lldb/Host/linux/Ptrace.h"
Pavel Labathdf7c6992015-06-17 18:38:49 +000063#include "lldb/Host/linux/Uio.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000064
Todd Fialaaf245d12014-06-30 21:05:18 +000065// Support hardware breakpoints in case it has not been defined
66#ifndef TRAP_HWBKPT
Kate Stoneb9c1b512016-09-06 20:57:50 +000067#define TRAP_HWBKPT 4
Todd Fialaaf245d12014-06-30 21:05:18 +000068#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
Kate Stoneb9c1b512016-09-06 20:57:50 +000077static bool ProcessVmReadvSupported() {
78 static bool is_supported;
79 static std::once_flag flag;
Pavel Labathdf7c6992015-06-17 18:38:49 +000080
Kate Stoneb9c1b512016-09-06 20:57:50 +000081 std::call_once(flag, [] {
Pavel Labath4abe5d62016-07-15 10:18:15 +000082 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Pavel Labath4abe5d62016-07-15 10:18:15 +000083
Kate Stoneb9c1b512016-09-06 20:57:50 +000084 uint32_t source = 0x47424742;
85 uint32_t dest = 0;
Pavel Labath4abe5d62016-07-15 10:18:15 +000086
Kate Stoneb9c1b512016-09-06 20:57:50 +000087 struct iovec local, remote;
88 remote.iov_base = &source;
89 local.iov_base = &dest;
90 remote.iov_len = local.iov_len = sizeof source;
Pavel Labath4abe5d62016-07-15 10:18:15 +000091
Kate Stoneb9c1b512016-09-06 20:57:50 +000092 // We shall try if cross-process-memory reads work by attempting to read a
93 // 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 if (is_supported)
98 log->Printf("%s: Detected kernel support for process_vm_readv syscall. "
99 "Fast memory reads enabled.",
100 __FUNCTION__);
101 else
102 log->Printf("%s: syscall process_vm_readv failed (error: %s). Fast "
103 "memory reads disabled.",
104 __FUNCTION__, strerror(errno));
105 }
106 });
Pavel Labath4abe5d62016-07-15 10:18:15 +0000107
Kate Stoneb9c1b512016-09-06 20:57:50 +0000108 return is_supported;
Pavel Labath4abe5d62016-07-15 10:18:15 +0000109}
110
Kate Stoneb9c1b512016-09-06 20:57:50 +0000111namespace {
112void MaybeLogLaunchInfo(const ProcessLaunchInfo &info) {
113 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
114 if (!log)
115 return;
116
117 if (const FileAction *action = info.GetFileActionForFD(STDIN_FILENO))
118 log->Printf("%s: setting STDIN to '%s'", __FUNCTION__,
119 action->GetFileSpec().GetCString());
120 else
121 log->Printf("%s leaving STDIN as is", __FUNCTION__);
122
123 if (const FileAction *action = info.GetFileActionForFD(STDOUT_FILENO))
124 log->Printf("%s setting STDOUT to '%s'", __FUNCTION__,
125 action->GetFileSpec().GetCString());
126 else
127 log->Printf("%s leaving STDOUT as is", __FUNCTION__);
128
129 if (const FileAction *action = info.GetFileActionForFD(STDERR_FILENO))
130 log->Printf("%s setting STDERR to '%s'", __FUNCTION__,
131 action->GetFileSpec().GetCString());
132 else
133 log->Printf("%s leaving STDERR as is", __FUNCTION__);
134
135 int i = 0;
136 for (const char **args = info.GetArguments().GetConstArgumentVector(); *args;
137 ++args, ++i)
138 log->Printf("%s arg %d: \"%s\"", __FUNCTION__, i,
139 *args ? *args : "nullptr");
Pavel Labath4abe5d62016-07-15 10:18:15 +0000140}
Todd Fialaaf245d12014-06-30 21:05:18 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142void DisplayBytes(StreamString &s, void *bytes, uint32_t count) {
143 uint8_t *ptr = (uint8_t *)bytes;
144 const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count);
145 for (uint32_t i = 0; i < loop_count; i++) {
146 s.Printf("[%x]", *ptr);
147 ptr++;
148 }
149}
Todd Fialaaf245d12014-06-30 21:05:18 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151void PtraceDisplayBytes(int &req, void *data, size_t data_size) {
152 StreamString buf;
153 Log *verbose_log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(
154 POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE));
155
156 if (verbose_log) {
157 switch (req) {
158 case PTRACE_POKETEXT: {
159 DisplayBytes(buf, &data, 8);
160 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData());
161 break;
Todd Fialaaf245d12014-06-30 21:05:18 +0000162 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000163 case PTRACE_POKEDATA: {
164 DisplayBytes(buf, &data, 8);
165 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData());
166 break;
167 }
168 case PTRACE_POKEUSER: {
169 DisplayBytes(buf, &data, 8);
170 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData());
171 break;
172 }
173 case PTRACE_SETREGS: {
174 DisplayBytes(buf, data, data_size);
175 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData());
176 break;
177 }
178 case PTRACE_SETFPREGS: {
179 DisplayBytes(buf, data, data_size);
180 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData());
181 break;
182 }
183 case PTRACE_SETSIGINFO: {
184 DisplayBytes(buf, data, sizeof(siginfo_t));
185 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData());
186 break;
187 }
188 case PTRACE_SETREGSET: {
189 // Extract iov_base from data, which is a pointer to the struct IOVEC
190 DisplayBytes(buf, *(void **)data, data_size);
191 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData());
192 break;
193 }
194 default: {}
195 }
196 }
197}
Todd Fialaaf245d12014-06-30 21:05:18 +0000198
Kate Stoneb9c1b512016-09-06 20:57:50 +0000199static constexpr unsigned k_ptrace_word_size = sizeof(void *);
200static_assert(sizeof(long) >= k_ptrace_word_size,
201 "Size of long must be larger than ptrace word size");
Pavel Labath1107b5a2015-04-17 14:07:49 +0000202} // end of anonymous namespace
203
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000204// Simple helper function to ensure flags are enabled on the given file
205// descriptor.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000206static Error EnsureFDFlags(int fd, int flags) {
207 Error error;
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209 int status = fcntl(fd, F_GETFL);
210 if (status == -1) {
211 error.SetErrorToErrno();
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000212 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000213 }
214
215 if (fcntl(fd, F_SETFL, status | flags) == -1) {
216 error.SetErrorToErrno();
217 return error;
218 }
219
220 return error;
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000221}
222
Todd Fialaaf245d12014-06-30 21:05:18 +0000223// -----------------------------------------------------------------------------
224// Public Static Methods
225// -----------------------------------------------------------------------------
226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227Error NativeProcessProtocol::Launch(
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000228 ProcessLaunchInfo &launch_info,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229 NativeProcessProtocol::NativeDelegate &native_delegate, MainLoop &mainloop,
230 NativeProcessProtocolSP &native_process_sp) {
231 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Todd Fialaaf245d12014-06-30 21:05:18 +0000232
Kate Stoneb9c1b512016-09-06 20:57:50 +0000233 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000234
Kate Stoneb9c1b512016-09-06 20:57:50 +0000235 // Verify the working directory is valid if one was specified.
236 FileSpec working_dir{launch_info.GetWorkingDirectory()};
237 if (working_dir &&
238 (!working_dir.ResolvePath() ||
239 working_dir.GetFileType() != FileSpec::eFileTypeDirectory)) {
240 error.SetErrorStringWithFormat("No such file or directory: %s",
241 working_dir.GetCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000242 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000243 }
244
245 // Create the NativeProcessLinux in launch mode.
246 native_process_sp.reset(new NativeProcessLinux());
247
248 if (!native_process_sp->RegisterNativeDelegate(native_delegate)) {
249 native_process_sp.reset();
250 error.SetErrorStringWithFormat("failed to register the native delegate");
251 return error;
252 }
253
254 error = std::static_pointer_cast<NativeProcessLinux>(native_process_sp)
255 ->LaunchInferior(mainloop, launch_info);
256
257 if (error.Fail()) {
258 native_process_sp.reset();
259 if (log)
260 log->Printf("NativeProcessLinux::%s failed to launch process: %s",
261 __FUNCTION__, error.AsCString());
262 return error;
263 }
264
265 launch_info.SetProcessID(native_process_sp->GetID());
266
267 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000268}
269
Kate Stoneb9c1b512016-09-06 20:57:50 +0000270Error NativeProcessProtocol::Attach(
271 lldb::pid_t pid, NativeProcessProtocol::NativeDelegate &native_delegate,
272 MainLoop &mainloop, NativeProcessProtocolSP &native_process_sp) {
273 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
274 if (log && log->GetMask().Test(POSIX_LOG_VERBOSE))
275 log->Printf("NativeProcessLinux::%s(pid = %" PRIi64 ")", __FUNCTION__, pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000276
Kate Stoneb9c1b512016-09-06 20:57:50 +0000277 // Retrieve the architecture for the running process.
278 ArchSpec process_arch;
279 Error error = ResolveProcessArchitecture(pid, process_arch);
280 if (!error.Success())
Todd Fialaaf245d12014-06-30 21:05:18 +0000281 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000282
283 std::shared_ptr<NativeProcessLinux> native_process_linux_sp(
284 new NativeProcessLinux());
285
286 if (!native_process_linux_sp->RegisterNativeDelegate(native_delegate)) {
287 error.SetErrorStringWithFormat("failed to register the native delegate");
288 return error;
289 }
290
291 native_process_linux_sp->AttachToInferior(mainloop, pid, error);
292 if (!error.Success())
293 return error;
294
295 native_process_sp = native_process_linux_sp;
296 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000297}
298
299// -----------------------------------------------------------------------------
300// Public Instance Methods
301// -----------------------------------------------------------------------------
302
Kate Stoneb9c1b512016-09-06 20:57:50 +0000303NativeProcessLinux::NativeProcessLinux()
304 : NativeProcessProtocol(LLDB_INVALID_PROCESS_ID), m_arch(),
305 m_supports_mem_region(eLazyBoolCalculate), m_mem_region_cache(),
306 m_pending_notification_tid(LLDB_INVALID_THREAD_ID) {}
307
308void NativeProcessLinux::AttachToInferior(MainLoop &mainloop, lldb::pid_t pid,
309 Error &error) {
310 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
311 if (log)
312 log->Printf("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__,
313 pid);
314
315 m_sigchld_handle = mainloop.RegisterSignal(
316 SIGCHLD, [this](MainLoopBase &) { SigchldHandler(); }, error);
317 if (!m_sigchld_handle)
318 return;
319
320 error = ResolveProcessArchitecture(pid, m_arch);
321 if (!error.Success())
322 return;
323
324 // Set the architecture to the exe architecture.
325 if (log)
326 log->Printf("NativeProcessLinux::%s (pid = %" PRIi64
327 ") detected architecture %s",
328 __FUNCTION__, pid, m_arch.GetArchitectureName());
329
330 m_pid = pid;
331 SetState(eStateAttaching);
332
333 Attach(pid, error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000334}
335
Kate Stoneb9c1b512016-09-06 20:57:50 +0000336Error NativeProcessLinux::LaunchInferior(MainLoop &mainloop,
337 ProcessLaunchInfo &launch_info) {
338 Error error;
339 m_sigchld_handle = mainloop.RegisterSignal(
340 SIGCHLD, [this](MainLoopBase &) { SigchldHandler(); }, error);
341 if (!m_sigchld_handle)
342 return error;
343
344 SetState(eStateLaunching);
345
346 MaybeLogLaunchInfo(launch_info);
347
348 ::pid_t pid =
349 ProcessLauncherLinux().LaunchProcess(launch_info, error).GetProcessId();
350 if (error.Fail())
351 return error;
352
353 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
354
355 // Wait for the child process to trap on its call to execve.
356 ::pid_t wpid;
357 int status;
358 if ((wpid = waitpid(pid, &status, 0)) < 0) {
359 error.SetErrorToErrno();
Todd Fialaaf245d12014-06-30 21:05:18 +0000360 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000361 log->Printf("NativeProcessLinux::%s waitpid for inferior failed with %s",
362 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000363
Kate Stoneb9c1b512016-09-06 20:57:50 +0000364 // Mark the inferior as invalid.
365 // FIXME this could really use a new state - eStateLaunchFailure. For now,
366 // using eStateInvalid.
367 SetState(StateType::eStateInvalid);
Pavel Labath19cbe962015-07-21 13:20:32 +0000368
Kate Stoneb9c1b512016-09-06 20:57:50 +0000369 return error;
370 }
371 assert(WIFSTOPPED(status) && (wpid == static_cast<::pid_t>(pid)) &&
372 "Could not sync with inferior process.");
Todd Fialaaf245d12014-06-30 21:05:18 +0000373
Kate Stoneb9c1b512016-09-06 20:57:50 +0000374 if (log)
375 log->Printf("NativeProcessLinux::%s inferior started, now in stopped state",
376 __FUNCTION__);
377
378 error = SetDefaultPtraceOpts(pid);
379 if (error.Fail()) {
Todd Fialaaf245d12014-06-30 21:05:18 +0000380 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000381 log->Printf("NativeProcessLinux::%s inferior failed to set default "
382 "ptrace options: %s",
383 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000384
Kate Stoneb9c1b512016-09-06 20:57:50 +0000385 // Mark the inferior as invalid.
386 // FIXME this could really use a new state - eStateLaunchFailure. For now,
387 // using eStateInvalid.
388 SetState(StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000389
Kate Stoneb9c1b512016-09-06 20:57:50 +0000390 return error;
391 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000392
Kate Stoneb9c1b512016-09-06 20:57:50 +0000393 // Release the master terminal descriptor and pass it off to the
394 // NativeProcessLinux instance. Similarly stash the inferior pid.
395 m_terminal_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
396 m_pid = pid;
397 launch_info.SetProcessID(pid);
Pavel Labath4abe5d62016-07-15 10:18:15 +0000398
Kate Stoneb9c1b512016-09-06 20:57:50 +0000399 if (m_terminal_fd != -1) {
400 error = EnsureFDFlags(m_terminal_fd, O_NONBLOCK);
401 if (error.Fail()) {
402 if (log)
403 log->Printf("NativeProcessLinux::%s inferior EnsureFDFlags failed for "
404 "ensuring terminal O_NONBLOCK setting: %s",
Pavel Labath5ad891f2016-07-21 14:54:03 +0000405 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000406
Kate Stoneb9c1b512016-09-06 20:57:50 +0000407 // Mark the inferior as invalid.
408 // FIXME this could really use a new state - eStateLaunchFailure. For
409 // now, using eStateInvalid.
410 SetState(StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000411
Kate Stoneb9c1b512016-09-06 20:57:50 +0000412 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000413 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000414 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000415
Kate Stoneb9c1b512016-09-06 20:57:50 +0000416 if (log)
417 log->Printf("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__,
418 uint64_t(pid));
Todd Fialaaf245d12014-06-30 21:05:18 +0000419
Kate Stoneb9c1b512016-09-06 20:57:50 +0000420 ResolveProcessArchitecture(m_pid, m_arch);
421 NativeThreadLinuxSP thread_sp = AddThread(pid);
422 assert(thread_sp && "AddThread() returned a nullptr thread");
423 thread_sp->SetStoppedBySignal(SIGSTOP);
424 ThreadWasCreated(*thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +0000425
Kate Stoneb9c1b512016-09-06 20:57:50 +0000426 // Let our process instance know the thread has stopped.
427 SetCurrentThreadID(thread_sp->GetID());
428 SetState(StateType::eStateStopped);
429
430 if (log) {
431 if (error.Success())
432 log->Printf("NativeProcessLinux::%s inferior launching succeeded",
433 __FUNCTION__);
434 else
435 log->Printf("NativeProcessLinux::%s inferior launching failed: %s",
436 __FUNCTION__, error.AsCString());
437 }
438 return error;
439}
440
441::pid_t NativeProcessLinux::Attach(lldb::pid_t pid, Error &error) {
442 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
443
444 // Use a map to keep track of the threads which we have attached/need to
445 // attach.
446 Host::TidMap tids_to_attach;
447 if (pid <= 1) {
448 error.SetErrorToGenericError();
449 error.SetErrorString("Attaching to process 1 is not allowed.");
450 return -1;
451 }
452
453 while (Host::FindProcessThreads(pid, tids_to_attach)) {
454 for (Host::TidMap::iterator it = tids_to_attach.begin();
455 it != tids_to_attach.end();) {
456 if (it->second == false) {
457 lldb::tid_t tid = it->first;
458
459 // Attach to the requested process.
460 // An attach will cause the thread to stop with a SIGSTOP.
461 error = PtraceWrapper(PTRACE_ATTACH, tid);
462 if (error.Fail()) {
463 // No such thread. The thread may have exited.
464 // More error handling may be needed.
465 if (error.GetError() == ESRCH) {
466 it = tids_to_attach.erase(it);
467 continue;
468 } else
469 return -1;
470 }
471
472 int status;
473 // Need to use __WALL otherwise we receive an error with errno=ECHLD
474 // At this point we should have a thread stopped if waitpid succeeds.
475 if ((status = waitpid(tid, NULL, __WALL)) < 0) {
476 // No such thread. The thread may have exited.
477 // More error handling may be needed.
478 if (errno == ESRCH) {
479 it = tids_to_attach.erase(it);
480 continue;
481 } else {
482 error.SetErrorToErrno();
483 return -1;
484 }
485 }
486
487 error = SetDefaultPtraceOpts(tid);
488 if (error.Fail())
489 return -1;
490
491 if (log)
492 log->Printf("NativeProcessLinux::%s() adding tid = %" PRIu64,
493 __FUNCTION__, tid);
494
495 it->second = true;
496
497 // Create the thread, mark it as stopped.
498 NativeThreadLinuxSP thread_sp(AddThread(static_cast<lldb::tid_t>(tid)));
499 assert(thread_sp && "AddThread() returned a nullptr");
500
501 // This will notify this is a new thread and tell the system it is
502 // stopped.
503 thread_sp->SetStoppedBySignal(SIGSTOP);
504 ThreadWasCreated(*thread_sp);
505 SetCurrentThreadID(thread_sp->GetID());
506 }
507
508 // move the loop forward
509 ++it;
510 }
511 }
512
513 if (tids_to_attach.size() > 0) {
514 m_pid = pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000515 // Let our process instance know the thread has stopped.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000516 SetState(StateType::eStateStopped);
517 } else {
518 error.SetErrorToGenericError();
519 error.SetErrorString("No such process.");
520 return -1;
521 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000522
Kate Stoneb9c1b512016-09-06 20:57:50 +0000523 return pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000524}
525
Kate Stoneb9c1b512016-09-06 20:57:50 +0000526Error NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid) {
527 long ptrace_opts = 0;
Todd Fialaaf245d12014-06-30 21:05:18 +0000528
Kate Stoneb9c1b512016-09-06 20:57:50 +0000529 // Have the child raise an event on exit. This is used to keep the child in
530 // limbo until it is destroyed.
531 ptrace_opts |= PTRACE_O_TRACEEXIT;
Todd Fialaaf245d12014-06-30 21:05:18 +0000532
Kate Stoneb9c1b512016-09-06 20:57:50 +0000533 // Have the tracer trace threads which spawn in the inferior process.
534 // TODO: if we want to support tracing the inferiors' child, add the
535 // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK)
536 ptrace_opts |= PTRACE_O_TRACECLONE;
Todd Fialaaf245d12014-06-30 21:05:18 +0000537
Kate Stoneb9c1b512016-09-06 20:57:50 +0000538 // Have the tracer notify us before execve returns
539 // (needed to disable legacy SIGTRAP generation)
540 ptrace_opts |= PTRACE_O_TRACEEXEC;
Todd Fialaaf245d12014-06-30 21:05:18 +0000541
Kate Stoneb9c1b512016-09-06 20:57:50 +0000542 return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void *)ptrace_opts);
Todd Fialaaf245d12014-06-30 21:05:18 +0000543}
544
Kate Stoneb9c1b512016-09-06 20:57:50 +0000545static ExitType convert_pid_status_to_exit_type(int status) {
546 if (WIFEXITED(status))
547 return ExitType::eExitTypeExit;
548 else if (WIFSIGNALED(status))
549 return ExitType::eExitTypeSignal;
550 else if (WIFSTOPPED(status))
551 return ExitType::eExitTypeStop;
552 else {
553 // We don't know what this is.
554 return ExitType::eExitTypeInvalid;
555 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000556}
557
Kate Stoneb9c1b512016-09-06 20:57:50 +0000558static int convert_pid_status_to_return_code(int status) {
559 if (WIFEXITED(status))
560 return WEXITSTATUS(status);
561 else if (WIFSIGNALED(status))
562 return WTERMSIG(status);
563 else if (WIFSTOPPED(status))
564 return WSTOPSIG(status);
565 else {
566 // We don't know what this is.
567 return ExitType::eExitTypeInvalid;
568 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000569}
570
Pavel Labath1107b5a2015-04-17 14:07:49 +0000571// Handles all waitpid events from the inferior process.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000572void NativeProcessLinux::MonitorCallback(lldb::pid_t pid, bool exited,
573 int signal, int status) {
574 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS));
Todd Fialaaf245d12014-06-30 21:05:18 +0000575
Kate Stoneb9c1b512016-09-06 20:57:50 +0000576 // Certain activities differ based on whether the pid is the tid of the main
577 // thread.
578 const bool is_main_thread = (pid == GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +0000579
Kate Stoneb9c1b512016-09-06 20:57:50 +0000580 // Handle when the thread exits.
581 if (exited) {
582 if (log)
583 log->Printf(
584 "NativeProcessLinux::%s() got exit signal(%d) , tid = %" PRIu64
585 " (%s main thread)",
586 __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not");
587
588 // This is a thread that exited. Ensure we're not tracking it anymore.
589 const bool thread_found = StopTrackingThread(pid);
590
591 if (is_main_thread) {
592 // We only set the exit status and notify the delegate if we haven't
593 // already set the process
594 // state to an exited state. We normally should have received a SIGTRAP |
595 // (PTRACE_EVENT_EXIT << 8)
596 // for the main thread.
597 const bool already_notified = (GetState() == StateType::eStateExited) ||
598 (GetState() == StateType::eStateCrashed);
599 if (!already_notified) {
Todd Fialaaf245d12014-06-30 21:05:18 +0000600 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000601 log->Printf("NativeProcessLinux::%s() tid = %" PRIu64
602 " handling main thread exit (%s), expected exit state "
603 "already set but state was %s instead, setting exit "
604 "state now",
605 __FUNCTION__, pid,
606 thread_found ? "stopped tracking thread metadata"
607 : "thread metadata not found",
608 StateAsCString(GetState()));
609 // The main thread exited. We're done monitoring. Report to delegate.
610 SetExitStatus(convert_pid_status_to_exit_type(status),
611 convert_pid_status_to_return_code(status), nullptr, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000612
Kate Stoneb9c1b512016-09-06 20:57:50 +0000613 // Notify delegate that our process has exited.
614 SetState(StateType::eStateExited, true);
615 } else {
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000616 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000617 log->Printf("NativeProcessLinux::%s() tid = %" PRIu64
618 " main thread now exited (%s)",
619 __FUNCTION__, pid,
620 thread_found ? "stopped tracking thread metadata"
621 : "thread metadata not found");
622 }
623 } else {
624 // Do we want to report to the delegate in this case? I think not. If
625 // this was an orderly
626 // thread exit, we would already have received the SIGTRAP |
627 // (PTRACE_EVENT_EXIT << 8) signal,
628 // and we would have done an all-stop then.
629 if (log)
630 log->Printf("NativeProcessLinux::%s() tid = %" PRIu64
631 " handling non-main thread exit (%s)",
632 __FUNCTION__, pid,
633 thread_found ? "stopped tracking thread metadata"
634 : "thread metadata not found");
635 }
636 return;
637 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000638
Kate Stoneb9c1b512016-09-06 20:57:50 +0000639 siginfo_t info;
640 const auto info_err = GetSignalInfo(pid, &info);
641 auto thread_sp = GetThreadByID(pid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000642
Kate Stoneb9c1b512016-09-06 20:57:50 +0000643 if (!thread_sp) {
644 // Normally, the only situation when we cannot find the thread is if we have
645 // just
646 // received a new thread notification. This is indicated by GetSignalInfo()
647 // returning
648 // si_code == SI_USER and si_pid == 0
649 if (log)
650 log->Printf("NativeProcessLinux::%s received notification about an "
651 "unknown tid %" PRIu64 ".",
652 __FUNCTION__, pid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000653
Kate Stoneb9c1b512016-09-06 20:57:50 +0000654 if (info_err.Fail()) {
655 if (log)
656 log->Printf("NativeProcessLinux::%s (tid %" PRIu64
657 ") GetSignalInfo failed (%s). Ingoring this notification.",
658 __FUNCTION__, pid, info_err.AsCString());
659 return;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000660 }
661
Kate Stoneb9c1b512016-09-06 20:57:50 +0000662 if (log && (info.si_code != SI_USER || info.si_pid != 0))
663 log->Printf("NativeProcessLinux::%s (tid %" PRIu64
664 ") unexpected signal info (si_code: %d, si_pid: %d). "
665 "Treating as a new thread notification anyway.",
666 __FUNCTION__, pid, info.si_code, info.si_pid);
667
668 auto thread_sp = AddThread(pid);
669 // Resume the newly created thread.
670 ResumeThread(*thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
671 ThreadWasCreated(*thread_sp);
672 return;
673 }
674
675 // Get details on the signal raised.
676 if (info_err.Success()) {
677 // We have retrieved the signal info. Dispatch appropriately.
678 if (info.si_signo == SIGTRAP)
679 MonitorSIGTRAP(info, *thread_sp);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000680 else
Kate Stoneb9c1b512016-09-06 20:57:50 +0000681 MonitorSignal(info, *thread_sp, exited);
682 } else {
683 if (info_err.GetError() == EINVAL) {
684 // This is a group stop reception for this tid.
685 // We can reach here if we reinject SIGSTOP, SIGSTP, SIGTTIN or SIGTTOU
686 // into the
687 // tracee, triggering the group-stop mechanism. Normally receiving these
688 // would stop
689 // the process, pending a SIGCONT. Simulating this state in a debugger is
690 // hard and is
691 // generally not needed (one use case is debugging background task being
692 // managed by a
693 // shell). For general use, it is sufficient to stop the process in a
694 // signal-delivery
695 // stop which happens before the group stop. This done by MonitorSignal
696 // and works
697 // correctly for all signals.
698 if (log)
699 log->Printf(
700 "NativeProcessLinux::%s received a group stop for pid %" PRIu64
701 " tid %" PRIu64 ". Transparent handling of group stops not "
702 "supported, resuming the thread.",
703 __FUNCTION__, GetID(), pid);
704 ResumeThread(*thread_sp, thread_sp->GetState(),
705 LLDB_INVALID_SIGNAL_NUMBER);
706 } else {
707 // ptrace(GETSIGINFO) failed (but not due to group-stop).
Todd Fialaaf245d12014-06-30 21:05:18 +0000708
Kate Stoneb9c1b512016-09-06 20:57:50 +0000709 // A return value of ESRCH means the thread/process is no longer on the
710 // system,
711 // so it was killed somehow outside of our control. Either way, we can't
712 // do anything
713 // with it anymore.
Todd Fialaaf245d12014-06-30 21:05:18 +0000714
Kate Stoneb9c1b512016-09-06 20:57:50 +0000715 // Stop tracking the metadata for the thread since it's entirely off the
716 // system now.
717 const bool thread_found = StopTrackingThread(pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000718
Kate Stoneb9c1b512016-09-06 20:57:50 +0000719 if (log)
720 log->Printf(
721 "NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64
722 ", signal = %d, status = %d (%s, %s, %s)",
723 __FUNCTION__, info_err.AsCString(), pid, signal, status,
724 info_err.GetError() == ESRCH ? "thread/process killed"
725 : "unknown reason",
726 is_main_thread ? "is main thread" : "is not main thread",
727 thread_found ? "thread metadata removed"
728 : "thread metadata not found");
Todd Fialaaf245d12014-06-30 21:05:18 +0000729
Kate Stoneb9c1b512016-09-06 20:57:50 +0000730 if (is_main_thread) {
731 // Notify the delegate - our process is not available but appears to
732 // have been killed outside
733 // our control. Is eStateExited the right exit state in this case?
734 SetExitStatus(convert_pid_status_to_exit_type(status),
735 convert_pid_status_to_return_code(status), nullptr, true);
736 SetState(StateType::eStateExited, true);
737 } else {
738 // This thread was pulled out from underneath us. Anything to do here?
739 // Do we want to do an all stop?
740 if (log)
741 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64
742 " non-main thread exit occurred, didn't tell delegate "
743 "anything since thread disappeared out from underneath "
744 "us",
745 __FUNCTION__, GetID(), pid);
746 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000747 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000748 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000749}
750
Kate Stoneb9c1b512016-09-06 20:57:50 +0000751void NativeProcessLinux::WaitForNewThread(::pid_t tid) {
752 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Pavel Labath426bdf82015-04-28 07:51:52 +0000753
Kate Stoneb9c1b512016-09-06 20:57:50 +0000754 NativeThreadLinuxSP new_thread_sp = GetThreadByID(tid);
Pavel Labath426bdf82015-04-28 07:51:52 +0000755
Kate Stoneb9c1b512016-09-06 20:57:50 +0000756 if (new_thread_sp) {
757 // We are already tracking the thread - we got the event on the new thread
758 // (see
759 // MonitorSignal) before this one. We are done.
760 return;
761 }
Pavel Labath426bdf82015-04-28 07:51:52 +0000762
Kate Stoneb9c1b512016-09-06 20:57:50 +0000763 // The thread is not tracked yet, let's wait for it to appear.
764 int status = -1;
765 ::pid_t wait_pid;
766 do {
Pavel Labath426bdf82015-04-28 07:51:52 +0000767 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000768 log->Printf("NativeProcessLinux::%s() received thread creation event for "
769 "tid %" PRIu32
770 ". tid not tracked yet, waiting for thread to appear...",
771 __FUNCTION__, tid);
772 wait_pid = waitpid(tid, &status, __WALL);
773 } while (wait_pid == -1 && errno == EINTR);
774 // Since we are waiting on a specific tid, this must be the creation event.
775 // But let's do
776 // some checks just in case.
777 if (wait_pid != tid) {
778 if (log)
779 log->Printf(
780 "NativeProcessLinux::%s() waiting for tid %" PRIu32
781 " failed. Assuming the thread has disappeared in the meantime",
782 __FUNCTION__, tid);
783 // The only way I know of this could happen is if the whole process was
784 // SIGKILLed in the mean time. In any case, we can't do anything about that
785 // now.
786 return;
787 }
788 if (WIFEXITED(status)) {
789 if (log)
790 log->Printf("NativeProcessLinux::%s() waiting for tid %" PRIu32
791 " returned an 'exited' event. Not tracking the thread.",
792 __FUNCTION__, tid);
793 // Also a very improbable event.
794 return;
795 }
Pavel Labath426bdf82015-04-28 07:51:52 +0000796
Kate Stoneb9c1b512016-09-06 20:57:50 +0000797 siginfo_t info;
798 Error error = GetSignalInfo(tid, &info);
799 if (error.Fail()) {
800 if (log)
801 log->Printf(
802 "NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32
803 " failed. Assuming the thread has disappeared in the meantime.",
804 __FUNCTION__, tid);
805 return;
806 }
807
808 if (((info.si_pid != 0) || (info.si_code != SI_USER)) && log) {
809 // We should be getting a thread creation signal here, but we received
810 // something
811 // else. There isn't much we can do about it now, so we will just log that.
812 // Since the
813 // thread is alive and we are receiving events from it, we shall pretend
814 // that it was
815 // created properly.
816 log->Printf("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32
817 " received unexpected signal with code %d from pid %d.",
818 __FUNCTION__, tid, info.si_code, info.si_pid);
819 }
820
821 if (log)
822 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64
823 ": tracking new thread tid %" PRIu32,
824 __FUNCTION__, GetID(), tid);
825
826 new_thread_sp = AddThread(tid);
827 ResumeThread(*new_thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
828 ThreadWasCreated(*new_thread_sp);
Pavel Labath426bdf82015-04-28 07:51:52 +0000829}
830
Kate Stoneb9c1b512016-09-06 20:57:50 +0000831void NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info,
832 NativeThreadLinux &thread) {
833 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
834 const bool is_main_thread = (thread.GetID() == GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +0000835
Kate Stoneb9c1b512016-09-06 20:57:50 +0000836 assert(info.si_signo == SIGTRAP && "Unexpected child signal!");
Todd Fialaaf245d12014-06-30 21:05:18 +0000837
Kate Stoneb9c1b512016-09-06 20:57:50 +0000838 switch (info.si_code) {
839 // TODO: these two cases are required if we want to support tracing of the
840 // inferiors' children. We'd need this to debug a monitor.
841 // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):
842 // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):
Todd Fialaaf245d12014-06-30 21:05:18 +0000843
Kate Stoneb9c1b512016-09-06 20:57:50 +0000844 case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): {
845 // This is the notification on the parent thread which informs us of new
846 // thread
847 // creation.
848 // We don't want to do anything with the parent thread so we just resume it.
849 // In case we
850 // want to implement "break on thread creation" functionality, we would need
851 // to stop
852 // here.
Todd Fialaaf245d12014-06-30 21:05:18 +0000853
Kate Stoneb9c1b512016-09-06 20:57:50 +0000854 unsigned long event_message = 0;
855 if (GetEventMessage(thread.GetID(), &event_message).Fail()) {
856 if (log)
857 log->Printf("NativeProcessLinux::%s() pid %" PRIu64
858 " received thread creation event but GetEventMessage "
859 "failed so we don't know the new tid",
860 __FUNCTION__, thread.GetID());
861 } else
862 WaitForNewThread(event_message);
Todd Fialaaf245d12014-06-30 21:05:18 +0000863
Kate Stoneb9c1b512016-09-06 20:57:50 +0000864 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
865 break;
866 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000867
Kate Stoneb9c1b512016-09-06 20:57:50 +0000868 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)): {
869 NativeThreadLinuxSP main_thread_sp;
870 if (log)
871 log->Printf("NativeProcessLinux::%s() received exec event, code = %d",
872 __FUNCTION__, info.si_code ^ SIGTRAP);
873
874 // Exec clears any pending notifications.
875 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
876
877 // Remove all but the main thread here. Linux fork creates a new process
878 // which only copies the main thread.
879 if (log)
880 log->Printf("NativeProcessLinux::%s exec received, stop tracking all but "
881 "main thread",
882 __FUNCTION__);
883
884 for (auto thread_sp : m_threads) {
885 const bool is_main_thread = thread_sp && thread_sp->GetID() == GetID();
886 if (is_main_thread) {
887 main_thread_sp = std::static_pointer_cast<NativeThreadLinux>(thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +0000888 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000889 log->Printf(
890 "NativeProcessLinux::%s found main thread with tid %" PRIu64
891 ", keeping",
892 __FUNCTION__, main_thread_sp->GetID());
893 } else {
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000894 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000895 log->Printf(
896 "NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64
897 " due to exec",
898 __FUNCTION__, thread_sp->GetID());
899 }
Todd Fialaa9882ce2014-08-28 15:46:54 +0000900 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000901
Kate Stoneb9c1b512016-09-06 20:57:50 +0000902 m_threads.clear();
Chaoren Linfa03ad22015-02-03 01:50:42 +0000903
Kate Stoneb9c1b512016-09-06 20:57:50 +0000904 if (main_thread_sp) {
905 m_threads.push_back(main_thread_sp);
906 SetCurrentThreadID(main_thread_sp->GetID());
907 main_thread_sp->SetStoppedByExec();
908 } else {
909 SetCurrentThreadID(LLDB_INVALID_THREAD_ID);
910 if (log)
911 log->Printf("NativeProcessLinux::%s pid %" PRIu64
912 "no main thread found, discarded all threads, we're in a "
913 "no-thread state!",
914 __FUNCTION__, GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +0000915 }
916
Kate Stoneb9c1b512016-09-06 20:57:50 +0000917 // Tell coordinator about about the "new" (since exec) stopped main thread.
918 ThreadWasCreated(*main_thread_sp);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000919
Kate Stoneb9c1b512016-09-06 20:57:50 +0000920 // Let our delegate know we have just exec'd.
921 NotifyDidExec();
922
923 // If we have a main thread, indicate we are stopped.
924 assert(main_thread_sp && "exec called during ptraced process but no main "
925 "thread metadata tracked");
926
927 // Let the process know we're stopped.
928 StopRunningThreads(main_thread_sp->GetID());
929
930 break;
931 }
932
933 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): {
934 // The inferior process or one of its threads is about to exit.
935 // We don't want to do anything with the thread so we just resume it. In
936 // case we
937 // want to implement "break on thread exit" functionality, we would need to
938 // stop
939 // here.
940
941 unsigned long data = 0;
942 if (GetEventMessage(thread.GetID(), &data).Fail())
943 data = -1;
944
945 if (log) {
946 log->Printf("NativeProcessLinux::%s() received PTRACE_EVENT_EXIT, data = "
947 "%lx (WIFEXITED=%s,WIFSIGNALED=%s), pid = %" PRIu64 " (%s)",
948 __FUNCTION__, data, WIFEXITED(data) ? "true" : "false",
949 WIFSIGNALED(data) ? "true" : "false", thread.GetID(),
950 is_main_thread ? "is main thread" : "not main thread");
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000951 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000952
Kate Stoneb9c1b512016-09-06 20:57:50 +0000953 if (is_main_thread) {
954 SetExitStatus(convert_pid_status_to_exit_type(data),
955 convert_pid_status_to_return_code(data), nullptr, true);
956 }
957
958 StateType state = thread.GetState();
959 if (!StateIsRunningState(state)) {
960 // Due to a kernel bug, we may sometimes get this stop after the inferior
961 // gets a
962 // SIGKILL. This confuses our state tracking logic in ResumeThread(),
963 // since normally,
964 // we should not be receiving any ptrace events while the inferior is
965 // stopped. This
966 // makes sure that the inferior is resumed and exits normally.
967 state = eStateRunning;
968 }
969 ResumeThread(thread, state, LLDB_INVALID_SIGNAL_NUMBER);
970
971 break;
972 }
973
974 case 0:
975 case TRAP_TRACE: // We receive this on single stepping.
976 case TRAP_HWBKPT: // We receive this on watchpoint hit
977 {
978 // If a watchpoint was hit, report it
979 uint32_t wp_index;
980 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(
981 wp_index, (uintptr_t)info.si_addr);
982 if (error.Fail() && log)
983 log->Printf("NativeProcessLinux::%s() "
984 "received error while checking for watchpoint hits, "
985 "pid = %" PRIu64 " error = %s",
986 __FUNCTION__, thread.GetID(), error.AsCString());
987 if (wp_index != LLDB_INVALID_INDEX32) {
988 MonitorWatchpoint(thread, wp_index);
989 break;
990 }
991
992 // Otherwise, report step over
993 MonitorTrace(thread);
994 break;
995 }
996
997 case SI_KERNEL:
Mohit K. Bhakkad35799962015-06-18 04:53:18 +0000998#if defined __mips__
Kate Stoneb9c1b512016-09-06 20:57:50 +0000999 // For mips there is no special signal for watchpoint
1000 // So we check for watchpoint in kernel trap
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001001 {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001002 // If a watchpoint was hit, report it
1003 uint32_t wp_index;
1004 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(
1005 wp_index, LLDB_INVALID_ADDRESS);
1006 if (error.Fail() && log)
1007 log->Printf("NativeProcessLinux::%s() "
1008 "received error while checking for watchpoint hits, "
1009 "pid = %" PRIu64 " error = %s",
1010 __FUNCTION__, thread.GetID(), error.AsCString());
1011 if (wp_index != LLDB_INVALID_INDEX32) {
1012 MonitorWatchpoint(thread, wp_index);
1013 break;
1014 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001015 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001016// NO BREAK
Mohit K. Bhakkad35799962015-06-18 04:53:18 +00001017#endif
Kate Stoneb9c1b512016-09-06 20:57:50 +00001018 case TRAP_BRKPT:
1019 MonitorBreakpoint(thread);
1020 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00001021
Kate Stoneb9c1b512016-09-06 20:57:50 +00001022 case SIGTRAP:
1023 case (SIGTRAP | 0x80):
1024 if (log)
1025 log->Printf("NativeProcessLinux::%s() received unknown SIGTRAP system "
1026 "call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming",
1027 __FUNCTION__, GetID(), thread.GetID());
Chaoren Linfa03ad22015-02-03 01:50:42 +00001028
Kate Stoneb9c1b512016-09-06 20:57:50 +00001029 // Ignore these signals until we know more about them.
1030 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
1031 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00001032
Kate Stoneb9c1b512016-09-06 20:57:50 +00001033 default:
1034 assert(false && "Unexpected SIGTRAP code!");
1035 if (log)
1036 log->Printf("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64
1037 " received unhandled SIGTRAP code: 0x%d",
1038 __FUNCTION__, GetID(), thread.GetID(), info.si_code);
1039 break;
1040 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001041}
1042
Kate Stoneb9c1b512016-09-06 20:57:50 +00001043void NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread) {
1044 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1045 if (log)
1046 log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64
1047 " (single stepping)",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001048 __FUNCTION__, thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001049
Kate Stoneb9c1b512016-09-06 20:57:50 +00001050 // This thread is currently stopped.
1051 thread.SetStoppedByTrace();
1052
1053 StopRunningThreads(thread.GetID());
1054}
1055
1056void NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread) {
1057 Log *log(
1058 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
1059 if (log)
1060 log->Printf(
1061 "NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64,
1062 __FUNCTION__, thread.GetID());
1063
1064 // Mark the thread as stopped at breakpoint.
1065 thread.SetStoppedByBreakpoint();
1066 Error error = FixupBreakpointPCAsNeeded(thread);
1067 if (error.Fail())
1068 if (log)
1069 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s",
1070 __FUNCTION__, thread.GetID(), error.AsCString());
1071
1072 if (m_threads_stepping_with_breakpoint.find(thread.GetID()) !=
1073 m_threads_stepping_with_breakpoint.end())
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001074 thread.SetStoppedByTrace();
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001075
Kate Stoneb9c1b512016-09-06 20:57:50 +00001076 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001077}
1078
Kate Stoneb9c1b512016-09-06 20:57:50 +00001079void NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread,
1080 uint32_t wp_index) {
1081 Log *log(
1082 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS));
1083 if (log)
1084 log->Printf("NativeProcessLinux::%s() received watchpoint event, "
1085 "pid = %" PRIu64 ", wp_index = %" PRIu32,
1086 __FUNCTION__, thread.GetID(), wp_index);
1087
1088 // Mark the thread as stopped at watchpoint.
1089 // The address is at (lldb::addr_t)info->si_addr if we need it.
1090 thread.SetStoppedByWatchpoint(wp_index);
1091
1092 // We need to tell all other running threads before we notify the delegate
1093 // about this stop.
1094 StopRunningThreads(thread.GetID());
1095}
1096
1097void NativeProcessLinux::MonitorSignal(const siginfo_t &info,
1098 NativeThreadLinux &thread, bool exited) {
1099 const int signo = info.si_signo;
1100 const bool is_from_llgs = info.si_pid == getpid();
1101
1102 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1103
1104 // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
1105 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
1106 // kill(2) or raise(3). Similarly for tgkill(2) on Linux.
1107 //
1108 // IOW, user generated signals never generate what we consider to be a
1109 // "crash".
1110 //
1111 // Similarly, ACK signals generated by this monitor.
1112
1113 // Handle the signal.
1114 if (info.si_code == SI_TKILL || info.si_code == SI_USER) {
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001115 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001116 log->Printf("NativeProcessLinux::%s() received signal %s (%d) with code "
1117 "%s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")",
1118 __FUNCTION__, Host::GetSignalAsCString(signo), signo,
1119 (info.si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"),
1120 info.si_pid, is_from_llgs ? "from llgs" : "not from llgs",
1121 thread.GetID());
1122 }
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001123
Kate Stoneb9c1b512016-09-06 20:57:50 +00001124 // Check for thread stop notification.
1125 if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP)) {
1126 // This is a tgkill()-based stop.
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001127 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001128 log->Printf("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64
1129 ", thread stopped",
1130 __FUNCTION__, GetID(), thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001131
Kate Stoneb9c1b512016-09-06 20:57:50 +00001132 // Check that we're not already marked with a stop reason.
1133 // Note this thread really shouldn't already be marked as stopped - if we
1134 // were, that would imply that
1135 // the kernel signaled us with the thread stopping which we handled and
1136 // marked as stopped,
1137 // and that, without an intervening resume, we received another stop. It is
1138 // more likely
1139 // that we are missing the marking of a run state somewhere if we find that
1140 // the thread was
1141 // marked as stopped.
1142 const StateType thread_state = thread.GetState();
1143 if (!StateIsStoppedState(thread_state, false)) {
1144 // An inferior thread has stopped because of a SIGSTOP we have sent it.
1145 // Generally, these are not important stops and we don't want to report
1146 // them as
1147 // they are just used to stop other threads when one thread (the one with
1148 // the
1149 // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in
1150 // the
1151 // case of an asynchronous Interrupt(), this *is* the real stop reason, so
1152 // we
1153 // leave the signal intact if this is the thread that was chosen as the
1154 // triggering thread.
1155 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID) {
1156 if (m_pending_notification_tid == thread.GetID())
1157 thread.SetStoppedBySignal(SIGSTOP, &info);
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001158 else
Kate Stoneb9c1b512016-09-06 20:57:50 +00001159 thread.SetStoppedWithNoReason();
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001160
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161 SetCurrentThreadID(thread.GetID());
1162 SignalIfAllThreadsStopped();
1163 } else {
1164 // We can end up here if stop was initiated by LLGS but by this time a
1165 // thread stop has occurred - maybe initiated by another event.
1166 Error error = ResumeThread(thread, thread.GetState(), 0);
1167 if (error.Fail() && log) {
1168 log->Printf(
1169 "NativeProcessLinux::%s failed to resume thread tid %" PRIu64
1170 ": %s",
1171 __FUNCTION__, thread.GetID(), error.AsCString());
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001172 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001173 }
1174 } else {
1175 if (log) {
1176 // Retrieve the signal name if the thread was stopped by a signal.
1177 int stop_signo = 0;
1178 const bool stopped_by_signal = thread.IsStopped(&stop_signo);
1179 const char *signal_name = stopped_by_signal
1180 ? Host::GetSignalAsCString(stop_signo)
1181 : "<not stopped by signal>";
1182 if (!signal_name)
1183 signal_name = "<no-signal-name>";
Todd Fiala58a2f662014-08-12 17:02:07 +00001184
Kate Stoneb9c1b512016-09-06 20:57:50 +00001185 log->Printf("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64
1186 ", thread was already marked as a stopped state (state=%s, "
1187 "signal=%d (%s)), leaving stop signal as is",
1188 __FUNCTION__, GetID(), thread.GetID(),
1189 StateAsCString(thread_state), stop_signo, signal_name);
1190 }
1191 SignalIfAllThreadsStopped();
Todd Fialaaf245d12014-06-30 21:05:18 +00001192 }
1193
Kate Stoneb9c1b512016-09-06 20:57:50 +00001194 // Done handling.
1195 return;
1196 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001197
Kate Stoneb9c1b512016-09-06 20:57:50 +00001198 if (log)
1199 log->Printf("NativeProcessLinux::%s() received signal %s", __FUNCTION__,
1200 Host::GetSignalAsCString(signo));
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001201
Kate Stoneb9c1b512016-09-06 20:57:50 +00001202 // This thread is stopped.
1203 thread.SetStoppedBySignal(signo, &info);
1204
1205 // Send a stop to the debugger after we get all other threads to stop.
1206 StopRunningThreads(thread.GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001207}
1208
Tamas Berghammere7708682015-04-22 10:00:23 +00001209namespace {
1210
Kate Stoneb9c1b512016-09-06 20:57:50 +00001211struct EmulatorBaton {
1212 NativeProcessLinux *m_process;
1213 NativeRegisterContext *m_reg_context;
Tamas Berghammere7708682015-04-22 10:00:23 +00001214
Kate Stoneb9c1b512016-09-06 20:57:50 +00001215 // eRegisterKindDWARF -> RegsiterValue
1216 std::unordered_map<uint32_t, RegisterValue> m_register_values;
Pavel Labath6648fcc2015-04-27 09:21:14 +00001217
Kate Stoneb9c1b512016-09-06 20:57:50 +00001218 EmulatorBaton(NativeProcessLinux *process, NativeRegisterContext *reg_context)
1219 : m_process(process), m_reg_context(reg_context) {}
Tamas Berghammere7708682015-04-22 10:00:23 +00001220};
1221
1222} // anonymous namespace
1223
Kate Stoneb9c1b512016-09-06 20:57:50 +00001224static size_t ReadMemoryCallback(EmulateInstruction *instruction, void *baton,
1225 const EmulateInstruction::Context &context,
1226 lldb::addr_t addr, void *dst, size_t length) {
1227 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton);
Tamas Berghammere7708682015-04-22 10:00:23 +00001228
Kate Stoneb9c1b512016-09-06 20:57:50 +00001229 size_t bytes_read;
1230 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read);
1231 return bytes_read;
Tamas Berghammere7708682015-04-22 10:00:23 +00001232}
1233
Kate Stoneb9c1b512016-09-06 20:57:50 +00001234static bool ReadRegisterCallback(EmulateInstruction *instruction, void *baton,
1235 const RegisterInfo *reg_info,
1236 RegisterValue &reg_value) {
1237 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton);
Tamas Berghammere7708682015-04-22 10:00:23 +00001238
Kate Stoneb9c1b512016-09-06 20:57:50 +00001239 auto it = emulator_baton->m_register_values.find(
1240 reg_info->kinds[eRegisterKindDWARF]);
1241 if (it != emulator_baton->m_register_values.end()) {
1242 reg_value = it->second;
1243 return true;
1244 }
1245
1246 // The emulator only fill in the dwarf regsiter numbers (and in some case
1247 // the generic register numbers). Get the full register info from the
1248 // register context based on the dwarf register numbers.
1249 const RegisterInfo *full_reg_info =
1250 emulator_baton->m_reg_context->GetRegisterInfo(
1251 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]);
1252
1253 Error error =
1254 emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value);
1255 if (error.Success())
1256 return true;
1257
1258 return false;
1259}
1260
1261static bool WriteRegisterCallback(EmulateInstruction *instruction, void *baton,
1262 const EmulateInstruction::Context &context,
1263 const RegisterInfo *reg_info,
1264 const RegisterValue &reg_value) {
1265 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton);
1266 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] =
1267 reg_value;
1268 return true;
1269}
1270
1271static size_t WriteMemoryCallback(EmulateInstruction *instruction, void *baton,
1272 const EmulateInstruction::Context &context,
1273 lldb::addr_t addr, const void *dst,
1274 size_t length) {
1275 return length;
1276}
1277
1278static lldb::addr_t ReadFlags(NativeRegisterContext *regsiter_context) {
1279 const RegisterInfo *flags_info = regsiter_context->GetRegisterInfo(
1280 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1281 return regsiter_context->ReadRegisterAsUnsigned(flags_info,
1282 LLDB_INVALID_ADDRESS);
1283}
1284
1285Error NativeProcessLinux::SetupSoftwareSingleStepping(
1286 NativeThreadLinux &thread) {
1287 Error error;
1288 NativeRegisterContextSP register_context_sp = thread.GetRegisterContext();
1289
1290 std::unique_ptr<EmulateInstruction> emulator_ap(
1291 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying,
1292 nullptr));
1293
1294 if (emulator_ap == nullptr)
1295 return Error("Instruction emulator not found!");
1296
1297 EmulatorBaton baton(this, register_context_sp.get());
1298 emulator_ap->SetBaton(&baton);
1299 emulator_ap->SetReadMemCallback(&ReadMemoryCallback);
1300 emulator_ap->SetReadRegCallback(&ReadRegisterCallback);
1301 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback);
1302 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback);
1303
1304 if (!emulator_ap->ReadInstruction())
1305 return Error("Read instruction failed!");
1306
1307 bool emulation_result =
1308 emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC);
1309
1310 const RegisterInfo *reg_info_pc = register_context_sp->GetRegisterInfo(
1311 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1312 const RegisterInfo *reg_info_flags = register_context_sp->GetRegisterInfo(
1313 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1314
1315 auto pc_it =
1316 baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]);
1317 auto flags_it =
1318 baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]);
1319
1320 lldb::addr_t next_pc;
1321 lldb::addr_t next_flags;
1322 if (emulation_result) {
1323 assert(pc_it != baton.m_register_values.end() &&
1324 "Emulation was successfull but PC wasn't updated");
1325 next_pc = pc_it->second.GetAsUInt64();
1326
1327 if (flags_it != baton.m_register_values.end())
1328 next_flags = flags_it->second.GetAsUInt64();
1329 else
1330 next_flags = ReadFlags(register_context_sp.get());
1331 } else if (pc_it == baton.m_register_values.end()) {
1332 // Emulate instruction failed and it haven't changed PC. Advance PC
1333 // with the size of the current opcode because the emulation of all
1334 // PC modifying instruction should be successful. The failure most
1335 // likely caused by a not supported instruction which don't modify PC.
1336 next_pc =
1337 register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize();
1338 next_flags = ReadFlags(register_context_sp.get());
1339 } else {
1340 // The instruction emulation failed after it modified the PC. It is an
1341 // unknown error where we can't continue because the next instruction is
1342 // modifying the PC but we don't know how.
1343 return Error("Instruction emulation failed unexpectedly.");
1344 }
1345
1346 if (m_arch.GetMachine() == llvm::Triple::arm) {
1347 if (next_flags & 0x20) {
1348 // Thumb mode
1349 error = SetSoftwareBreakpoint(next_pc, 2);
1350 } else {
1351 // Arm mode
1352 error = SetSoftwareBreakpoint(next_pc, 4);
Pavel Labath6648fcc2015-04-27 09:21:14 +00001353 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001354 } else if (m_arch.GetMachine() == llvm::Triple::mips64 ||
1355 m_arch.GetMachine() == llvm::Triple::mips64el ||
1356 m_arch.GetMachine() == llvm::Triple::mips ||
1357 m_arch.GetMachine() == llvm::Triple::mipsel)
1358 error = SetSoftwareBreakpoint(next_pc, 4);
1359 else {
1360 // No size hint is given for the next breakpoint
1361 error = SetSoftwareBreakpoint(next_pc, 0);
1362 }
Pavel Labath6648fcc2015-04-27 09:21:14 +00001363
Pavel Labath42eb6902016-10-26 11:13:56 +00001364 // If setting the breakpoint fails because next_pc is out of
1365 // the address space, ignore it and let the debugee segfault.
1366 if (error.GetError() == EIO || error.GetError() == EFAULT) {
1367 return Error();
1368 } else if (error.Fail())
Kate Stoneb9c1b512016-09-06 20:57:50 +00001369 return error;
Tamas Berghammere7708682015-04-22 10:00:23 +00001370
Kate Stoneb9c1b512016-09-06 20:57:50 +00001371 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc});
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001372
Kate Stoneb9c1b512016-09-06 20:57:50 +00001373 return Error();
1374}
1375
1376bool NativeProcessLinux::SupportHardwareSingleStepping() const {
1377 if (m_arch.GetMachine() == llvm::Triple::arm ||
1378 m_arch.GetMachine() == llvm::Triple::mips64 ||
1379 m_arch.GetMachine() == llvm::Triple::mips64el ||
1380 m_arch.GetMachine() == llvm::Triple::mips ||
1381 m_arch.GetMachine() == llvm::Triple::mipsel)
Pavel Labath6648fcc2015-04-27 09:21:14 +00001382 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001383 return true;
Tamas Berghammere7708682015-04-22 10:00:23 +00001384}
1385
Kate Stoneb9c1b512016-09-06 20:57:50 +00001386Error NativeProcessLinux::Resume(const ResumeActionList &resume_actions) {
1387 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD));
1388 if (log)
1389 log->Printf("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__,
1390 GetID());
Tamas Berghammere7708682015-04-22 10:00:23 +00001391
Kate Stoneb9c1b512016-09-06 20:57:50 +00001392 bool software_single_step = !SupportHardwareSingleStepping();
Tamas Berghammere7708682015-04-22 10:00:23 +00001393
Kate Stoneb9c1b512016-09-06 20:57:50 +00001394 if (software_single_step) {
1395 for (auto thread_sp : m_threads) {
1396 assert(thread_sp && "thread list should not contain NULL threads");
Tamas Berghammere7708682015-04-22 10:00:23 +00001397
Kate Stoneb9c1b512016-09-06 20:57:50 +00001398 const ResumeAction *const action =
1399 resume_actions.GetActionForThread(thread_sp->GetID(), true);
1400 if (action == nullptr)
1401 continue;
Tamas Berghammere7708682015-04-22 10:00:23 +00001402
Kate Stoneb9c1b512016-09-06 20:57:50 +00001403 if (action->state == eStateStepping) {
1404 Error error = SetupSoftwareSingleStepping(
1405 static_cast<NativeThreadLinux &>(*thread_sp));
1406 if (error.Fail())
1407 return error;
1408 }
Tamas Berghammere7708682015-04-22 10:00:23 +00001409 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001410 }
1411
1412 for (auto thread_sp : m_threads) {
1413 assert(thread_sp && "thread list should not contain NULL threads");
1414
1415 const ResumeAction *const action =
1416 resume_actions.GetActionForThread(thread_sp->GetID(), true);
1417
1418 if (action == nullptr) {
1419 if (log)
1420 log->Printf(
1421 "NativeProcessLinux::%s no action specified for pid %" PRIu64
1422 " tid %" PRIu64,
1423 __FUNCTION__, GetID(), thread_sp->GetID());
1424 continue;
Tamas Berghammere7708682015-04-22 10:00:23 +00001425 }
1426
Kate Stoneb9c1b512016-09-06 20:57:50 +00001427 if (log) {
1428 log->Printf("NativeProcessLinux::%s processing resume action state %s "
1429 "for pid %" PRIu64 " tid %" PRIu64,
1430 __FUNCTION__, StateAsCString(action->state), GetID(),
1431 thread_sp->GetID());
Tamas Berghammere7708682015-04-22 10:00:23 +00001432 }
1433
Kate Stoneb9c1b512016-09-06 20:57:50 +00001434 switch (action->state) {
1435 case eStateRunning:
1436 case eStateStepping: {
1437 // Run the thread, possibly feeding it the signal.
1438 const int signo = action->signal;
1439 ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state,
1440 signo);
1441 break;
1442 }
Tamas Berghammere7708682015-04-22 10:00:23 +00001443
Kate Stoneb9c1b512016-09-06 20:57:50 +00001444 case eStateSuspended:
1445 case eStateStopped:
1446 lldbassert(0 && "Unexpected state");
Tamas Berghammere7708682015-04-22 10:00:23 +00001447
Kate Stoneb9c1b512016-09-06 20:57:50 +00001448 default:
1449 return Error("NativeProcessLinux::%s (): unexpected state %s specified "
1450 "for pid %" PRIu64 ", tid %" PRIu64,
1451 __FUNCTION__, StateAsCString(action->state), GetID(),
1452 thread_sp->GetID());
1453 }
1454 }
1455
1456 return Error();
Tamas Berghammere7708682015-04-22 10:00:23 +00001457}
1458
Kate Stoneb9c1b512016-09-06 20:57:50 +00001459Error NativeProcessLinux::Halt() {
1460 Error error;
1461
1462 if (kill(GetID(), SIGSTOP) != 0)
1463 error.SetErrorToErrno();
1464
1465 return error;
Tamas Berghammere7708682015-04-22 10:00:23 +00001466}
1467
Kate Stoneb9c1b512016-09-06 20:57:50 +00001468Error NativeProcessLinux::Detach() {
1469 Error error;
1470
1471 // Stop monitoring the inferior.
1472 m_sigchld_handle.reset();
1473
1474 // Tell ptrace to detach from the process.
1475 if (GetID() == LLDB_INVALID_PROCESS_ID)
1476 return error;
1477
1478 for (auto thread_sp : m_threads) {
1479 Error e = Detach(thread_sp->GetID());
1480 if (e.Fail())
1481 error =
1482 e; // Save the error, but still attempt to detach from other threads.
1483 }
1484
1485 return error;
1486}
1487
1488Error NativeProcessLinux::Signal(int signo) {
1489 Error error;
1490
1491 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1492 if (log)
1493 log->Printf(
1494 "NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64,
1495 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID());
1496
1497 if (kill(GetID(), signo))
1498 error.SetErrorToErrno();
1499
1500 return error;
1501}
1502
1503Error NativeProcessLinux::Interrupt() {
1504 // Pick a running thread (or if none, a not-dead stopped thread) as
1505 // the chosen thread that will be the stop-reason thread.
1506 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1507
1508 NativeThreadProtocolSP running_thread_sp;
1509 NativeThreadProtocolSP stopped_thread_sp;
1510
1511 if (log)
1512 log->Printf(
1513 "NativeProcessLinux::%s selecting running thread for interrupt target",
1514 __FUNCTION__);
1515
1516 for (auto thread_sp : m_threads) {
1517 // The thread shouldn't be null but lets just cover that here.
1518 if (!thread_sp)
1519 continue;
1520
1521 // If we have a running or stepping thread, we'll call that the
1522 // target of the interrupt.
1523 const auto thread_state = thread_sp->GetState();
1524 if (thread_state == eStateRunning || thread_state == eStateStepping) {
1525 running_thread_sp = thread_sp;
1526 break;
1527 } else if (!stopped_thread_sp && StateIsStoppedState(thread_state, true)) {
1528 // Remember the first non-dead stopped thread. We'll use that as a backup
1529 // if there are no running threads.
1530 stopped_thread_sp = thread_sp;
1531 }
1532 }
1533
1534 if (!running_thread_sp && !stopped_thread_sp) {
1535 Error error("found no running/stepping or live stopped threads as target "
1536 "for interrupt");
Todd Fialaaf245d12014-06-30 21:05:18 +00001537 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001538 log->Printf("NativeProcessLinux::%s skipping due to error: %s",
1539 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +00001540
1541 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001542 }
1543
1544 NativeThreadProtocolSP deferred_signal_thread_sp =
1545 running_thread_sp ? running_thread_sp : stopped_thread_sp;
1546
1547 if (log)
1548 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64
1549 " chosen for interrupt target",
1550 __FUNCTION__, GetID(),
1551 running_thread_sp ? "running" : "stopped",
1552 deferred_signal_thread_sp->GetID());
1553
1554 StopRunningThreads(deferred_signal_thread_sp->GetID());
1555
1556 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001557}
1558
Kate Stoneb9c1b512016-09-06 20:57:50 +00001559Error NativeProcessLinux::Kill() {
1560 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1561 if (log)
1562 log->Printf("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__,
1563 GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001564
Kate Stoneb9c1b512016-09-06 20:57:50 +00001565 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001566
Kate Stoneb9c1b512016-09-06 20:57:50 +00001567 switch (m_state) {
1568 case StateType::eStateInvalid:
1569 case StateType::eStateExited:
1570 case StateType::eStateCrashed:
1571 case StateType::eStateDetached:
1572 case StateType::eStateUnloaded:
1573 // Nothing to do - the process is already dead.
1574 if (log)
1575 log->Printf("NativeProcessLinux::%s ignored for PID %" PRIu64
1576 " due to current state: %s",
1577 __FUNCTION__, GetID(), StateAsCString(m_state));
Todd Fialaaf245d12014-06-30 21:05:18 +00001578 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001579
Kate Stoneb9c1b512016-09-06 20:57:50 +00001580 case StateType::eStateConnected:
1581 case StateType::eStateAttaching:
1582 case StateType::eStateLaunching:
1583 case StateType::eStateStopped:
1584 case StateType::eStateRunning:
1585 case StateType::eStateStepping:
1586 case StateType::eStateSuspended:
1587 // We can try to kill a process in these states.
1588 break;
1589 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001590
Kate Stoneb9c1b512016-09-06 20:57:50 +00001591 if (kill(GetID(), SIGKILL) != 0) {
1592 error.SetErrorToErrno();
Todd Fialaaf245d12014-06-30 21:05:18 +00001593 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001594 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001595
Kate Stoneb9c1b512016-09-06 20:57:50 +00001596 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001597}
1598
1599static Error
Kate Stoneb9c1b512016-09-06 20:57:50 +00001600ParseMemoryRegionInfoFromProcMapsLine(const std::string &maps_line,
1601 MemoryRegionInfo &memory_region_info) {
1602 memory_region_info.Clear();
Todd Fialaaf245d12014-06-30 21:05:18 +00001603
Kate Stoneb9c1b512016-09-06 20:57:50 +00001604 StringExtractor line_extractor(maps_line.c_str());
Todd Fialaaf245d12014-06-30 21:05:18 +00001605
Kate Stoneb9c1b512016-09-06 20:57:50 +00001606 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode
1607 // pathname
1608 // perms: rwxp (letter is present if set, '-' if not, final character is
1609 // p=private, s=shared).
Todd Fialaaf245d12014-06-30 21:05:18 +00001610
Kate Stoneb9c1b512016-09-06 20:57:50 +00001611 // Parse out the starting address
1612 lldb::addr_t start_address = line_extractor.GetHexMaxU64(false, 0);
Todd Fialaaf245d12014-06-30 21:05:18 +00001613
Kate Stoneb9c1b512016-09-06 20:57:50 +00001614 // Parse out hyphen separating start and end address from range.
1615 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != '-'))
1616 return Error(
1617 "malformed /proc/{pid}/maps entry, missing dash between address range");
Todd Fialaaf245d12014-06-30 21:05:18 +00001618
Kate Stoneb9c1b512016-09-06 20:57:50 +00001619 // Parse out the ending address
1620 lldb::addr_t end_address = line_extractor.GetHexMaxU64(false, start_address);
Todd Fialaaf245d12014-06-30 21:05:18 +00001621
Kate Stoneb9c1b512016-09-06 20:57:50 +00001622 // Parse out the space after the address.
1623 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != ' '))
1624 return Error("malformed /proc/{pid}/maps entry, missing space after range");
Todd Fialaaf245d12014-06-30 21:05:18 +00001625
Kate Stoneb9c1b512016-09-06 20:57:50 +00001626 // Save the range.
1627 memory_region_info.GetRange().SetRangeBase(start_address);
1628 memory_region_info.GetRange().SetRangeEnd(end_address);
Todd Fialaaf245d12014-06-30 21:05:18 +00001629
Kate Stoneb9c1b512016-09-06 20:57:50 +00001630 // Any memory region in /proc/{pid}/maps is by definition mapped into the
1631 // process.
1632 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes);
Howard Hellyerad007562016-07-07 08:21:28 +00001633
Kate Stoneb9c1b512016-09-06 20:57:50 +00001634 // Parse out each permission entry.
1635 if (line_extractor.GetBytesLeft() < 4)
1636 return Error("malformed /proc/{pid}/maps entry, missing some portion of "
1637 "permissions");
Todd Fialaaf245d12014-06-30 21:05:18 +00001638
Kate Stoneb9c1b512016-09-06 20:57:50 +00001639 // Handle read permission.
1640 const char read_perm_char = line_extractor.GetChar();
1641 if (read_perm_char == 'r')
1642 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eYes);
1643 else if (read_perm_char == '-')
1644 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1645 else
1646 return Error("unexpected /proc/{pid}/maps read permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001647
Kate Stoneb9c1b512016-09-06 20:57:50 +00001648 // Handle write permission.
1649 const char write_perm_char = line_extractor.GetChar();
1650 if (write_perm_char == 'w')
1651 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eYes);
1652 else if (write_perm_char == '-')
1653 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1654 else
1655 return Error("unexpected /proc/{pid}/maps write permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001656
Kate Stoneb9c1b512016-09-06 20:57:50 +00001657 // Handle execute permission.
1658 const char exec_perm_char = line_extractor.GetChar();
1659 if (exec_perm_char == 'x')
1660 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eYes);
1661 else if (exec_perm_char == '-')
1662 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1663 else
1664 return Error("unexpected /proc/{pid}/maps exec permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001665
Kate Stoneb9c1b512016-09-06 20:57:50 +00001666 line_extractor.GetChar(); // Read the private bit
1667 line_extractor.SkipSpaces(); // Skip the separator
1668 line_extractor.GetHexMaxU64(false, 0); // Read the offset
1669 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1670 line_extractor.GetChar(); // Read the device id separator
1671 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1672 line_extractor.SkipSpaces(); // Skip the separator
1673 line_extractor.GetU64(0, 10); // Read the inode number
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001674
Kate Stoneb9c1b512016-09-06 20:57:50 +00001675 line_extractor.SkipSpaces();
1676 const char *name = line_extractor.Peek();
1677 if (name)
1678 memory_region_info.SetName(name);
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001679
Kate Stoneb9c1b512016-09-06 20:57:50 +00001680 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001681}
1682
Kate Stoneb9c1b512016-09-06 20:57:50 +00001683Error NativeProcessLinux::GetMemoryRegionInfo(lldb::addr_t load_addr,
1684 MemoryRegionInfo &range_info) {
1685 // FIXME review that the final memory region returned extends to the end of
1686 // the virtual address space,
1687 // with no perms if it is not mapped.
Todd Fialaaf245d12014-06-30 21:05:18 +00001688
Kate Stoneb9c1b512016-09-06 20:57:50 +00001689 // Use an approach that reads memory regions from /proc/{pid}/maps.
1690 // Assume proc maps entries are in ascending order.
1691 // FIXME assert if we find differently.
Todd Fialaaf245d12014-06-30 21:05:18 +00001692
Kate Stoneb9c1b512016-09-06 20:57:50 +00001693 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1694 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001695
Kate Stoneb9c1b512016-09-06 20:57:50 +00001696 if (m_supports_mem_region == LazyBool::eLazyBoolNo) {
1697 // We're done.
1698 error.SetErrorString("unsupported");
Todd Fialaaf245d12014-06-30 21:05:18 +00001699 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001700 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001701
Kate Stoneb9c1b512016-09-06 20:57:50 +00001702 // If our cache is empty, pull the latest. There should always be at least
1703 // one memory region
1704 // if memory region handling is supported.
1705 if (m_mem_region_cache.empty()) {
1706 error = ProcFileReader::ProcessLineByLine(
1707 GetID(), "maps", [&](const std::string &line) -> bool {
1708 MemoryRegionInfo info;
1709 const Error parse_error =
1710 ParseMemoryRegionInfoFromProcMapsLine(line, info);
1711 if (parse_error.Success()) {
1712 m_mem_region_cache.push_back(info);
1713 return true;
1714 } else {
1715 if (log)
1716 log->Printf("NativeProcessLinux::%s failed to parse proc maps "
1717 "line '%s': %s",
1718 __FUNCTION__, line.c_str(), error.AsCString());
1719 return false;
1720 }
1721 });
Todd Fialaaf245d12014-06-30 21:05:18 +00001722
Kate Stoneb9c1b512016-09-06 20:57:50 +00001723 // If we had an error, we'll mark unsupported.
1724 if (error.Fail()) {
1725 m_supports_mem_region = LazyBool::eLazyBoolNo;
1726 return error;
1727 } else if (m_mem_region_cache.empty()) {
1728 // No entries after attempting to read them. This shouldn't happen if
1729 // /proc/{pid}/maps
1730 // is supported. Assume we don't support map entries via procfs.
1731 if (log)
1732 log->Printf("NativeProcessLinux::%s failed to find any procfs maps "
1733 "entries, assuming no support for memory region metadata "
1734 "retrieval",
1735 __FUNCTION__);
1736 m_supports_mem_region = LazyBool::eLazyBoolNo;
1737 error.SetErrorString("not supported");
1738 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001739 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001740
1741 if (log)
1742 log->Printf("NativeProcessLinux::%s read %" PRIu64
1743 " memory region entries from /proc/%" PRIu64 "/maps",
1744 __FUNCTION__,
1745 static_cast<uint64_t>(m_mem_region_cache.size()), GetID());
1746
1747 // We support memory retrieval, remember that.
1748 m_supports_mem_region = LazyBool::eLazyBoolYes;
1749 } else {
1750 if (log)
1751 log->Printf("NativeProcessLinux::%s reusing %" PRIu64
1752 " cached memory region entries",
1753 __FUNCTION__,
1754 static_cast<uint64_t>(m_mem_region_cache.size()));
1755 }
1756
1757 lldb::addr_t prev_base_address = 0;
1758
1759 // FIXME start by finding the last region that is <= target address using
1760 // binary search. Data is sorted.
1761 // There can be a ton of regions on pthreads apps with lots of threads.
1762 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end();
1763 ++it) {
1764 MemoryRegionInfo &proc_entry_info = *it;
1765
1766 // Sanity check assumption that /proc/{pid}/maps entries are ascending.
1767 assert((proc_entry_info.GetRange().GetRangeBase() >= prev_base_address) &&
1768 "descending /proc/pid/maps entries detected, unexpected");
1769 prev_base_address = proc_entry_info.GetRange().GetRangeBase();
1770
1771 // If the target address comes before this entry, indicate distance to next
1772 // region.
1773 if (load_addr < proc_entry_info.GetRange().GetRangeBase()) {
1774 range_info.GetRange().SetRangeBase(load_addr);
1775 range_info.GetRange().SetByteSize(
1776 proc_entry_info.GetRange().GetRangeBase() - load_addr);
1777 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1778 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1779 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1780 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1781
1782 return error;
1783 } else if (proc_entry_info.GetRange().Contains(load_addr)) {
1784 // The target address is within the memory region we're processing here.
1785 range_info = proc_entry_info;
1786 return error;
1787 }
1788
1789 // The target memory address comes somewhere after the region we just
1790 // parsed.
1791 }
1792
1793 // If we made it here, we didn't find an entry that contained the given
1794 // address. Return the
1795 // load_addr as start and the amount of bytes betwwen load address and the end
1796 // of the memory as
1797 // size.
1798 range_info.GetRange().SetRangeBase(load_addr);
1799 range_info.GetRange().SetRangeEnd(LLDB_INVALID_ADDRESS);
1800 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1801 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1802 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1803 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1804 return error;
1805}
1806
1807void NativeProcessLinux::DoStopIDBumped(uint32_t newBumpId) {
1808 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1809 if (log)
1810 log->Printf("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called",
1811 __FUNCTION__, newBumpId);
1812
1813 if (log)
1814 log->Printf("NativeProcessLinux::%s clearing %" PRIu64
1815 " entries from the cache",
1816 __FUNCTION__, static_cast<uint64_t>(m_mem_region_cache.size()));
1817 m_mem_region_cache.clear();
1818}
1819
1820Error NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions,
1821 lldb::addr_t &addr) {
1822// FIXME implementing this requires the equivalent of
1823// InferiorCallPOSIX::InferiorCallMmap, which depends on
1824// functional ThreadPlans working with Native*Protocol.
1825#if 1
1826 return Error("not implemented yet");
1827#else
1828 addr = LLDB_INVALID_ADDRESS;
1829
1830 unsigned prot = 0;
1831 if (permissions & lldb::ePermissionsReadable)
1832 prot |= eMmapProtRead;
1833 if (permissions & lldb::ePermissionsWritable)
1834 prot |= eMmapProtWrite;
1835 if (permissions & lldb::ePermissionsExecutable)
1836 prot |= eMmapProtExec;
1837
1838 // TODO implement this directly in NativeProcessLinux
1839 // (and lift to NativeProcessPOSIX if/when that class is
1840 // refactored out).
1841 if (InferiorCallMmap(this, addr, 0, size, prot,
1842 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
1843 m_addr_to_mmap_size[addr] = size;
1844 return Error();
1845 } else {
1846 addr = LLDB_INVALID_ADDRESS;
1847 return Error("unable to allocate %" PRIu64
1848 " bytes of memory with permissions %s",
1849 size, GetPermissionsAsCString(permissions));
1850 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001851#endif
1852}
1853
Kate Stoneb9c1b512016-09-06 20:57:50 +00001854Error NativeProcessLinux::DeallocateMemory(lldb::addr_t addr) {
1855 // FIXME see comments in AllocateMemory - required lower-level
1856 // bits not in place yet (ThreadPlans)
1857 return Error("not implemented");
Todd Fialaaf245d12014-06-30 21:05:18 +00001858}
1859
Kate Stoneb9c1b512016-09-06 20:57:50 +00001860lldb::addr_t NativeProcessLinux::GetSharedLibraryInfoAddress() {
1861 // punt on this for now
1862 return LLDB_INVALID_ADDRESS;
Todd Fialaaf245d12014-06-30 21:05:18 +00001863}
1864
Kate Stoneb9c1b512016-09-06 20:57:50 +00001865size_t NativeProcessLinux::UpdateThreads() {
1866 // The NativeProcessLinux monitoring threads are always up to date
1867 // with respect to thread state and they keep the thread list
1868 // populated properly. All this method needs to do is return the
1869 // thread count.
1870 return m_threads.size();
Todd Fialaaf245d12014-06-30 21:05:18 +00001871}
1872
Kate Stoneb9c1b512016-09-06 20:57:50 +00001873bool NativeProcessLinux::GetArchitecture(ArchSpec &arch) const {
1874 arch = m_arch;
1875 return true;
Todd Fialaaf245d12014-06-30 21:05:18 +00001876}
1877
Kate Stoneb9c1b512016-09-06 20:57:50 +00001878Error NativeProcessLinux::GetSoftwareBreakpointPCOffset(
1879 uint32_t &actual_opcode_size) {
1880 // FIXME put this behind a breakpoint protocol class that can be
1881 // set per architecture. Need ARM, MIPS support here.
1882 static const uint8_t g_i386_opcode[] = {0xCC};
1883 static const uint8_t g_s390x_opcode[] = {0x00, 0x01};
Todd Fialaaf245d12014-06-30 21:05:18 +00001884
Kate Stoneb9c1b512016-09-06 20:57:50 +00001885 switch (m_arch.GetMachine()) {
1886 case llvm::Triple::x86:
1887 case llvm::Triple::x86_64:
1888 actual_opcode_size = static_cast<uint32_t>(sizeof(g_i386_opcode));
1889 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001890
Kate Stoneb9c1b512016-09-06 20:57:50 +00001891 case llvm::Triple::systemz:
1892 actual_opcode_size = static_cast<uint32_t>(sizeof(g_s390x_opcode));
1893 return Error();
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001894
Kate Stoneb9c1b512016-09-06 20:57:50 +00001895 case llvm::Triple::arm:
1896 case llvm::Triple::aarch64:
1897 case llvm::Triple::mips64:
1898 case llvm::Triple::mips64el:
1899 case llvm::Triple::mips:
1900 case llvm::Triple::mipsel:
1901 // On these architectures the PC don't get updated for breakpoint hits
1902 actual_opcode_size = 0;
1903 return Error();
1904
1905 default:
1906 assert(false && "CPU type not supported!");
1907 return Error("CPU type not supported");
1908 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001909}
1910
Kate Stoneb9c1b512016-09-06 20:57:50 +00001911Error NativeProcessLinux::SetBreakpoint(lldb::addr_t addr, uint32_t size,
1912 bool hardware) {
1913 if (hardware)
1914 return Error("NativeProcessLinux does not support hardware breakpoints");
1915 else
1916 return SetSoftwareBreakpoint(addr, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00001917}
1918
Kate Stoneb9c1b512016-09-06 20:57:50 +00001919Error NativeProcessLinux::GetSoftwareBreakpointTrapOpcode(
1920 size_t trap_opcode_size_hint, size_t &actual_opcode_size,
1921 const uint8_t *&trap_opcode_bytes) {
1922 // FIXME put this behind a breakpoint protocol class that can be set per
1923 // architecture. Need MIPS support here.
1924 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4};
1925 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
1926 // linux kernel does otherwise.
1927 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
1928 static const uint8_t g_i386_opcode[] = {0xCC};
1929 static const uint8_t g_mips64_opcode[] = {0x00, 0x00, 0x00, 0x0d};
1930 static const uint8_t g_mips64el_opcode[] = {0x0d, 0x00, 0x00, 0x00};
1931 static const uint8_t g_s390x_opcode[] = {0x00, 0x01};
1932 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
Todd Fialaaf245d12014-06-30 21:05:18 +00001933
Kate Stoneb9c1b512016-09-06 20:57:50 +00001934 switch (m_arch.GetMachine()) {
1935 case llvm::Triple::aarch64:
1936 trap_opcode_bytes = g_aarch64_opcode;
1937 actual_opcode_size = sizeof(g_aarch64_opcode);
1938 return Error();
Todd Fiala2afc5962014-08-21 16:42:31 +00001939
Kate Stoneb9c1b512016-09-06 20:57:50 +00001940 case llvm::Triple::arm:
1941 switch (trap_opcode_size_hint) {
1942 case 2:
1943 trap_opcode_bytes = g_thumb_breakpoint_opcode;
1944 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
1945 return Error();
1946 case 4:
1947 trap_opcode_bytes = g_arm_breakpoint_opcode;
1948 actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
1949 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001950 default:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001951 assert(false && "Unrecognised trap opcode size hint!");
1952 return Error("Unrecognised trap opcode size hint!");
Todd Fialaaf245d12014-06-30 21:05:18 +00001953 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001954
1955 case llvm::Triple::x86:
1956 case llvm::Triple::x86_64:
1957 trap_opcode_bytes = g_i386_opcode;
1958 actual_opcode_size = sizeof(g_i386_opcode);
1959 return Error();
1960
1961 case llvm::Triple::mips:
1962 case llvm::Triple::mips64:
1963 trap_opcode_bytes = g_mips64_opcode;
1964 actual_opcode_size = sizeof(g_mips64_opcode);
1965 return Error();
1966
1967 case llvm::Triple::mipsel:
1968 case llvm::Triple::mips64el:
1969 trap_opcode_bytes = g_mips64el_opcode;
1970 actual_opcode_size = sizeof(g_mips64el_opcode);
1971 return Error();
1972
1973 case llvm::Triple::systemz:
1974 trap_opcode_bytes = g_s390x_opcode;
1975 actual_opcode_size = sizeof(g_s390x_opcode);
1976 return Error();
1977
1978 default:
1979 assert(false && "CPU type not supported!");
1980 return Error("CPU type not supported");
1981 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001982}
1983
1984#if 0
1985ProcessMessage::CrashReason
1986NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info)
1987{
1988 ProcessMessage::CrashReason reason;
1989 assert(info->si_signo == SIGSEGV);
1990
1991 reason = ProcessMessage::eInvalidCrashReason;
1992
1993 switch (info->si_code)
1994 {
1995 default:
1996 assert(false && "unexpected si_code for SIGSEGV");
1997 break;
1998 case SI_KERNEL:
1999 // Linux will occasionally send spurious SI_KERNEL codes.
2000 // (this is poorly documented in sigaction)
2001 // One way to get this is via unaligned SIMD loads.
2002 reason = ProcessMessage::eInvalidAddress; // for lack of anything better
2003 break;
2004 case SEGV_MAPERR:
2005 reason = ProcessMessage::eInvalidAddress;
2006 break;
2007 case SEGV_ACCERR:
2008 reason = ProcessMessage::ePrivilegedAddress;
2009 break;
2010 }
2011
2012 return reason;
2013}
2014#endif
2015
Todd Fialaaf245d12014-06-30 21:05:18 +00002016#if 0
2017ProcessMessage::CrashReason
2018NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info)
2019{
2020 ProcessMessage::CrashReason reason;
2021 assert(info->si_signo == SIGILL);
2022
2023 reason = ProcessMessage::eInvalidCrashReason;
2024
2025 switch (info->si_code)
2026 {
2027 default:
2028 assert(false && "unexpected si_code for SIGILL");
2029 break;
2030 case ILL_ILLOPC:
2031 reason = ProcessMessage::eIllegalOpcode;
2032 break;
2033 case ILL_ILLOPN:
2034 reason = ProcessMessage::eIllegalOperand;
2035 break;
2036 case ILL_ILLADR:
2037 reason = ProcessMessage::eIllegalAddressingMode;
2038 break;
2039 case ILL_ILLTRP:
2040 reason = ProcessMessage::eIllegalTrap;
2041 break;
2042 case ILL_PRVOPC:
2043 reason = ProcessMessage::ePrivilegedOpcode;
2044 break;
2045 case ILL_PRVREG:
2046 reason = ProcessMessage::ePrivilegedRegister;
2047 break;
2048 case ILL_COPROC:
2049 reason = ProcessMessage::eCoprocessorError;
2050 break;
2051 case ILL_BADSTK:
2052 reason = ProcessMessage::eInternalStackError;
2053 break;
2054 }
2055
2056 return reason;
2057}
2058#endif
2059
2060#if 0
2061ProcessMessage::CrashReason
2062NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info)
2063{
2064 ProcessMessage::CrashReason reason;
2065 assert(info->si_signo == SIGFPE);
2066
2067 reason = ProcessMessage::eInvalidCrashReason;
2068
2069 switch (info->si_code)
2070 {
2071 default:
2072 assert(false && "unexpected si_code for SIGFPE");
2073 break;
2074 case FPE_INTDIV:
2075 reason = ProcessMessage::eIntegerDivideByZero;
2076 break;
2077 case FPE_INTOVF:
2078 reason = ProcessMessage::eIntegerOverflow;
2079 break;
2080 case FPE_FLTDIV:
2081 reason = ProcessMessage::eFloatDivideByZero;
2082 break;
2083 case FPE_FLTOVF:
2084 reason = ProcessMessage::eFloatOverflow;
2085 break;
2086 case FPE_FLTUND:
2087 reason = ProcessMessage::eFloatUnderflow;
2088 break;
2089 case FPE_FLTRES:
2090 reason = ProcessMessage::eFloatInexactResult;
2091 break;
2092 case FPE_FLTINV:
2093 reason = ProcessMessage::eFloatInvalidOperation;
2094 break;
2095 case FPE_FLTSUB:
2096 reason = ProcessMessage::eFloatSubscriptRange;
2097 break;
2098 }
2099
2100 return reason;
2101}
2102#endif
2103
2104#if 0
2105ProcessMessage::CrashReason
2106NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info)
2107{
2108 ProcessMessage::CrashReason reason;
2109 assert(info->si_signo == SIGBUS);
2110
2111 reason = ProcessMessage::eInvalidCrashReason;
2112
2113 switch (info->si_code)
2114 {
2115 default:
2116 assert(false && "unexpected si_code for SIGBUS");
2117 break;
2118 case BUS_ADRALN:
2119 reason = ProcessMessage::eIllegalAlignment;
2120 break;
2121 case BUS_ADRERR:
2122 reason = ProcessMessage::eIllegalAddress;
2123 break;
2124 case BUS_OBJERR:
2125 reason = ProcessMessage::eHardwareError;
2126 break;
2127 }
2128
2129 return reason;
2130}
2131#endif
2132
Kate Stoneb9c1b512016-09-06 20:57:50 +00002133Error NativeProcessLinux::ReadMemory(lldb::addr_t addr, void *buf, size_t size,
2134 size_t &bytes_read) {
2135 if (ProcessVmReadvSupported()) {
2136 // The process_vm_readv path is about 50 times faster than ptrace api. We
2137 // want to use
2138 // this syscall if it is supported.
Pavel Labathdf7c6992015-06-17 18:38:49 +00002139
Kate Stoneb9c1b512016-09-06 20:57:50 +00002140 const ::pid_t pid = GetID();
Pavel Labathdf7c6992015-06-17 18:38:49 +00002141
Kate Stoneb9c1b512016-09-06 20:57:50 +00002142 struct iovec local_iov, remote_iov;
2143 local_iov.iov_base = buf;
2144 local_iov.iov_len = size;
2145 remote_iov.iov_base = reinterpret_cast<void *>(addr);
2146 remote_iov.iov_len = size;
Pavel Labathdf7c6992015-06-17 18:38:49 +00002147
Kate Stoneb9c1b512016-09-06 20:57:50 +00002148 bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0);
2149 const bool success = bytes_read == size;
Pavel Labathdf7c6992015-06-17 18:38:49 +00002150
Kate Stoneb9c1b512016-09-06 20:57:50 +00002151 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Pavel Labath19cbe962015-07-21 13:20:32 +00002152 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002153 log->Printf("NativeProcessLinux::%s using process_vm_readv to read %zd "
2154 "bytes from inferior address 0x%" PRIx64 ": %s",
2155 __FUNCTION__, size, addr,
2156 success ? "Success" : strerror(errno));
Pavel Labath19cbe962015-07-21 13:20:32 +00002157
Kate Stoneb9c1b512016-09-06 20:57:50 +00002158 if (success)
2159 return Error();
2160 // else
2161 // the call failed for some reason, let's retry the read using ptrace
2162 // api.
2163 }
Pavel Labath19cbe962015-07-21 13:20:32 +00002164
Kate Stoneb9c1b512016-09-06 20:57:50 +00002165 unsigned char *dst = static_cast<unsigned char *>(buf);
2166 size_t remainder;
2167 long data;
Pavel Labath19cbe962015-07-21 13:20:32 +00002168
Kate Stoneb9c1b512016-09-06 20:57:50 +00002169 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_ALL));
2170 if (log)
2171 ProcessPOSIXLog::IncNestLevel();
2172 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2173 log->GetMask().Test(POSIX_LOG_MEMORY))
2174 log->Printf("NativeProcessLinux::%s(%p, %p, %zd, _)", __FUNCTION__,
2175 (void *)addr, buf, size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002176
Kate Stoneb9c1b512016-09-06 20:57:50 +00002177 for (bytes_read = 0; bytes_read < size; bytes_read += remainder) {
2178 Error error = NativeProcessLinux::PtraceWrapper(
2179 PTRACE_PEEKDATA, GetID(), (void *)addr, nullptr, 0, &data);
2180 if (error.Fail()) {
2181 if (log)
Pavel Labath19cbe962015-07-21 13:20:32 +00002182 ProcessPOSIXLog::DecNestLevel();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002183 return error;
2184 }
2185
2186 remainder = size - bytes_read;
2187 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2188
2189 // Copy the data into our buffer
2190 memcpy(dst, &data, remainder);
2191
2192 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2193 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2194 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2195 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) {
2196 uintptr_t print_dst = 0;
2197 // Format bytes from data by moving into print_dst for log output
2198 for (unsigned i = 0; i < remainder; ++i)
2199 print_dst |= (((data >> i * 8) & 0xFF) << i * 8);
2200 log->Printf("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64
2201 " (0x%" PRIx64 ")",
2202 __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data));
2203 }
2204 addr += k_ptrace_word_size;
2205 dst += k_ptrace_word_size;
2206 }
2207
2208 if (log)
2209 ProcessPOSIXLog::DecNestLevel();
2210 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00002211}
2212
Kate Stoneb9c1b512016-09-06 20:57:50 +00002213Error NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf,
2214 size_t size,
2215 size_t &bytes_read) {
2216 Error error = ReadMemory(addr, buf, size, bytes_read);
2217 if (error.Fail())
Pavel Labath19cbe962015-07-21 13:20:32 +00002218 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002219 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002220}
2221
Kate Stoneb9c1b512016-09-06 20:57:50 +00002222Error NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf,
2223 size_t size, size_t &bytes_written) {
2224 const unsigned char *src = static_cast<const unsigned char *>(buf);
2225 size_t remainder;
2226 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002227
Kate Stoneb9c1b512016-09-06 20:57:50 +00002228 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_ALL));
2229 if (log)
2230 ProcessPOSIXLog::IncNestLevel();
2231 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2232 log->GetMask().Test(POSIX_LOG_MEMORY))
2233 log->Printf("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__,
2234 addr, buf, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002235
Kate Stoneb9c1b512016-09-06 20:57:50 +00002236 for (bytes_written = 0; bytes_written < size; bytes_written += remainder) {
2237 remainder = size - bytes_written;
2238 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
Chaoren Lin97ccc292015-02-03 01:51:12 +00002239
Kate Stoneb9c1b512016-09-06 20:57:50 +00002240 if (remainder == k_ptrace_word_size) {
2241 unsigned long data = 0;
2242 memcpy(&data, src, k_ptrace_word_size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002243
Kate Stoneb9c1b512016-09-06 20:57:50 +00002244 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2245 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2246 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2247 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2248 log->Printf("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2249 (void *)addr, *(const unsigned long *)src, data);
2250
2251 error = NativeProcessLinux::PtraceWrapper(PTRACE_POKEDATA, GetID(),
2252 (void *)addr, (void *)data);
2253 if (error.Fail()) {
2254 if (log)
2255 ProcessPOSIXLog::DecNestLevel();
2256 return error;
2257 }
2258 } else {
2259 unsigned char buff[8];
2260 size_t bytes_read;
2261 error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read);
2262 if (error.Fail()) {
2263 if (log)
2264 ProcessPOSIXLog::DecNestLevel();
2265 return error;
2266 }
2267
2268 memcpy(buff, src, remainder);
2269
2270 size_t bytes_written_rec;
2271 error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec);
2272 if (error.Fail()) {
2273 if (log)
2274 ProcessPOSIXLog::DecNestLevel();
2275 return error;
2276 }
2277
2278 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2279 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2280 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2281 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2282 log->Printf("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2283 (void *)addr, *(const unsigned long *)src,
2284 *(unsigned long *)buff);
Todd Fialaaf245d12014-06-30 21:05:18 +00002285 }
2286
Kate Stoneb9c1b512016-09-06 20:57:50 +00002287 addr += k_ptrace_word_size;
2288 src += k_ptrace_word_size;
2289 }
2290 if (log)
2291 ProcessPOSIXLog::DecNestLevel();
2292 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002293}
2294
Kate Stoneb9c1b512016-09-06 20:57:50 +00002295Error NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) {
2296 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo);
2297}
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002298
Kate Stoneb9c1b512016-09-06 20:57:50 +00002299Error NativeProcessLinux::GetEventMessage(lldb::tid_t tid,
2300 unsigned long *message) {
2301 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message);
2302}
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002303
Kate Stoneb9c1b512016-09-06 20:57:50 +00002304Error NativeProcessLinux::Detach(lldb::tid_t tid) {
2305 if (tid == LLDB_INVALID_THREAD_ID)
2306 return Error();
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002307
Kate Stoneb9c1b512016-09-06 20:57:50 +00002308 return PtraceWrapper(PTRACE_DETACH, tid);
2309}
2310
2311bool NativeProcessLinux::HasThreadNoLock(lldb::tid_t thread_id) {
2312 for (auto thread_sp : m_threads) {
2313 assert(thread_sp && "thread list should not contain NULL threads");
2314 if (thread_sp->GetID() == thread_id) {
2315 // We have this thread.
2316 return true;
Todd Fialaaf245d12014-06-30 21:05:18 +00002317 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002318 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002319
Kate Stoneb9c1b512016-09-06 20:57:50 +00002320 // We don't have this thread.
2321 return false;
Todd Fialaaf245d12014-06-30 21:05:18 +00002322}
2323
Kate Stoneb9c1b512016-09-06 20:57:50 +00002324bool NativeProcessLinux::StopTrackingThread(lldb::tid_t thread_id) {
2325 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
Todd Fialaaf245d12014-06-30 21:05:18 +00002326
Kate Stoneb9c1b512016-09-06 20:57:50 +00002327 if (log)
2328 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
Todd Fialaaf245d12014-06-30 21:05:18 +00002329 thread_id);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002330
2331 bool found = false;
2332
2333 for (auto it = m_threads.begin(); it != m_threads.end(); ++it) {
2334 if (*it && ((*it)->GetID() == thread_id)) {
2335 m_threads.erase(it);
2336 found = true;
2337 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00002338 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002339 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002340
Kate Stoneb9c1b512016-09-06 20:57:50 +00002341 SignalIfAllThreadsStopped();
Todd Fialaaf245d12014-06-30 21:05:18 +00002342
Kate Stoneb9c1b512016-09-06 20:57:50 +00002343 return found;
Todd Fialaaf245d12014-06-30 21:05:18 +00002344}
2345
Kate Stoneb9c1b512016-09-06 20:57:50 +00002346NativeThreadLinuxSP NativeProcessLinux::AddThread(lldb::tid_t thread_id) {
2347 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
Todd Fialaaf245d12014-06-30 21:05:18 +00002348
Kate Stoneb9c1b512016-09-06 20:57:50 +00002349 if (log) {
2350 log->Printf("NativeProcessLinux::%s pid %" PRIu64
2351 " adding thread with tid %" PRIu64,
2352 __FUNCTION__, GetID(), thread_id);
2353 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002354
Kate Stoneb9c1b512016-09-06 20:57:50 +00002355 assert(!HasThreadNoLock(thread_id) &&
2356 "attempted to add a thread by id that already exists");
Todd Fialaaf245d12014-06-30 21:05:18 +00002357
Kate Stoneb9c1b512016-09-06 20:57:50 +00002358 // If this is the first thread, save it as the current thread
2359 if (m_threads.empty())
2360 SetCurrentThreadID(thread_id);
Todd Fialaaf245d12014-06-30 21:05:18 +00002361
Kate Stoneb9c1b512016-09-06 20:57:50 +00002362 auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id);
2363 m_threads.push_back(thread_sp);
2364 return thread_sp;
2365}
Todd Fialaaf245d12014-06-30 21:05:18 +00002366
Kate Stoneb9c1b512016-09-06 20:57:50 +00002367Error NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread) {
2368 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Todd Fialaaf245d12014-06-30 21:05:18 +00002369
Kate Stoneb9c1b512016-09-06 20:57:50 +00002370 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002371
Kate Stoneb9c1b512016-09-06 20:57:50 +00002372 // Find out the size of a breakpoint (might depend on where we are in the
2373 // code).
2374 NativeRegisterContextSP context_sp = thread.GetRegisterContext();
2375 if (!context_sp) {
2376 error.SetErrorString("cannot get a NativeRegisterContext for the thread");
Todd Fialaaf245d12014-06-30 21:05:18 +00002377 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002378 log->Printf("NativeProcessLinux::%s failed: %s", __FUNCTION__,
2379 error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +00002380 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002381 }
Chaoren Linfa03ad22015-02-03 01:50:42 +00002382
Kate Stoneb9c1b512016-09-06 20:57:50 +00002383 uint32_t breakpoint_size = 0;
2384 error = GetSoftwareBreakpointPCOffset(breakpoint_size);
2385 if (error.Fail()) {
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002386 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002387 log->Printf("NativeProcessLinux::%s GetBreakpointSize() failed: %s",
2388 __FUNCTION__, error.AsCString());
2389 return error;
2390 } else {
2391 if (log)
2392 log->Printf("NativeProcessLinux::%s breakpoint size: %" PRIu32,
2393 __FUNCTION__, breakpoint_size);
2394 }
Pavel Labathc0765592015-05-06 10:46:34 +00002395
Kate Stoneb9c1b512016-09-06 20:57:50 +00002396 // First try probing for a breakpoint at a software breakpoint location: PC -
2397 // breakpoint size.
2398 const lldb::addr_t initial_pc_addr =
2399 context_sp->GetPCfromBreakpointLocation();
2400 lldb::addr_t breakpoint_addr = initial_pc_addr;
2401 if (breakpoint_size > 0) {
2402 // Do not allow breakpoint probe to wrap around.
2403 if (breakpoint_addr >= breakpoint_size)
2404 breakpoint_addr -= breakpoint_size;
2405 }
2406
2407 // Check if we stopped because of a breakpoint.
2408 NativeBreakpointSP breakpoint_sp;
2409 error = m_breakpoint_list.GetBreakpoint(breakpoint_addr, breakpoint_sp);
2410 if (!error.Success() || !breakpoint_sp) {
2411 // We didn't find one at a software probe location. Nothing to do.
2412 if (log)
2413 log->Printf(
2414 "NativeProcessLinux::%s pid %" PRIu64
2415 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64,
2416 __FUNCTION__, GetID(), breakpoint_addr);
2417 return Error();
2418 }
2419
2420 // If the breakpoint is not a software breakpoint, nothing to do.
2421 if (!breakpoint_sp->IsSoftwareBreakpoint()) {
2422 if (log)
2423 log->Printf("NativeProcessLinux::%s pid %" PRIu64
2424 " breakpoint found at 0x%" PRIx64
2425 ", not software, nothing to adjust",
2426 __FUNCTION__, GetID(), breakpoint_addr);
2427 return Error();
2428 }
2429
2430 //
2431 // We have a software breakpoint and need to adjust the PC.
2432 //
2433
2434 // Sanity check.
2435 if (breakpoint_size == 0) {
2436 // Nothing to do! How did we get here?
2437 if (log)
2438 log->Printf(
2439 "NativeProcessLinux::%s pid %" PRIu64
2440 " breakpoint found at 0x%" PRIx64
2441 ", it is software, but the size is zero, nothing to do (unexpected)",
2442 __FUNCTION__, GetID(), breakpoint_addr);
2443 return Error();
2444 }
2445
2446 // Change the program counter.
2447 if (log)
2448 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64
2449 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64,
2450 __FUNCTION__, GetID(), thread.GetID(), initial_pc_addr,
2451 breakpoint_addr);
2452
2453 error = context_sp->SetPC(breakpoint_addr);
2454 if (error.Fail()) {
2455 if (log)
2456 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64
2457 ": failed to set PC: %s",
2458 __FUNCTION__, GetID(), thread.GetID(), error.AsCString());
2459 return error;
2460 }
2461
2462 return error;
2463}
2464
2465Error NativeProcessLinux::GetLoadedModuleFileSpec(const char *module_path,
2466 FileSpec &file_spec) {
2467 FileSpec module_file_spec(module_path, true);
2468
2469 bool found = false;
2470 file_spec.Clear();
2471 ProcFileReader::ProcessLineByLine(
2472 GetID(), "maps", [&](const std::string &line) {
2473 SmallVector<StringRef, 16> columns;
2474 StringRef(line).split(columns, " ", -1, false);
2475 if (columns.size() < 6)
2476 return true; // continue searching
2477
2478 FileSpec this_file_spec(columns[5].str().c_str(), false);
2479 if (this_file_spec.GetFilename() != module_file_spec.GetFilename())
2480 return true; // continue searching
2481
2482 file_spec = this_file_spec;
2483 found = true;
2484 return false; // we are done
2485 });
2486
2487 if (!found)
2488 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
2489 module_file_spec.GetFilename().AsCString(), GetID());
2490
2491 return Error();
2492}
2493
2494Error NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef &file_name,
2495 lldb::addr_t &load_addr) {
2496 load_addr = LLDB_INVALID_ADDRESS;
2497 Error error = ProcFileReader::ProcessLineByLine(
2498 GetID(), "maps", [&](const std::string &line) -> bool {
2499 StringRef maps_row(line);
2500
2501 SmallVector<StringRef, 16> maps_columns;
2502 maps_row.split(maps_columns, StringRef(" "), -1, false);
2503
2504 if (maps_columns.size() < 6) {
2505 // Return true to continue reading the proc file
2506 return true;
2507 }
2508
2509 if (maps_columns[5] == file_name) {
2510 StringExtractor addr_extractor(maps_columns[0].str().c_str());
2511 load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2512
2513 // Return false to stop reading the proc file further
2514 return false;
2515 }
2516
2517 // Return true to continue reading the proc file
2518 return true;
2519 });
2520 return error;
2521}
2522
2523NativeThreadLinuxSP NativeProcessLinux::GetThreadByID(lldb::tid_t tid) {
2524 return std::static_pointer_cast<NativeThreadLinux>(
2525 NativeProcessProtocol::GetThreadByID(tid));
2526}
2527
2528Error NativeProcessLinux::ResumeThread(NativeThreadLinux &thread,
2529 lldb::StateType state, int signo) {
2530 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
2531
2532 if (log)
2533 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
2534 thread.GetID());
2535
2536 // Before we do the resume below, first check if we have a pending
2537 // stop notification that is currently waiting for
2538 // all threads to stop. This is potentially a buggy situation since
2539 // we're ostensibly waiting for threads to stop before we send out the
2540 // pending notification, and here we are resuming one before we send
2541 // out the pending stop notification.
2542 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log) {
2543 log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64
2544 " per explicit request but we have a pending stop notification "
2545 "(tid %" PRIu64 ") that is actively waiting for this thread to "
2546 "stop. Valid sequence of events?",
2547 __FUNCTION__, thread.GetID(), m_pending_notification_tid);
2548 }
2549
2550 // Request a resume. We expect this to be synchronous and the system
2551 // to reflect it is running after this completes.
2552 switch (state) {
2553 case eStateRunning: {
2554 const auto resume_result = thread.Resume(signo);
2555 if (resume_result.Success())
2556 SetState(eStateRunning, true);
2557 return resume_result;
2558 }
2559 case eStateStepping: {
2560 const auto step_result = thread.SingleStep(signo);
2561 if (step_result.Success())
2562 SetState(eStateRunning, true);
2563 return step_result;
2564 }
2565 default:
2566 if (log)
2567 log->Printf("NativeProcessLinux::%s Unhandled state %s.", __FUNCTION__,
2568 StateAsCString(state));
2569 llvm_unreachable("Unhandled state for resume");
2570 }
Pavel Labathc0765592015-05-06 10:46:34 +00002571}
2572
2573//===----------------------------------------------------------------------===//
2574
Kate Stoneb9c1b512016-09-06 20:57:50 +00002575void NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) {
2576 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
Pavel Labathc0765592015-05-06 10:46:34 +00002577
Kate Stoneb9c1b512016-09-06 20:57:50 +00002578 if (log) {
2579 log->Printf("NativeProcessLinux::%s about to process event: "
2580 "(triggering_tid: %" PRIu64 ")",
Pavel Labathc0765592015-05-06 10:46:34 +00002581 __FUNCTION__, triggering_tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002582 }
2583
2584 m_pending_notification_tid = triggering_tid;
2585
2586 // Request a stop for all the thread stops that need to be stopped
2587 // and are not already known to be stopped.
2588 for (const auto &thread_sp : m_threads) {
2589 if (StateIsRunningState(thread_sp->GetState()))
2590 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop();
2591 }
2592
2593 SignalIfAllThreadsStopped();
2594
2595 if (log) {
2596 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__);
2597 }
2598}
2599
2600void NativeProcessLinux::SignalIfAllThreadsStopped() {
2601 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID)
2602 return; // No pending notification. Nothing to do.
2603
2604 for (const auto &thread_sp : m_threads) {
2605 if (StateIsRunningState(thread_sp->GetState()))
2606 return; // Some threads are still running. Don't signal yet.
2607 }
2608
2609 // We have a pending notification and all threads have stopped.
2610 Log *log(
2611 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
2612
2613 // Clear any temporary breakpoints we used to implement software single
2614 // stepping.
2615 for (const auto &thread_info : m_threads_stepping_with_breakpoint) {
2616 Error error = RemoveBreakpoint(thread_info.second);
2617 if (error.Fail())
2618 if (log)
2619 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64
2620 " remove stepping breakpoint: %s",
2621 __FUNCTION__, thread_info.first, error.AsCString());
2622 }
2623 m_threads_stepping_with_breakpoint.clear();
2624
2625 // Notify the delegate about the stop
2626 SetCurrentThreadID(m_pending_notification_tid);
2627 SetState(StateType::eStateStopped, true);
2628 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
2629}
2630
2631void NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread) {
2632 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
2633
2634 if (log)
2635 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
2636 thread.GetID());
2637
2638 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID &&
2639 StateIsRunningState(thread.GetState())) {
2640 // We will need to wait for this new thread to stop as well before firing
2641 // the
2642 // notification.
2643 thread.RequestStop();
2644 }
2645}
2646
2647void NativeProcessLinux::SigchldHandler() {
2648 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
2649 // Process all pending waitpid notifications.
2650 while (true) {
2651 int status = -1;
2652 ::pid_t wait_pid = waitpid(-1, &status, __WALL | __WNOTHREAD | WNOHANG);
2653
2654 if (wait_pid == 0)
2655 break; // We are done.
2656
2657 if (wait_pid == -1) {
2658 if (errno == EINTR)
2659 continue;
2660
2661 Error error(errno, eErrorTypePOSIX);
2662 if (log)
2663 log->Printf("NativeProcessLinux::%s waitpid (-1, &status, __WALL | "
2664 "__WNOTHREAD | WNOHANG) failed: %s",
2665 __FUNCTION__, error.AsCString());
2666 break;
Pavel Labathc0765592015-05-06 10:46:34 +00002667 }
2668
Kate Stoneb9c1b512016-09-06 20:57:50 +00002669 bool exited = false;
2670 int signal = 0;
2671 int exit_status = 0;
2672 const char *status_cstr = nullptr;
2673 if (WIFSTOPPED(status)) {
2674 signal = WSTOPSIG(status);
2675 status_cstr = "STOPPED";
2676 } else if (WIFEXITED(status)) {
2677 exit_status = WEXITSTATUS(status);
2678 status_cstr = "EXITED";
2679 exited = true;
2680 } else if (WIFSIGNALED(status)) {
2681 signal = WTERMSIG(status);
2682 status_cstr = "SIGNALED";
2683 if (wait_pid == static_cast<::pid_t>(GetID())) {
2684 exited = true;
2685 exit_status = -1;
2686 }
2687 } else
2688 status_cstr = "(\?\?\?)";
Pavel Labathc0765592015-05-06 10:46:34 +00002689
Pavel Labath5eb721e2015-05-07 08:30:31 +00002690 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002691 log->Printf("NativeProcessLinux::%s: waitpid (-1, &status, __WALL | "
2692 "__WNOTHREAD | WNOHANG)"
2693 "=> pid = %" PRIi32
2694 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
2695 __FUNCTION__, wait_pid, status, status_cstr, signal,
2696 exit_status);
Pavel Labathc0765592015-05-06 10:46:34 +00002697
Kate Stoneb9c1b512016-09-06 20:57:50 +00002698 MonitorCallback(wait_pid, exited, signal, exit_status);
2699 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002700}
2701
2702// Wrapper for ptrace to catch errors and log calls.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002703// Note that ptrace sets errno on error because -1 can be a valid result (i.e.
2704// for PTRACE_PEEK*)
2705Error NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr,
2706 void *data, size_t data_size,
2707 long *result) {
2708 Error error;
2709 long int ret;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002710
Kate Stoneb9c1b512016-09-06 20:57:50 +00002711 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE));
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002712
Kate Stoneb9c1b512016-09-06 20:57:50 +00002713 PtraceDisplayBytes(req, data, data_size);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002714
Kate Stoneb9c1b512016-09-06 20:57:50 +00002715 errno = 0;
2716 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
2717 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid),
2718 *(unsigned int *)addr, data);
2719 else
2720 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid),
2721 addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002722
Kate Stoneb9c1b512016-09-06 20:57:50 +00002723 if (ret == -1)
2724 error.SetErrorToErrno();
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002725
Kate Stoneb9c1b512016-09-06 20:57:50 +00002726 if (result)
2727 *result = ret;
Pavel Labath4a9babb2015-06-30 17:04:49 +00002728
Kate Stoneb9c1b512016-09-06 20:57:50 +00002729 if (log)
2730 log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr,
2731 data, data_size, ret);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002732
Kate Stoneb9c1b512016-09-06 20:57:50 +00002733 PtraceDisplayBytes(req, data, data_size);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002734
Kate Stoneb9c1b512016-09-06 20:57:50 +00002735 if (log && error.GetError() != 0) {
2736 const char *str;
2737 switch (error.GetError()) {
2738 case ESRCH:
2739 str = "ESRCH";
2740 break;
2741 case EINVAL:
2742 str = "EINVAL";
2743 break;
2744 case EBUSY:
2745 str = "EBUSY";
2746 break;
2747 case EPERM:
2748 str = "EPERM";
2749 break;
2750 default:
2751 str = error.AsCString();
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002752 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002753 log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str);
2754 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002755
Kate Stoneb9c1b512016-09-06 20:57:50 +00002756 return error;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002757}