blob: 2510d27dc3be6bdc3363237a21f46f1aa3527ab8 [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
Kate Stoneb9c1b512016-09-06 20:57:50 +00001364 if (error.Fail())
1365 return error;
Tamas Berghammere7708682015-04-22 10:00:23 +00001366
Kate Stoneb9c1b512016-09-06 20:57:50 +00001367 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc});
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001368
Kate Stoneb9c1b512016-09-06 20:57:50 +00001369 return Error();
1370}
1371
1372bool NativeProcessLinux::SupportHardwareSingleStepping() const {
1373 if (m_arch.GetMachine() == llvm::Triple::arm ||
1374 m_arch.GetMachine() == llvm::Triple::mips64 ||
1375 m_arch.GetMachine() == llvm::Triple::mips64el ||
1376 m_arch.GetMachine() == llvm::Triple::mips ||
1377 m_arch.GetMachine() == llvm::Triple::mipsel)
Pavel Labath6648fcc2015-04-27 09:21:14 +00001378 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001379 return true;
Tamas Berghammere7708682015-04-22 10:00:23 +00001380}
1381
Kate Stoneb9c1b512016-09-06 20:57:50 +00001382Error NativeProcessLinux::Resume(const ResumeActionList &resume_actions) {
1383 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD));
1384 if (log)
1385 log->Printf("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__,
1386 GetID());
Tamas Berghammere7708682015-04-22 10:00:23 +00001387
Kate Stoneb9c1b512016-09-06 20:57:50 +00001388 bool software_single_step = !SupportHardwareSingleStepping();
Tamas Berghammere7708682015-04-22 10:00:23 +00001389
Kate Stoneb9c1b512016-09-06 20:57:50 +00001390 if (software_single_step) {
1391 for (auto thread_sp : m_threads) {
1392 assert(thread_sp && "thread list should not contain NULL threads");
Tamas Berghammere7708682015-04-22 10:00:23 +00001393
Kate Stoneb9c1b512016-09-06 20:57:50 +00001394 const ResumeAction *const action =
1395 resume_actions.GetActionForThread(thread_sp->GetID(), true);
1396 if (action == nullptr)
1397 continue;
Tamas Berghammere7708682015-04-22 10:00:23 +00001398
Kate Stoneb9c1b512016-09-06 20:57:50 +00001399 if (action->state == eStateStepping) {
1400 Error error = SetupSoftwareSingleStepping(
1401 static_cast<NativeThreadLinux &>(*thread_sp));
1402 if (error.Fail())
1403 return error;
1404 }
Tamas Berghammere7708682015-04-22 10:00:23 +00001405 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001406 }
1407
1408 for (auto thread_sp : m_threads) {
1409 assert(thread_sp && "thread list should not contain NULL threads");
1410
1411 const ResumeAction *const action =
1412 resume_actions.GetActionForThread(thread_sp->GetID(), true);
1413
1414 if (action == nullptr) {
1415 if (log)
1416 log->Printf(
1417 "NativeProcessLinux::%s no action specified for pid %" PRIu64
1418 " tid %" PRIu64,
1419 __FUNCTION__, GetID(), thread_sp->GetID());
1420 continue;
Tamas Berghammere7708682015-04-22 10:00:23 +00001421 }
1422
Kate Stoneb9c1b512016-09-06 20:57:50 +00001423 if (log) {
1424 log->Printf("NativeProcessLinux::%s processing resume action state %s "
1425 "for pid %" PRIu64 " tid %" PRIu64,
1426 __FUNCTION__, StateAsCString(action->state), GetID(),
1427 thread_sp->GetID());
Tamas Berghammere7708682015-04-22 10:00:23 +00001428 }
1429
Kate Stoneb9c1b512016-09-06 20:57:50 +00001430 switch (action->state) {
1431 case eStateRunning:
1432 case eStateStepping: {
1433 // Run the thread, possibly feeding it the signal.
1434 const int signo = action->signal;
1435 ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state,
1436 signo);
1437 break;
1438 }
Tamas Berghammere7708682015-04-22 10:00:23 +00001439
Kate Stoneb9c1b512016-09-06 20:57:50 +00001440 case eStateSuspended:
1441 case eStateStopped:
1442 lldbassert(0 && "Unexpected state");
Tamas Berghammere7708682015-04-22 10:00:23 +00001443
Kate Stoneb9c1b512016-09-06 20:57:50 +00001444 default:
1445 return Error("NativeProcessLinux::%s (): unexpected state %s specified "
1446 "for pid %" PRIu64 ", tid %" PRIu64,
1447 __FUNCTION__, StateAsCString(action->state), GetID(),
1448 thread_sp->GetID());
1449 }
1450 }
1451
1452 return Error();
Tamas Berghammere7708682015-04-22 10:00:23 +00001453}
1454
Kate Stoneb9c1b512016-09-06 20:57:50 +00001455Error NativeProcessLinux::Halt() {
1456 Error error;
1457
1458 if (kill(GetID(), SIGSTOP) != 0)
1459 error.SetErrorToErrno();
1460
1461 return error;
Tamas Berghammere7708682015-04-22 10:00:23 +00001462}
1463
Kate Stoneb9c1b512016-09-06 20:57:50 +00001464Error NativeProcessLinux::Detach() {
1465 Error error;
1466
1467 // Stop monitoring the inferior.
1468 m_sigchld_handle.reset();
1469
1470 // Tell ptrace to detach from the process.
1471 if (GetID() == LLDB_INVALID_PROCESS_ID)
1472 return error;
1473
1474 for (auto thread_sp : m_threads) {
1475 Error e = Detach(thread_sp->GetID());
1476 if (e.Fail())
1477 error =
1478 e; // Save the error, but still attempt to detach from other threads.
1479 }
1480
1481 return error;
1482}
1483
1484Error NativeProcessLinux::Signal(int signo) {
1485 Error error;
1486
1487 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1488 if (log)
1489 log->Printf(
1490 "NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64,
1491 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID());
1492
1493 if (kill(GetID(), signo))
1494 error.SetErrorToErrno();
1495
1496 return error;
1497}
1498
1499Error NativeProcessLinux::Interrupt() {
1500 // Pick a running thread (or if none, a not-dead stopped thread) as
1501 // the chosen thread that will be the stop-reason thread.
1502 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1503
1504 NativeThreadProtocolSP running_thread_sp;
1505 NativeThreadProtocolSP stopped_thread_sp;
1506
1507 if (log)
1508 log->Printf(
1509 "NativeProcessLinux::%s selecting running thread for interrupt target",
1510 __FUNCTION__);
1511
1512 for (auto thread_sp : m_threads) {
1513 // The thread shouldn't be null but lets just cover that here.
1514 if (!thread_sp)
1515 continue;
1516
1517 // If we have a running or stepping thread, we'll call that the
1518 // target of the interrupt.
1519 const auto thread_state = thread_sp->GetState();
1520 if (thread_state == eStateRunning || thread_state == eStateStepping) {
1521 running_thread_sp = thread_sp;
1522 break;
1523 } else if (!stopped_thread_sp && StateIsStoppedState(thread_state, true)) {
1524 // Remember the first non-dead stopped thread. We'll use that as a backup
1525 // if there are no running threads.
1526 stopped_thread_sp = thread_sp;
1527 }
1528 }
1529
1530 if (!running_thread_sp && !stopped_thread_sp) {
1531 Error error("found no running/stepping or live stopped threads as target "
1532 "for interrupt");
Todd Fialaaf245d12014-06-30 21:05:18 +00001533 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001534 log->Printf("NativeProcessLinux::%s skipping due to error: %s",
1535 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +00001536
1537 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001538 }
1539
1540 NativeThreadProtocolSP deferred_signal_thread_sp =
1541 running_thread_sp ? running_thread_sp : stopped_thread_sp;
1542
1543 if (log)
1544 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64
1545 " chosen for interrupt target",
1546 __FUNCTION__, GetID(),
1547 running_thread_sp ? "running" : "stopped",
1548 deferred_signal_thread_sp->GetID());
1549
1550 StopRunningThreads(deferred_signal_thread_sp->GetID());
1551
1552 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001553}
1554
Kate Stoneb9c1b512016-09-06 20:57:50 +00001555Error NativeProcessLinux::Kill() {
1556 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1557 if (log)
1558 log->Printf("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__,
1559 GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001560
Kate Stoneb9c1b512016-09-06 20:57:50 +00001561 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001562
Kate Stoneb9c1b512016-09-06 20:57:50 +00001563 switch (m_state) {
1564 case StateType::eStateInvalid:
1565 case StateType::eStateExited:
1566 case StateType::eStateCrashed:
1567 case StateType::eStateDetached:
1568 case StateType::eStateUnloaded:
1569 // Nothing to do - the process is already dead.
1570 if (log)
1571 log->Printf("NativeProcessLinux::%s ignored for PID %" PRIu64
1572 " due to current state: %s",
1573 __FUNCTION__, GetID(), StateAsCString(m_state));
Todd Fialaaf245d12014-06-30 21:05:18 +00001574 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001575
Kate Stoneb9c1b512016-09-06 20:57:50 +00001576 case StateType::eStateConnected:
1577 case StateType::eStateAttaching:
1578 case StateType::eStateLaunching:
1579 case StateType::eStateStopped:
1580 case StateType::eStateRunning:
1581 case StateType::eStateStepping:
1582 case StateType::eStateSuspended:
1583 // We can try to kill a process in these states.
1584 break;
1585 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001586
Kate Stoneb9c1b512016-09-06 20:57:50 +00001587 if (kill(GetID(), SIGKILL) != 0) {
1588 error.SetErrorToErrno();
Todd Fialaaf245d12014-06-30 21:05:18 +00001589 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001590 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001591
Kate Stoneb9c1b512016-09-06 20:57:50 +00001592 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001593}
1594
1595static Error
Kate Stoneb9c1b512016-09-06 20:57:50 +00001596ParseMemoryRegionInfoFromProcMapsLine(const std::string &maps_line,
1597 MemoryRegionInfo &memory_region_info) {
1598 memory_region_info.Clear();
Todd Fialaaf245d12014-06-30 21:05:18 +00001599
Kate Stoneb9c1b512016-09-06 20:57:50 +00001600 StringExtractor line_extractor(maps_line.c_str());
Todd Fialaaf245d12014-06-30 21:05:18 +00001601
Kate Stoneb9c1b512016-09-06 20:57:50 +00001602 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode
1603 // pathname
1604 // perms: rwxp (letter is present if set, '-' if not, final character is
1605 // p=private, s=shared).
Todd Fialaaf245d12014-06-30 21:05:18 +00001606
Kate Stoneb9c1b512016-09-06 20:57:50 +00001607 // Parse out the starting address
1608 lldb::addr_t start_address = line_extractor.GetHexMaxU64(false, 0);
Todd Fialaaf245d12014-06-30 21:05:18 +00001609
Kate Stoneb9c1b512016-09-06 20:57:50 +00001610 // Parse out hyphen separating start and end address from range.
1611 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != '-'))
1612 return Error(
1613 "malformed /proc/{pid}/maps entry, missing dash between address range");
Todd Fialaaf245d12014-06-30 21:05:18 +00001614
Kate Stoneb9c1b512016-09-06 20:57:50 +00001615 // Parse out the ending address
1616 lldb::addr_t end_address = line_extractor.GetHexMaxU64(false, start_address);
Todd Fialaaf245d12014-06-30 21:05:18 +00001617
Kate Stoneb9c1b512016-09-06 20:57:50 +00001618 // Parse out the space after the address.
1619 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != ' '))
1620 return Error("malformed /proc/{pid}/maps entry, missing space after range");
Todd Fialaaf245d12014-06-30 21:05:18 +00001621
Kate Stoneb9c1b512016-09-06 20:57:50 +00001622 // Save the range.
1623 memory_region_info.GetRange().SetRangeBase(start_address);
1624 memory_region_info.GetRange().SetRangeEnd(end_address);
Todd Fialaaf245d12014-06-30 21:05:18 +00001625
Kate Stoneb9c1b512016-09-06 20:57:50 +00001626 // Any memory region in /proc/{pid}/maps is by definition mapped into the
1627 // process.
1628 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes);
Howard Hellyerad007562016-07-07 08:21:28 +00001629
Kate Stoneb9c1b512016-09-06 20:57:50 +00001630 // Parse out each permission entry.
1631 if (line_extractor.GetBytesLeft() < 4)
1632 return Error("malformed /proc/{pid}/maps entry, missing some portion of "
1633 "permissions");
Todd Fialaaf245d12014-06-30 21:05:18 +00001634
Kate Stoneb9c1b512016-09-06 20:57:50 +00001635 // Handle read permission.
1636 const char read_perm_char = line_extractor.GetChar();
1637 if (read_perm_char == 'r')
1638 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eYes);
1639 else if (read_perm_char == '-')
1640 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1641 else
1642 return Error("unexpected /proc/{pid}/maps read permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001643
Kate Stoneb9c1b512016-09-06 20:57:50 +00001644 // Handle write permission.
1645 const char write_perm_char = line_extractor.GetChar();
1646 if (write_perm_char == 'w')
1647 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eYes);
1648 else if (write_perm_char == '-')
1649 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1650 else
1651 return Error("unexpected /proc/{pid}/maps write permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001652
Kate Stoneb9c1b512016-09-06 20:57:50 +00001653 // Handle execute permission.
1654 const char exec_perm_char = line_extractor.GetChar();
1655 if (exec_perm_char == 'x')
1656 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eYes);
1657 else if (exec_perm_char == '-')
1658 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1659 else
1660 return Error("unexpected /proc/{pid}/maps exec permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001661
Kate Stoneb9c1b512016-09-06 20:57:50 +00001662 line_extractor.GetChar(); // Read the private bit
1663 line_extractor.SkipSpaces(); // Skip the separator
1664 line_extractor.GetHexMaxU64(false, 0); // Read the offset
1665 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1666 line_extractor.GetChar(); // Read the device id separator
1667 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1668 line_extractor.SkipSpaces(); // Skip the separator
1669 line_extractor.GetU64(0, 10); // Read the inode number
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001670
Kate Stoneb9c1b512016-09-06 20:57:50 +00001671 line_extractor.SkipSpaces();
1672 const char *name = line_extractor.Peek();
1673 if (name)
1674 memory_region_info.SetName(name);
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001675
Kate Stoneb9c1b512016-09-06 20:57:50 +00001676 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001677}
1678
Kate Stoneb9c1b512016-09-06 20:57:50 +00001679Error NativeProcessLinux::GetMemoryRegionInfo(lldb::addr_t load_addr,
1680 MemoryRegionInfo &range_info) {
1681 // FIXME review that the final memory region returned extends to the end of
1682 // the virtual address space,
1683 // with no perms if it is not mapped.
Todd Fialaaf245d12014-06-30 21:05:18 +00001684
Kate Stoneb9c1b512016-09-06 20:57:50 +00001685 // Use an approach that reads memory regions from /proc/{pid}/maps.
1686 // Assume proc maps entries are in ascending order.
1687 // FIXME assert if we find differently.
Todd Fialaaf245d12014-06-30 21:05:18 +00001688
Kate Stoneb9c1b512016-09-06 20:57:50 +00001689 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1690 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001691
Kate Stoneb9c1b512016-09-06 20:57:50 +00001692 if (m_supports_mem_region == LazyBool::eLazyBoolNo) {
1693 // We're done.
1694 error.SetErrorString("unsupported");
Todd Fialaaf245d12014-06-30 21:05:18 +00001695 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001696 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001697
Kate Stoneb9c1b512016-09-06 20:57:50 +00001698 // If our cache is empty, pull the latest. There should always be at least
1699 // one memory region
1700 // if memory region handling is supported.
1701 if (m_mem_region_cache.empty()) {
1702 error = ProcFileReader::ProcessLineByLine(
1703 GetID(), "maps", [&](const std::string &line) -> bool {
1704 MemoryRegionInfo info;
1705 const Error parse_error =
1706 ParseMemoryRegionInfoFromProcMapsLine(line, info);
1707 if (parse_error.Success()) {
1708 m_mem_region_cache.push_back(info);
1709 return true;
1710 } else {
1711 if (log)
1712 log->Printf("NativeProcessLinux::%s failed to parse proc maps "
1713 "line '%s': %s",
1714 __FUNCTION__, line.c_str(), error.AsCString());
1715 return false;
1716 }
1717 });
Todd Fialaaf245d12014-06-30 21:05:18 +00001718
Kate Stoneb9c1b512016-09-06 20:57:50 +00001719 // If we had an error, we'll mark unsupported.
1720 if (error.Fail()) {
1721 m_supports_mem_region = LazyBool::eLazyBoolNo;
1722 return error;
1723 } else if (m_mem_region_cache.empty()) {
1724 // No entries after attempting to read them. This shouldn't happen if
1725 // /proc/{pid}/maps
1726 // is supported. Assume we don't support map entries via procfs.
1727 if (log)
1728 log->Printf("NativeProcessLinux::%s failed to find any procfs maps "
1729 "entries, assuming no support for memory region metadata "
1730 "retrieval",
1731 __FUNCTION__);
1732 m_supports_mem_region = LazyBool::eLazyBoolNo;
1733 error.SetErrorString("not supported");
1734 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00001735 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001736
1737 if (log)
1738 log->Printf("NativeProcessLinux::%s read %" PRIu64
1739 " memory region entries from /proc/%" PRIu64 "/maps",
1740 __FUNCTION__,
1741 static_cast<uint64_t>(m_mem_region_cache.size()), GetID());
1742
1743 // We support memory retrieval, remember that.
1744 m_supports_mem_region = LazyBool::eLazyBoolYes;
1745 } else {
1746 if (log)
1747 log->Printf("NativeProcessLinux::%s reusing %" PRIu64
1748 " cached memory region entries",
1749 __FUNCTION__,
1750 static_cast<uint64_t>(m_mem_region_cache.size()));
1751 }
1752
1753 lldb::addr_t prev_base_address = 0;
1754
1755 // FIXME start by finding the last region that is <= target address using
1756 // binary search. Data is sorted.
1757 // There can be a ton of regions on pthreads apps with lots of threads.
1758 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end();
1759 ++it) {
1760 MemoryRegionInfo &proc_entry_info = *it;
1761
1762 // Sanity check assumption that /proc/{pid}/maps entries are ascending.
1763 assert((proc_entry_info.GetRange().GetRangeBase() >= prev_base_address) &&
1764 "descending /proc/pid/maps entries detected, unexpected");
1765 prev_base_address = proc_entry_info.GetRange().GetRangeBase();
1766
1767 // If the target address comes before this entry, indicate distance to next
1768 // region.
1769 if (load_addr < proc_entry_info.GetRange().GetRangeBase()) {
1770 range_info.GetRange().SetRangeBase(load_addr);
1771 range_info.GetRange().SetByteSize(
1772 proc_entry_info.GetRange().GetRangeBase() - load_addr);
1773 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1774 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1775 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1776 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1777
1778 return error;
1779 } else if (proc_entry_info.GetRange().Contains(load_addr)) {
1780 // The target address is within the memory region we're processing here.
1781 range_info = proc_entry_info;
1782 return error;
1783 }
1784
1785 // The target memory address comes somewhere after the region we just
1786 // parsed.
1787 }
1788
1789 // If we made it here, we didn't find an entry that contained the given
1790 // address. Return the
1791 // load_addr as start and the amount of bytes betwwen load address and the end
1792 // of the memory as
1793 // size.
1794 range_info.GetRange().SetRangeBase(load_addr);
1795 range_info.GetRange().SetRangeEnd(LLDB_INVALID_ADDRESS);
1796 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo);
1797 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo);
1798 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo);
1799 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1800 return error;
1801}
1802
1803void NativeProcessLinux::DoStopIDBumped(uint32_t newBumpId) {
1804 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1805 if (log)
1806 log->Printf("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called",
1807 __FUNCTION__, newBumpId);
1808
1809 if (log)
1810 log->Printf("NativeProcessLinux::%s clearing %" PRIu64
1811 " entries from the cache",
1812 __FUNCTION__, static_cast<uint64_t>(m_mem_region_cache.size()));
1813 m_mem_region_cache.clear();
1814}
1815
1816Error NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions,
1817 lldb::addr_t &addr) {
1818// FIXME implementing this requires the equivalent of
1819// InferiorCallPOSIX::InferiorCallMmap, which depends on
1820// functional ThreadPlans working with Native*Protocol.
1821#if 1
1822 return Error("not implemented yet");
1823#else
1824 addr = LLDB_INVALID_ADDRESS;
1825
1826 unsigned prot = 0;
1827 if (permissions & lldb::ePermissionsReadable)
1828 prot |= eMmapProtRead;
1829 if (permissions & lldb::ePermissionsWritable)
1830 prot |= eMmapProtWrite;
1831 if (permissions & lldb::ePermissionsExecutable)
1832 prot |= eMmapProtExec;
1833
1834 // TODO implement this directly in NativeProcessLinux
1835 // (and lift to NativeProcessPOSIX if/when that class is
1836 // refactored out).
1837 if (InferiorCallMmap(this, addr, 0, size, prot,
1838 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
1839 m_addr_to_mmap_size[addr] = size;
1840 return Error();
1841 } else {
1842 addr = LLDB_INVALID_ADDRESS;
1843 return Error("unable to allocate %" PRIu64
1844 " bytes of memory with permissions %s",
1845 size, GetPermissionsAsCString(permissions));
1846 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001847#endif
1848}
1849
Kate Stoneb9c1b512016-09-06 20:57:50 +00001850Error NativeProcessLinux::DeallocateMemory(lldb::addr_t addr) {
1851 // FIXME see comments in AllocateMemory - required lower-level
1852 // bits not in place yet (ThreadPlans)
1853 return Error("not implemented");
Todd Fialaaf245d12014-06-30 21:05:18 +00001854}
1855
Kate Stoneb9c1b512016-09-06 20:57:50 +00001856lldb::addr_t NativeProcessLinux::GetSharedLibraryInfoAddress() {
1857 // punt on this for now
1858 return LLDB_INVALID_ADDRESS;
Todd Fialaaf245d12014-06-30 21:05:18 +00001859}
1860
Kate Stoneb9c1b512016-09-06 20:57:50 +00001861size_t NativeProcessLinux::UpdateThreads() {
1862 // The NativeProcessLinux monitoring threads are always up to date
1863 // with respect to thread state and they keep the thread list
1864 // populated properly. All this method needs to do is return the
1865 // thread count.
1866 return m_threads.size();
Todd Fialaaf245d12014-06-30 21:05:18 +00001867}
1868
Kate Stoneb9c1b512016-09-06 20:57:50 +00001869bool NativeProcessLinux::GetArchitecture(ArchSpec &arch) const {
1870 arch = m_arch;
1871 return true;
Todd Fialaaf245d12014-06-30 21:05:18 +00001872}
1873
Kate Stoneb9c1b512016-09-06 20:57:50 +00001874Error NativeProcessLinux::GetSoftwareBreakpointPCOffset(
1875 uint32_t &actual_opcode_size) {
1876 // FIXME put this behind a breakpoint protocol class that can be
1877 // set per architecture. Need ARM, MIPS support here.
1878 static const uint8_t g_i386_opcode[] = {0xCC};
1879 static const uint8_t g_s390x_opcode[] = {0x00, 0x01};
Todd Fialaaf245d12014-06-30 21:05:18 +00001880
Kate Stoneb9c1b512016-09-06 20:57:50 +00001881 switch (m_arch.GetMachine()) {
1882 case llvm::Triple::x86:
1883 case llvm::Triple::x86_64:
1884 actual_opcode_size = static_cast<uint32_t>(sizeof(g_i386_opcode));
1885 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001886
Kate Stoneb9c1b512016-09-06 20:57:50 +00001887 case llvm::Triple::systemz:
1888 actual_opcode_size = static_cast<uint32_t>(sizeof(g_s390x_opcode));
1889 return Error();
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001890
Kate Stoneb9c1b512016-09-06 20:57:50 +00001891 case llvm::Triple::arm:
1892 case llvm::Triple::aarch64:
1893 case llvm::Triple::mips64:
1894 case llvm::Triple::mips64el:
1895 case llvm::Triple::mips:
1896 case llvm::Triple::mipsel:
1897 // On these architectures the PC don't get updated for breakpoint hits
1898 actual_opcode_size = 0;
1899 return Error();
1900
1901 default:
1902 assert(false && "CPU type not supported!");
1903 return Error("CPU type not supported");
1904 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001905}
1906
Kate Stoneb9c1b512016-09-06 20:57:50 +00001907Error NativeProcessLinux::SetBreakpoint(lldb::addr_t addr, uint32_t size,
1908 bool hardware) {
1909 if (hardware)
1910 return Error("NativeProcessLinux does not support hardware breakpoints");
1911 else
1912 return SetSoftwareBreakpoint(addr, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00001913}
1914
Kate Stoneb9c1b512016-09-06 20:57:50 +00001915Error NativeProcessLinux::GetSoftwareBreakpointTrapOpcode(
1916 size_t trap_opcode_size_hint, size_t &actual_opcode_size,
1917 const uint8_t *&trap_opcode_bytes) {
1918 // FIXME put this behind a breakpoint protocol class that can be set per
1919 // architecture. Need MIPS support here.
1920 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4};
1921 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
1922 // linux kernel does otherwise.
1923 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7};
1924 static const uint8_t g_i386_opcode[] = {0xCC};
1925 static const uint8_t g_mips64_opcode[] = {0x00, 0x00, 0x00, 0x0d};
1926 static const uint8_t g_mips64el_opcode[] = {0x0d, 0x00, 0x00, 0x00};
1927 static const uint8_t g_s390x_opcode[] = {0x00, 0x01};
1928 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde};
Todd Fialaaf245d12014-06-30 21:05:18 +00001929
Kate Stoneb9c1b512016-09-06 20:57:50 +00001930 switch (m_arch.GetMachine()) {
1931 case llvm::Triple::aarch64:
1932 trap_opcode_bytes = g_aarch64_opcode;
1933 actual_opcode_size = sizeof(g_aarch64_opcode);
1934 return Error();
Todd Fiala2afc5962014-08-21 16:42:31 +00001935
Kate Stoneb9c1b512016-09-06 20:57:50 +00001936 case llvm::Triple::arm:
1937 switch (trap_opcode_size_hint) {
1938 case 2:
1939 trap_opcode_bytes = g_thumb_breakpoint_opcode;
1940 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
1941 return Error();
1942 case 4:
1943 trap_opcode_bytes = g_arm_breakpoint_opcode;
1944 actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
1945 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001946 default:
Kate Stoneb9c1b512016-09-06 20:57:50 +00001947 assert(false && "Unrecognised trap opcode size hint!");
1948 return Error("Unrecognised trap opcode size hint!");
Todd Fialaaf245d12014-06-30 21:05:18 +00001949 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001950
1951 case llvm::Triple::x86:
1952 case llvm::Triple::x86_64:
1953 trap_opcode_bytes = g_i386_opcode;
1954 actual_opcode_size = sizeof(g_i386_opcode);
1955 return Error();
1956
1957 case llvm::Triple::mips:
1958 case llvm::Triple::mips64:
1959 trap_opcode_bytes = g_mips64_opcode;
1960 actual_opcode_size = sizeof(g_mips64_opcode);
1961 return Error();
1962
1963 case llvm::Triple::mipsel:
1964 case llvm::Triple::mips64el:
1965 trap_opcode_bytes = g_mips64el_opcode;
1966 actual_opcode_size = sizeof(g_mips64el_opcode);
1967 return Error();
1968
1969 case llvm::Triple::systemz:
1970 trap_opcode_bytes = g_s390x_opcode;
1971 actual_opcode_size = sizeof(g_s390x_opcode);
1972 return Error();
1973
1974 default:
1975 assert(false && "CPU type not supported!");
1976 return Error("CPU type not supported");
1977 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001978}
1979
1980#if 0
1981ProcessMessage::CrashReason
1982NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info)
1983{
1984 ProcessMessage::CrashReason reason;
1985 assert(info->si_signo == SIGSEGV);
1986
1987 reason = ProcessMessage::eInvalidCrashReason;
1988
1989 switch (info->si_code)
1990 {
1991 default:
1992 assert(false && "unexpected si_code for SIGSEGV");
1993 break;
1994 case SI_KERNEL:
1995 // Linux will occasionally send spurious SI_KERNEL codes.
1996 // (this is poorly documented in sigaction)
1997 // One way to get this is via unaligned SIMD loads.
1998 reason = ProcessMessage::eInvalidAddress; // for lack of anything better
1999 break;
2000 case SEGV_MAPERR:
2001 reason = ProcessMessage::eInvalidAddress;
2002 break;
2003 case SEGV_ACCERR:
2004 reason = ProcessMessage::ePrivilegedAddress;
2005 break;
2006 }
2007
2008 return reason;
2009}
2010#endif
2011
Todd Fialaaf245d12014-06-30 21:05:18 +00002012#if 0
2013ProcessMessage::CrashReason
2014NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info)
2015{
2016 ProcessMessage::CrashReason reason;
2017 assert(info->si_signo == SIGILL);
2018
2019 reason = ProcessMessage::eInvalidCrashReason;
2020
2021 switch (info->si_code)
2022 {
2023 default:
2024 assert(false && "unexpected si_code for SIGILL");
2025 break;
2026 case ILL_ILLOPC:
2027 reason = ProcessMessage::eIllegalOpcode;
2028 break;
2029 case ILL_ILLOPN:
2030 reason = ProcessMessage::eIllegalOperand;
2031 break;
2032 case ILL_ILLADR:
2033 reason = ProcessMessage::eIllegalAddressingMode;
2034 break;
2035 case ILL_ILLTRP:
2036 reason = ProcessMessage::eIllegalTrap;
2037 break;
2038 case ILL_PRVOPC:
2039 reason = ProcessMessage::ePrivilegedOpcode;
2040 break;
2041 case ILL_PRVREG:
2042 reason = ProcessMessage::ePrivilegedRegister;
2043 break;
2044 case ILL_COPROC:
2045 reason = ProcessMessage::eCoprocessorError;
2046 break;
2047 case ILL_BADSTK:
2048 reason = ProcessMessage::eInternalStackError;
2049 break;
2050 }
2051
2052 return reason;
2053}
2054#endif
2055
2056#if 0
2057ProcessMessage::CrashReason
2058NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info)
2059{
2060 ProcessMessage::CrashReason reason;
2061 assert(info->si_signo == SIGFPE);
2062
2063 reason = ProcessMessage::eInvalidCrashReason;
2064
2065 switch (info->si_code)
2066 {
2067 default:
2068 assert(false && "unexpected si_code for SIGFPE");
2069 break;
2070 case FPE_INTDIV:
2071 reason = ProcessMessage::eIntegerDivideByZero;
2072 break;
2073 case FPE_INTOVF:
2074 reason = ProcessMessage::eIntegerOverflow;
2075 break;
2076 case FPE_FLTDIV:
2077 reason = ProcessMessage::eFloatDivideByZero;
2078 break;
2079 case FPE_FLTOVF:
2080 reason = ProcessMessage::eFloatOverflow;
2081 break;
2082 case FPE_FLTUND:
2083 reason = ProcessMessage::eFloatUnderflow;
2084 break;
2085 case FPE_FLTRES:
2086 reason = ProcessMessage::eFloatInexactResult;
2087 break;
2088 case FPE_FLTINV:
2089 reason = ProcessMessage::eFloatInvalidOperation;
2090 break;
2091 case FPE_FLTSUB:
2092 reason = ProcessMessage::eFloatSubscriptRange;
2093 break;
2094 }
2095
2096 return reason;
2097}
2098#endif
2099
2100#if 0
2101ProcessMessage::CrashReason
2102NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info)
2103{
2104 ProcessMessage::CrashReason reason;
2105 assert(info->si_signo == SIGBUS);
2106
2107 reason = ProcessMessage::eInvalidCrashReason;
2108
2109 switch (info->si_code)
2110 {
2111 default:
2112 assert(false && "unexpected si_code for SIGBUS");
2113 break;
2114 case BUS_ADRALN:
2115 reason = ProcessMessage::eIllegalAlignment;
2116 break;
2117 case BUS_ADRERR:
2118 reason = ProcessMessage::eIllegalAddress;
2119 break;
2120 case BUS_OBJERR:
2121 reason = ProcessMessage::eHardwareError;
2122 break;
2123 }
2124
2125 return reason;
2126}
2127#endif
2128
Kate Stoneb9c1b512016-09-06 20:57:50 +00002129Error NativeProcessLinux::ReadMemory(lldb::addr_t addr, void *buf, size_t size,
2130 size_t &bytes_read) {
2131 if (ProcessVmReadvSupported()) {
2132 // The process_vm_readv path is about 50 times faster than ptrace api. We
2133 // want to use
2134 // this syscall if it is supported.
Pavel Labathdf7c6992015-06-17 18:38:49 +00002135
Kate Stoneb9c1b512016-09-06 20:57:50 +00002136 const ::pid_t pid = GetID();
Pavel Labathdf7c6992015-06-17 18:38:49 +00002137
Kate Stoneb9c1b512016-09-06 20:57:50 +00002138 struct iovec local_iov, remote_iov;
2139 local_iov.iov_base = buf;
2140 local_iov.iov_len = size;
2141 remote_iov.iov_base = reinterpret_cast<void *>(addr);
2142 remote_iov.iov_len = size;
Pavel Labathdf7c6992015-06-17 18:38:49 +00002143
Kate Stoneb9c1b512016-09-06 20:57:50 +00002144 bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0);
2145 const bool success = bytes_read == size;
Pavel Labathdf7c6992015-06-17 18:38:49 +00002146
Kate Stoneb9c1b512016-09-06 20:57:50 +00002147 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
Pavel Labath19cbe962015-07-21 13:20:32 +00002148 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002149 log->Printf("NativeProcessLinux::%s using process_vm_readv to read %zd "
2150 "bytes from inferior address 0x%" PRIx64 ": %s",
2151 __FUNCTION__, size, addr,
2152 success ? "Success" : strerror(errno));
Pavel Labath19cbe962015-07-21 13:20:32 +00002153
Kate Stoneb9c1b512016-09-06 20:57:50 +00002154 if (success)
2155 return Error();
2156 // else
2157 // the call failed for some reason, let's retry the read using ptrace
2158 // api.
2159 }
Pavel Labath19cbe962015-07-21 13:20:32 +00002160
Kate Stoneb9c1b512016-09-06 20:57:50 +00002161 unsigned char *dst = static_cast<unsigned char *>(buf);
2162 size_t remainder;
2163 long data;
Pavel Labath19cbe962015-07-21 13:20:32 +00002164
Kate Stoneb9c1b512016-09-06 20:57:50 +00002165 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_ALL));
2166 if (log)
2167 ProcessPOSIXLog::IncNestLevel();
2168 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2169 log->GetMask().Test(POSIX_LOG_MEMORY))
2170 log->Printf("NativeProcessLinux::%s(%p, %p, %zd, _)", __FUNCTION__,
2171 (void *)addr, buf, size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002172
Kate Stoneb9c1b512016-09-06 20:57:50 +00002173 for (bytes_read = 0; bytes_read < size; bytes_read += remainder) {
2174 Error error = NativeProcessLinux::PtraceWrapper(
2175 PTRACE_PEEKDATA, GetID(), (void *)addr, nullptr, 0, &data);
2176 if (error.Fail()) {
2177 if (log)
Pavel Labath19cbe962015-07-21 13:20:32 +00002178 ProcessPOSIXLog::DecNestLevel();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002179 return error;
2180 }
2181
2182 remainder = size - bytes_read;
2183 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2184
2185 // Copy the data into our buffer
2186 memcpy(dst, &data, remainder);
2187
2188 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2189 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2190 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2191 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) {
2192 uintptr_t print_dst = 0;
2193 // Format bytes from data by moving into print_dst for log output
2194 for (unsigned i = 0; i < remainder; ++i)
2195 print_dst |= (((data >> i * 8) & 0xFF) << i * 8);
2196 log->Printf("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64
2197 " (0x%" PRIx64 ")",
2198 __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data));
2199 }
2200 addr += k_ptrace_word_size;
2201 dst += k_ptrace_word_size;
2202 }
2203
2204 if (log)
2205 ProcessPOSIXLog::DecNestLevel();
2206 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00002207}
2208
Kate Stoneb9c1b512016-09-06 20:57:50 +00002209Error NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf,
2210 size_t size,
2211 size_t &bytes_read) {
2212 Error error = ReadMemory(addr, buf, size, bytes_read);
2213 if (error.Fail())
Pavel Labath19cbe962015-07-21 13:20:32 +00002214 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002215 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002216}
2217
Kate Stoneb9c1b512016-09-06 20:57:50 +00002218Error NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf,
2219 size_t size, size_t &bytes_written) {
2220 const unsigned char *src = static_cast<const unsigned char *>(buf);
2221 size_t remainder;
2222 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002223
Kate Stoneb9c1b512016-09-06 20:57:50 +00002224 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_ALL));
2225 if (log)
2226 ProcessPOSIXLog::IncNestLevel();
2227 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2228 log->GetMask().Test(POSIX_LOG_MEMORY))
2229 log->Printf("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__,
2230 addr, buf, size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002231
Kate Stoneb9c1b512016-09-06 20:57:50 +00002232 for (bytes_written = 0; bytes_written < size; bytes_written += remainder) {
2233 remainder = size - bytes_written;
2234 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
Chaoren Lin97ccc292015-02-03 01:51:12 +00002235
Kate Stoneb9c1b512016-09-06 20:57:50 +00002236 if (remainder == k_ptrace_word_size) {
2237 unsigned long data = 0;
2238 memcpy(&data, src, k_ptrace_word_size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002239
Kate Stoneb9c1b512016-09-06 20:57:50 +00002240 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2241 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2242 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2243 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2244 log->Printf("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2245 (void *)addr, *(const unsigned long *)src, data);
2246
2247 error = NativeProcessLinux::PtraceWrapper(PTRACE_POKEDATA, GetID(),
2248 (void *)addr, (void *)data);
2249 if (error.Fail()) {
2250 if (log)
2251 ProcessPOSIXLog::DecNestLevel();
2252 return error;
2253 }
2254 } else {
2255 unsigned char buff[8];
2256 size_t bytes_read;
2257 error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read);
2258 if (error.Fail()) {
2259 if (log)
2260 ProcessPOSIXLog::DecNestLevel();
2261 return error;
2262 }
2263
2264 memcpy(buff, src, remainder);
2265
2266 size_t bytes_written_rec;
2267 error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec);
2268 if (error.Fail()) {
2269 if (log)
2270 ProcessPOSIXLog::DecNestLevel();
2271 return error;
2272 }
2273
2274 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2275 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2276 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2277 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2278 log->Printf("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2279 (void *)addr, *(const unsigned long *)src,
2280 *(unsigned long *)buff);
Todd Fialaaf245d12014-06-30 21:05:18 +00002281 }
2282
Kate Stoneb9c1b512016-09-06 20:57:50 +00002283 addr += k_ptrace_word_size;
2284 src += k_ptrace_word_size;
2285 }
2286 if (log)
2287 ProcessPOSIXLog::DecNestLevel();
2288 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002289}
2290
Kate Stoneb9c1b512016-09-06 20:57:50 +00002291Error NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) {
2292 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo);
2293}
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002294
Kate Stoneb9c1b512016-09-06 20:57:50 +00002295Error NativeProcessLinux::GetEventMessage(lldb::tid_t tid,
2296 unsigned long *message) {
2297 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message);
2298}
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002299
Kate Stoneb9c1b512016-09-06 20:57:50 +00002300Error NativeProcessLinux::Detach(lldb::tid_t tid) {
2301 if (tid == LLDB_INVALID_THREAD_ID)
2302 return Error();
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002303
Kate Stoneb9c1b512016-09-06 20:57:50 +00002304 return PtraceWrapper(PTRACE_DETACH, tid);
2305}
2306
2307bool NativeProcessLinux::HasThreadNoLock(lldb::tid_t thread_id) {
2308 for (auto thread_sp : m_threads) {
2309 assert(thread_sp && "thread list should not contain NULL threads");
2310 if (thread_sp->GetID() == thread_id) {
2311 // We have this thread.
2312 return true;
Todd Fialaaf245d12014-06-30 21:05:18 +00002313 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002314 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002315
Kate Stoneb9c1b512016-09-06 20:57:50 +00002316 // We don't have this thread.
2317 return false;
Todd Fialaaf245d12014-06-30 21:05:18 +00002318}
2319
Kate Stoneb9c1b512016-09-06 20:57:50 +00002320bool NativeProcessLinux::StopTrackingThread(lldb::tid_t thread_id) {
2321 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
Todd Fialaaf245d12014-06-30 21:05:18 +00002322
Kate Stoneb9c1b512016-09-06 20:57:50 +00002323 if (log)
2324 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
Todd Fialaaf245d12014-06-30 21:05:18 +00002325 thread_id);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002326
2327 bool found = false;
2328
2329 for (auto it = m_threads.begin(); it != m_threads.end(); ++it) {
2330 if (*it && ((*it)->GetID() == thread_id)) {
2331 m_threads.erase(it);
2332 found = true;
2333 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00002334 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002335 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002336
Kate Stoneb9c1b512016-09-06 20:57:50 +00002337 SignalIfAllThreadsStopped();
Todd Fialaaf245d12014-06-30 21:05:18 +00002338
Kate Stoneb9c1b512016-09-06 20:57:50 +00002339 return found;
Todd Fialaaf245d12014-06-30 21:05:18 +00002340}
2341
Kate Stoneb9c1b512016-09-06 20:57:50 +00002342NativeThreadLinuxSP NativeProcessLinux::AddThread(lldb::tid_t thread_id) {
2343 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD));
Todd Fialaaf245d12014-06-30 21:05:18 +00002344
Kate Stoneb9c1b512016-09-06 20:57:50 +00002345 if (log) {
2346 log->Printf("NativeProcessLinux::%s pid %" PRIu64
2347 " adding thread with tid %" PRIu64,
2348 __FUNCTION__, GetID(), thread_id);
2349 }
Todd Fialaaf245d12014-06-30 21:05:18 +00002350
Kate Stoneb9c1b512016-09-06 20:57:50 +00002351 assert(!HasThreadNoLock(thread_id) &&
2352 "attempted to add a thread by id that already exists");
Todd Fialaaf245d12014-06-30 21:05:18 +00002353
Kate Stoneb9c1b512016-09-06 20:57:50 +00002354 // If this is the first thread, save it as the current thread
2355 if (m_threads.empty())
2356 SetCurrentThreadID(thread_id);
Todd Fialaaf245d12014-06-30 21:05:18 +00002357
Kate Stoneb9c1b512016-09-06 20:57:50 +00002358 auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id);
2359 m_threads.push_back(thread_sp);
2360 return thread_sp;
2361}
Todd Fialaaf245d12014-06-30 21:05:18 +00002362
Kate Stoneb9c1b512016-09-06 20:57:50 +00002363Error NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread) {
2364 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS));
Todd Fialaaf245d12014-06-30 21:05:18 +00002365
Kate Stoneb9c1b512016-09-06 20:57:50 +00002366 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002367
Kate Stoneb9c1b512016-09-06 20:57:50 +00002368 // Find out the size of a breakpoint (might depend on where we are in the
2369 // code).
2370 NativeRegisterContextSP context_sp = thread.GetRegisterContext();
2371 if (!context_sp) {
2372 error.SetErrorString("cannot get a NativeRegisterContext for the thread");
Todd Fialaaf245d12014-06-30 21:05:18 +00002373 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002374 log->Printf("NativeProcessLinux::%s failed: %s", __FUNCTION__,
2375 error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +00002376 return error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002377 }
Chaoren Linfa03ad22015-02-03 01:50:42 +00002378
Kate Stoneb9c1b512016-09-06 20:57:50 +00002379 uint32_t breakpoint_size = 0;
2380 error = GetSoftwareBreakpointPCOffset(breakpoint_size);
2381 if (error.Fail()) {
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002382 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002383 log->Printf("NativeProcessLinux::%s GetBreakpointSize() failed: %s",
2384 __FUNCTION__, error.AsCString());
2385 return error;
2386 } else {
2387 if (log)
2388 log->Printf("NativeProcessLinux::%s breakpoint size: %" PRIu32,
2389 __FUNCTION__, breakpoint_size);
2390 }
Pavel Labathc0765592015-05-06 10:46:34 +00002391
Kate Stoneb9c1b512016-09-06 20:57:50 +00002392 // First try probing for a breakpoint at a software breakpoint location: PC -
2393 // breakpoint size.
2394 const lldb::addr_t initial_pc_addr =
2395 context_sp->GetPCfromBreakpointLocation();
2396 lldb::addr_t breakpoint_addr = initial_pc_addr;
2397 if (breakpoint_size > 0) {
2398 // Do not allow breakpoint probe to wrap around.
2399 if (breakpoint_addr >= breakpoint_size)
2400 breakpoint_addr -= breakpoint_size;
2401 }
2402
2403 // Check if we stopped because of a breakpoint.
2404 NativeBreakpointSP breakpoint_sp;
2405 error = m_breakpoint_list.GetBreakpoint(breakpoint_addr, breakpoint_sp);
2406 if (!error.Success() || !breakpoint_sp) {
2407 // We didn't find one at a software probe location. Nothing to do.
2408 if (log)
2409 log->Printf(
2410 "NativeProcessLinux::%s pid %" PRIu64
2411 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64,
2412 __FUNCTION__, GetID(), breakpoint_addr);
2413 return Error();
2414 }
2415
2416 // If the breakpoint is not a software breakpoint, nothing to do.
2417 if (!breakpoint_sp->IsSoftwareBreakpoint()) {
2418 if (log)
2419 log->Printf("NativeProcessLinux::%s pid %" PRIu64
2420 " breakpoint found at 0x%" PRIx64
2421 ", not software, nothing to adjust",
2422 __FUNCTION__, GetID(), breakpoint_addr);
2423 return Error();
2424 }
2425
2426 //
2427 // We have a software breakpoint and need to adjust the PC.
2428 //
2429
2430 // Sanity check.
2431 if (breakpoint_size == 0) {
2432 // Nothing to do! How did we get here?
2433 if (log)
2434 log->Printf(
2435 "NativeProcessLinux::%s pid %" PRIu64
2436 " breakpoint found at 0x%" PRIx64
2437 ", it is software, but the size is zero, nothing to do (unexpected)",
2438 __FUNCTION__, GetID(), breakpoint_addr);
2439 return Error();
2440 }
2441
2442 // Change the program counter.
2443 if (log)
2444 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64
2445 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64,
2446 __FUNCTION__, GetID(), thread.GetID(), initial_pc_addr,
2447 breakpoint_addr);
2448
2449 error = context_sp->SetPC(breakpoint_addr);
2450 if (error.Fail()) {
2451 if (log)
2452 log->Printf("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64
2453 ": failed to set PC: %s",
2454 __FUNCTION__, GetID(), thread.GetID(), error.AsCString());
2455 return error;
2456 }
2457
2458 return error;
2459}
2460
2461Error NativeProcessLinux::GetLoadedModuleFileSpec(const char *module_path,
2462 FileSpec &file_spec) {
2463 FileSpec module_file_spec(module_path, true);
2464
2465 bool found = false;
2466 file_spec.Clear();
2467 ProcFileReader::ProcessLineByLine(
2468 GetID(), "maps", [&](const std::string &line) {
2469 SmallVector<StringRef, 16> columns;
2470 StringRef(line).split(columns, " ", -1, false);
2471 if (columns.size() < 6)
2472 return true; // continue searching
2473
2474 FileSpec this_file_spec(columns[5].str().c_str(), false);
2475 if (this_file_spec.GetFilename() != module_file_spec.GetFilename())
2476 return true; // continue searching
2477
2478 file_spec = this_file_spec;
2479 found = true;
2480 return false; // we are done
2481 });
2482
2483 if (!found)
2484 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
2485 module_file_spec.GetFilename().AsCString(), GetID());
2486
2487 return Error();
2488}
2489
2490Error NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef &file_name,
2491 lldb::addr_t &load_addr) {
2492 load_addr = LLDB_INVALID_ADDRESS;
2493 Error error = ProcFileReader::ProcessLineByLine(
2494 GetID(), "maps", [&](const std::string &line) -> bool {
2495 StringRef maps_row(line);
2496
2497 SmallVector<StringRef, 16> maps_columns;
2498 maps_row.split(maps_columns, StringRef(" "), -1, false);
2499
2500 if (maps_columns.size() < 6) {
2501 // Return true to continue reading the proc file
2502 return true;
2503 }
2504
2505 if (maps_columns[5] == file_name) {
2506 StringExtractor addr_extractor(maps_columns[0].str().c_str());
2507 load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2508
2509 // Return false to stop reading the proc file further
2510 return false;
2511 }
2512
2513 // Return true to continue reading the proc file
2514 return true;
2515 });
2516 return error;
2517}
2518
2519NativeThreadLinuxSP NativeProcessLinux::GetThreadByID(lldb::tid_t tid) {
2520 return std::static_pointer_cast<NativeThreadLinux>(
2521 NativeProcessProtocol::GetThreadByID(tid));
2522}
2523
2524Error NativeProcessLinux::ResumeThread(NativeThreadLinux &thread,
2525 lldb::StateType state, int signo) {
2526 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
2527
2528 if (log)
2529 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
2530 thread.GetID());
2531
2532 // Before we do the resume below, first check if we have a pending
2533 // stop notification that is currently waiting for
2534 // all threads to stop. This is potentially a buggy situation since
2535 // we're ostensibly waiting for threads to stop before we send out the
2536 // pending notification, and here we are resuming one before we send
2537 // out the pending stop notification.
2538 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log) {
2539 log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64
2540 " per explicit request but we have a pending stop notification "
2541 "(tid %" PRIu64 ") that is actively waiting for this thread to "
2542 "stop. Valid sequence of events?",
2543 __FUNCTION__, thread.GetID(), m_pending_notification_tid);
2544 }
2545
2546 // Request a resume. We expect this to be synchronous and the system
2547 // to reflect it is running after this completes.
2548 switch (state) {
2549 case eStateRunning: {
2550 const auto resume_result = thread.Resume(signo);
2551 if (resume_result.Success())
2552 SetState(eStateRunning, true);
2553 return resume_result;
2554 }
2555 case eStateStepping: {
2556 const auto step_result = thread.SingleStep(signo);
2557 if (step_result.Success())
2558 SetState(eStateRunning, true);
2559 return step_result;
2560 }
2561 default:
2562 if (log)
2563 log->Printf("NativeProcessLinux::%s Unhandled state %s.", __FUNCTION__,
2564 StateAsCString(state));
2565 llvm_unreachable("Unhandled state for resume");
2566 }
Pavel Labathc0765592015-05-06 10:46:34 +00002567}
2568
2569//===----------------------------------------------------------------------===//
2570
Kate Stoneb9c1b512016-09-06 20:57:50 +00002571void NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) {
2572 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
Pavel Labathc0765592015-05-06 10:46:34 +00002573
Kate Stoneb9c1b512016-09-06 20:57:50 +00002574 if (log) {
2575 log->Printf("NativeProcessLinux::%s about to process event: "
2576 "(triggering_tid: %" PRIu64 ")",
Pavel Labathc0765592015-05-06 10:46:34 +00002577 __FUNCTION__, triggering_tid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002578 }
2579
2580 m_pending_notification_tid = triggering_tid;
2581
2582 // Request a stop for all the thread stops that need to be stopped
2583 // and are not already known to be stopped.
2584 for (const auto &thread_sp : m_threads) {
2585 if (StateIsRunningState(thread_sp->GetState()))
2586 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop();
2587 }
2588
2589 SignalIfAllThreadsStopped();
2590
2591 if (log) {
2592 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__);
2593 }
2594}
2595
2596void NativeProcessLinux::SignalIfAllThreadsStopped() {
2597 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID)
2598 return; // No pending notification. Nothing to do.
2599
2600 for (const auto &thread_sp : m_threads) {
2601 if (StateIsRunningState(thread_sp->GetState()))
2602 return; // Some threads are still running. Don't signal yet.
2603 }
2604
2605 // We have a pending notification and all threads have stopped.
2606 Log *log(
2607 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
2608
2609 // Clear any temporary breakpoints we used to implement software single
2610 // stepping.
2611 for (const auto &thread_info : m_threads_stepping_with_breakpoint) {
2612 Error error = RemoveBreakpoint(thread_info.second);
2613 if (error.Fail())
2614 if (log)
2615 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64
2616 " remove stepping breakpoint: %s",
2617 __FUNCTION__, thread_info.first, error.AsCString());
2618 }
2619 m_threads_stepping_with_breakpoint.clear();
2620
2621 // Notify the delegate about the stop
2622 SetCurrentThreadID(m_pending_notification_tid);
2623 SetState(StateType::eStateStopped, true);
2624 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
2625}
2626
2627void NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread) {
2628 Log *const log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_THREAD);
2629
2630 if (log)
2631 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__,
2632 thread.GetID());
2633
2634 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID &&
2635 StateIsRunningState(thread.GetState())) {
2636 // We will need to wait for this new thread to stop as well before firing
2637 // the
2638 // notification.
2639 thread.RequestStop();
2640 }
2641}
2642
2643void NativeProcessLinux::SigchldHandler() {
2644 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
2645 // Process all pending waitpid notifications.
2646 while (true) {
2647 int status = -1;
2648 ::pid_t wait_pid = waitpid(-1, &status, __WALL | __WNOTHREAD | WNOHANG);
2649
2650 if (wait_pid == 0)
2651 break; // We are done.
2652
2653 if (wait_pid == -1) {
2654 if (errno == EINTR)
2655 continue;
2656
2657 Error error(errno, eErrorTypePOSIX);
2658 if (log)
2659 log->Printf("NativeProcessLinux::%s waitpid (-1, &status, __WALL | "
2660 "__WNOTHREAD | WNOHANG) failed: %s",
2661 __FUNCTION__, error.AsCString());
2662 break;
Pavel Labathc0765592015-05-06 10:46:34 +00002663 }
2664
Kate Stoneb9c1b512016-09-06 20:57:50 +00002665 bool exited = false;
2666 int signal = 0;
2667 int exit_status = 0;
2668 const char *status_cstr = nullptr;
2669 if (WIFSTOPPED(status)) {
2670 signal = WSTOPSIG(status);
2671 status_cstr = "STOPPED";
2672 } else if (WIFEXITED(status)) {
2673 exit_status = WEXITSTATUS(status);
2674 status_cstr = "EXITED";
2675 exited = true;
2676 } else if (WIFSIGNALED(status)) {
2677 signal = WTERMSIG(status);
2678 status_cstr = "SIGNALED";
2679 if (wait_pid == static_cast<::pid_t>(GetID())) {
2680 exited = true;
2681 exit_status = -1;
2682 }
2683 } else
2684 status_cstr = "(\?\?\?)";
Pavel Labathc0765592015-05-06 10:46:34 +00002685
Pavel Labath5eb721e2015-05-07 08:30:31 +00002686 if (log)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002687 log->Printf("NativeProcessLinux::%s: waitpid (-1, &status, __WALL | "
2688 "__WNOTHREAD | WNOHANG)"
2689 "=> pid = %" PRIi32
2690 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
2691 __FUNCTION__, wait_pid, status, status_cstr, signal,
2692 exit_status);
Pavel Labathc0765592015-05-06 10:46:34 +00002693
Kate Stoneb9c1b512016-09-06 20:57:50 +00002694 MonitorCallback(wait_pid, exited, signal, exit_status);
2695 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002696}
2697
2698// Wrapper for ptrace to catch errors and log calls.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002699// Note that ptrace sets errno on error because -1 can be a valid result (i.e.
2700// for PTRACE_PEEK*)
2701Error NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr,
2702 void *data, size_t data_size,
2703 long *result) {
2704 Error error;
2705 long int ret;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002706
Kate Stoneb9c1b512016-09-06 20:57:50 +00002707 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE));
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002708
Kate Stoneb9c1b512016-09-06 20:57:50 +00002709 PtraceDisplayBytes(req, data, data_size);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002710
Kate Stoneb9c1b512016-09-06 20:57:50 +00002711 errno = 0;
2712 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
2713 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid),
2714 *(unsigned int *)addr, data);
2715 else
2716 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid),
2717 addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002718
Kate Stoneb9c1b512016-09-06 20:57:50 +00002719 if (ret == -1)
2720 error.SetErrorToErrno();
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002721
Kate Stoneb9c1b512016-09-06 20:57:50 +00002722 if (result)
2723 *result = ret;
Pavel Labath4a9babb2015-06-30 17:04:49 +00002724
Kate Stoneb9c1b512016-09-06 20:57:50 +00002725 if (log)
2726 log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr,
2727 data, data_size, ret);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002728
Kate Stoneb9c1b512016-09-06 20:57:50 +00002729 PtraceDisplayBytes(req, data, data_size);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002730
Kate Stoneb9c1b512016-09-06 20:57:50 +00002731 if (log && error.GetError() != 0) {
2732 const char *str;
2733 switch (error.GetError()) {
2734 case ESRCH:
2735 str = "ESRCH";
2736 break;
2737 case EINVAL:
2738 str = "EINVAL";
2739 break;
2740 case EBUSY:
2741 str = "EBUSY";
2742 break;
2743 case EPERM:
2744 str = "EPERM";
2745 break;
2746 default:
2747 str = error.AsCString();
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002748 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002749 log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str);
2750 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002751
Kate Stoneb9c1b512016-09-06 20:57:50 +00002752 return error;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002753}