blob: 4af5b6d1da96fceb89da7998d1a61b941440ec94 [file] [log] [blame]
Todd Fialaaf245d12014-06-30 21:05:18 +00001//===-- NativeProcessLinux.cpp -------------------------------- -*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Todd Fialaaf245d12014-06-30 21:05:18 +000010#include "NativeProcessLinux.h"
11
12// C Includes
13#include <errno.h>
Todd Fialaaf245d12014-06-30 21:05:18 +000014#include <string.h>
15#include <stdint.h>
16#include <unistd.h>
Todd Fialaaf245d12014-06-30 21:05:18 +000017
18// C++ Includes
19#include <fstream>
Pavel Labathdf7c6992015-06-17 18:38:49 +000020#include <mutex>
Pavel Labathc0765592015-05-06 10:46:34 +000021#include <sstream>
Todd Fialaaf245d12014-06-30 21:05:18 +000022#include <string>
Pavel Labath5b981ab2015-05-29 12:53:54 +000023#include <unordered_map>
Todd Fialaaf245d12014-06-30 21:05:18 +000024
25// Other libraries and framework includes
Tamas Berghammerd8c338d2015-04-15 09:47:02 +000026#include "lldb/Core/EmulateInstruction.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000027#include "lldb/Core/Error.h"
Oleksiy Vyalov6edef202014-11-17 22:16:42 +000028#include "lldb/Core/ModuleSpec.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000029#include "lldb/Core/RegisterValue.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000030#include "lldb/Core/State.h"
31#include "lldb/Host/Host.h"
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
Tamas Berghammer1e209fc2015-03-13 11:36:47 +000045#include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000046#include "NativeThreadLinux.h"
47#include "ProcFileReader.h"
Tamas Berghammer1e209fc2015-03-13 11:36:47 +000048#include "Procfs.h"
Todd Fialacacde7d2014-09-27 16:54:22 +000049
Tamas Berghammerd8584872015-02-06 10:57:40 +000050// System includes - They have to be included after framework includes because they define some
51// macros which collide with variable names in other modules
52#include <linux/unistd.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000053#include <sys/socket.h>
Vince Harron8b335672015-05-12 01:10:56 +000054
Pavel Labathdf7c6992015-06-17 18:38:49 +000055#include <sys/syscall.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000056#include <sys/types.h>
Tamas Berghammerd8584872015-02-06 10:57:40 +000057#include <sys/user.h>
58#include <sys/wait.h>
59
Vince Harron8b335672015-05-12 01:10:56 +000060#include "lldb/Host/linux/Personality.h"
61#include "lldb/Host/linux/Ptrace.h"
Pavel Labathdf7c6992015-06-17 18:38:49 +000062#include "lldb/Host/linux/Uio.h"
Todd Fialaaf245d12014-06-30 21:05:18 +000063
Todd Fialaaf245d12014-06-30 21:05:18 +000064// Support hardware breakpoints in case it has not been defined
65#ifndef TRAP_HWBKPT
66 #define TRAP_HWBKPT 4
67#endif
68
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +000069using namespace lldb;
70using namespace lldb_private;
Tamas Berghammerdb264a62015-03-31 09:52:22 +000071using namespace lldb_private::process_linux;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +000072using namespace llvm;
73
Todd Fialaaf245d12014-06-30 21:05:18 +000074// Private bits we only need internally.
Pavel Labathdf7c6992015-06-17 18:38:49 +000075
76static bool ProcessVmReadvSupported()
77{
78 static bool is_supported;
79 static std::once_flag flag;
80
81 std::call_once(flag, [] {
82 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
83
84 uint32_t source = 0x47424742;
85 uint32_t dest = 0;
86
87 struct iovec local, remote;
88 remote.iov_base = &source;
89 local.iov_base = &dest;
90 remote.iov_len = local.iov_len = sizeof source;
91
92 // We shall try if cross-process-memory reads work by attempting to read a value from our own process.
93 ssize_t res = process_vm_readv(getpid(), &local, 1, &remote, 1, 0);
94 is_supported = (res == sizeof(source) && source == dest);
95 if (log)
96 {
97 if (is_supported)
98 log->Printf("%s: Detected kernel support for process_vm_readv syscall. Fast memory reads enabled.",
99 __FUNCTION__);
100 else
101 log->Printf("%s: syscall process_vm_readv failed (error: %s). Fast memory reads disabled.",
102 __FUNCTION__, strerror(errno));
103 }
104 });
105
106 return is_supported;
107}
108
Todd Fialaaf245d12014-06-30 21:05:18 +0000109namespace
110{
Pavel Labath4abe5d62016-07-15 10:18:15 +0000111void
112MaybeLogLaunchInfo(const ProcessLaunchInfo &info)
113{
114 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
115 if (!log)
116 return;
117
118 if (const FileAction *action = info.GetFileActionForFD(STDIN_FILENO))
119 log->Printf("%s: setting STDIN to '%s'", __FUNCTION__, 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__, action->GetFileSpec().GetCString());
125 else
126 log->Printf("%s leaving STDOUT as is", __FUNCTION__);
127
128 if (const FileAction *action = info.GetFileActionForFD(STDERR_FILENO))
129 log->Printf("%s setting STDERR to '%s'", __FUNCTION__, action->GetFileSpec().GetCString());
130 else
131 log->Printf("%s leaving STDERR as is", __FUNCTION__);
132
133 int i = 0;
134 for (const char **args = info.GetArguments().GetConstArgumentVector(); *args; ++args, ++i)
135 log->Printf("%s arg %d: \"%s\"", __FUNCTION__, i, *args ? *args : "nullptr");
136}
137
138void
139DisplayBytes(StreamString &s, void *bytes, uint32_t count)
140{
141 uint8_t *ptr = (uint8_t *)bytes;
142 const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count);
143 for (uint32_t i = 0; i < loop_count; i++)
Todd Fialaaf245d12014-06-30 21:05:18 +0000144 {
Pavel Labath4abe5d62016-07-15 10:18:15 +0000145 s.Printf("[%x]", *ptr);
146 ptr++;
Todd Fialaaf245d12014-06-30 21:05:18 +0000147 }
Pavel Labath4abe5d62016-07-15 10:18:15 +0000148}
Todd Fialaaf245d12014-06-30 21:05:18 +0000149
150 void
151 PtraceDisplayBytes(int &req, void *data, size_t data_size)
152 {
153 StreamString buf;
154 Log *verbose_log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (
155 POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE));
156
157 if (verbose_log)
158 {
159 switch(req)
160 {
161 case PTRACE_POKETEXT:
162 {
163 DisplayBytes(buf, &data, 8);
164 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData());
165 break;
166 }
167 case PTRACE_POKEDATA:
168 {
169 DisplayBytes(buf, &data, 8);
170 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData());
171 break;
172 }
173 case PTRACE_POKEUSER:
174 {
175 DisplayBytes(buf, &data, 8);
176 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData());
177 break;
178 }
179 case PTRACE_SETREGS:
180 {
181 DisplayBytes(buf, data, data_size);
182 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData());
183 break;
184 }
185 case PTRACE_SETFPREGS:
186 {
187 DisplayBytes(buf, data, data_size);
188 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData());
189 break;
190 }
191 case PTRACE_SETSIGINFO:
192 {
193 DisplayBytes(buf, data, sizeof(siginfo_t));
194 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData());
195 break;
196 }
197 case PTRACE_SETREGSET:
198 {
199 // Extract iov_base from data, which is a pointer to the struct IOVEC
200 DisplayBytes(buf, *(void **)data, data_size);
201 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData());
202 break;
203 }
204 default:
205 {
206 }
207 }
208 }
209 }
210
Pavel Labath19cbe962015-07-21 13:20:32 +0000211 static constexpr unsigned k_ptrace_word_size = sizeof(void*);
212 static_assert(sizeof(long) >= k_ptrace_word_size, "Size of long must be larger than ptrace word size");
Pavel Labath1107b5a2015-04-17 14:07:49 +0000213} // end of anonymous namespace
214
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000215// Simple helper function to ensure flags are enabled on the given file
216// descriptor.
217static Error
218EnsureFDFlags(int fd, int flags)
219{
220 Error error;
221
222 int status = fcntl(fd, F_GETFL);
223 if (status == -1)
224 {
225 error.SetErrorToErrno();
226 return error;
227 }
228
229 if (fcntl(fd, F_SETFL, status | flags) == -1)
230 {
231 error.SetErrorToErrno();
232 return error;
233 }
234
235 return error;
236}
237
Todd Fialaaf245d12014-06-30 21:05:18 +0000238// -----------------------------------------------------------------------------
239// Public Static Methods
240// -----------------------------------------------------------------------------
241
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000242Error
Pavel Labathd5b310f2015-07-09 11:51:11 +0000243NativeProcessProtocol::Launch (
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000244 ProcessLaunchInfo &launch_info,
245 NativeProcessProtocol::NativeDelegate &native_delegate,
Pavel Labath19cbe962015-07-21 13:20:32 +0000246 MainLoop &mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000247 NativeProcessProtocolSP &native_process_sp)
248{
249 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
250
Pavel Labath2a86b552016-06-14 17:30:52 +0000251 Error error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000252
253 // Verify the working directory is valid if one was specified.
Chaoren Lind3173f32015-05-29 19:52:29 +0000254 FileSpec working_dir{launch_info.GetWorkingDirectory()};
255 if (working_dir &&
256 (!working_dir.ResolvePath() ||
257 working_dir.GetFileType() != FileSpec::eFileTypeDirectory))
Todd Fialaaf245d12014-06-30 21:05:18 +0000258 {
Chaoren Lind3173f32015-05-29 19:52:29 +0000259 error.SetErrorStringWithFormat ("No such file or directory: %s",
260 working_dir.GetCString());
261 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000262 }
263
Todd Fialaaf245d12014-06-30 21:05:18 +0000264 // Create the NativeProcessLinux in launch mode.
265 native_process_sp.reset (new NativeProcessLinux ());
266
Todd Fialaaf245d12014-06-30 21:05:18 +0000267 if (!native_process_sp->RegisterNativeDelegate (native_delegate))
268 {
269 native_process_sp.reset ();
270 error.SetErrorStringWithFormat ("failed to register the native delegate");
271 return error;
272 }
273
Pavel Labath4abe5d62016-07-15 10:18:15 +0000274 error = std::static_pointer_cast<NativeProcessLinux>(native_process_sp)->LaunchInferior(mainloop, launch_info);
Todd Fialaaf245d12014-06-30 21:05:18 +0000275
276 if (error.Fail ())
277 {
278 native_process_sp.reset ();
279 if (log)
280 log->Printf ("NativeProcessLinux::%s failed to launch process: %s", __FUNCTION__, error.AsCString ());
281 return error;
282 }
283
284 launch_info.SetProcessID (native_process_sp->GetID ());
285
286 return error;
287}
288
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000289Error
Pavel Labathd5b310f2015-07-09 11:51:11 +0000290NativeProcessProtocol::Attach (
Todd Fialaaf245d12014-06-30 21:05:18 +0000291 lldb::pid_t pid,
Tamas Berghammerdb264a62015-03-31 09:52:22 +0000292 NativeProcessProtocol::NativeDelegate &native_delegate,
Pavel Labath19cbe962015-07-21 13:20:32 +0000293 MainLoop &mainloop,
Todd Fialaaf245d12014-06-30 21:05:18 +0000294 NativeProcessProtocolSP &native_process_sp)
295{
296 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
297 if (log && log->GetMask ().Test (POSIX_LOG_VERBOSE))
298 log->Printf ("NativeProcessLinux::%s(pid = %" PRIi64 ")", __FUNCTION__, pid);
299
Todd Fialaaf245d12014-06-30 21:05:18 +0000300 // Retrieve the architecture for the running process.
301 ArchSpec process_arch;
Pavel Labath2a86b552016-06-14 17:30:52 +0000302 Error error = ResolveProcessArchitecture(pid, process_arch);
Todd Fialaaf245d12014-06-30 21:05:18 +0000303 if (!error.Success ())
304 return error;
305
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000306 std::shared_ptr<NativeProcessLinux> native_process_linux_sp (new NativeProcessLinux ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000307
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000308 if (!native_process_linux_sp->RegisterNativeDelegate (native_delegate))
Todd Fialaaf245d12014-06-30 21:05:18 +0000309 {
Todd Fialaaf245d12014-06-30 21:05:18 +0000310 error.SetErrorStringWithFormat ("failed to register the native delegate");
311 return error;
312 }
313
Pavel Labath19cbe962015-07-21 13:20:32 +0000314 native_process_linux_sp->AttachToInferior (mainloop, pid, error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000315 if (!error.Success ())
Todd Fialaaf245d12014-06-30 21:05:18 +0000316 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000317
Oleksiy Vyalov1339b5e2014-11-13 18:22:16 +0000318 native_process_sp = native_process_linux_sp;
Todd Fialaaf245d12014-06-30 21:05:18 +0000319 return error;
320}
321
322// -----------------------------------------------------------------------------
323// Public Instance Methods
324// -----------------------------------------------------------------------------
325
326NativeProcessLinux::NativeProcessLinux () :
327 NativeProcessProtocol (LLDB_INVALID_PROCESS_ID),
328 m_arch (),
Todd Fialaaf245d12014-06-30 21:05:18 +0000329 m_supports_mem_region (eLazyBoolCalculate),
330 m_mem_region_cache (),
Pavel Labath0e1d7292015-08-20 09:06:12 +0000331 m_pending_notification_tid(LLDB_INVALID_THREAD_ID)
Todd Fialaaf245d12014-06-30 21:05:18 +0000332{
333}
334
Todd Fialaaf245d12014-06-30 21:05:18 +0000335void
Pavel Labath19cbe962015-07-21 13:20:32 +0000336NativeProcessLinux::AttachToInferior (MainLoop &mainloop, lldb::pid_t pid, Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000337{
338 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
339 if (log)
340 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__, pid);
341
Pavel Labath19cbe962015-07-21 13:20:32 +0000342 m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD,
343 [this] (MainLoopBase &) { SigchldHandler(); }, error);
344 if (! m_sigchld_handle)
345 return;
346
Pavel Labath2a86b552016-06-14 17:30:52 +0000347 error = ResolveProcessArchitecture(pid, m_arch);
Todd Fialaaf245d12014-06-30 21:05:18 +0000348 if (!error.Success())
349 return;
350
351 // Set the architecture to the exe architecture.
Todd Fialaaf245d12014-06-30 21:05:18 +0000352 if (log)
353 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ") detected architecture %s", __FUNCTION__, pid, m_arch.GetArchitectureName ());
354
355 m_pid = pid;
356 SetState(eStateAttaching);
357
Pavel Labath19cbe962015-07-21 13:20:32 +0000358 Attach(pid, error);
Todd Fialaaf245d12014-06-30 21:05:18 +0000359}
360
Pavel Labath4abe5d62016-07-15 10:18:15 +0000361Error
362NativeProcessLinux::LaunchInferior(MainLoop &mainloop, ProcessLaunchInfo &launch_info)
Todd Fialaaf245d12014-06-30 21:05:18 +0000363{
Pavel Labath4abe5d62016-07-15 10:18:15 +0000364 Error error;
365 m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD, [this](MainLoopBase &) { SigchldHandler(); }, error);
366 if (!m_sigchld_handle)
367 return error;
368
369 SetState(eStateLaunching);
Todd Fialaaf245d12014-06-30 21:05:18 +0000370
Pavel Labath4abe5d62016-07-15 10:18:15 +0000371 MaybeLogLaunchInfo(launch_info);
372
Pavel Labath5ad891f2016-07-21 14:54:03 +0000373 ::pid_t pid = ProcessLauncherLinux().LaunchProcess(launch_info, error).GetProcessId();
374 if (error.Fail())
Pavel Labath4abe5d62016-07-15 10:18:15 +0000375 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000376
Todd Fiala75f47c32014-10-11 21:42:09 +0000377 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
378
Todd Fialaaf245d12014-06-30 21:05:18 +0000379 // Wait for the child process to trap on its call to execve.
380 ::pid_t wpid;
381 int status;
382 if ((wpid = waitpid(pid, &status, 0)) < 0)
383 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000384 error.SetErrorToErrno();
Todd Fialaaf245d12014-06-30 21:05:18 +0000385 if (log)
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000386 log->Printf ("NativeProcessLinux::%s waitpid for inferior failed with %s",
387 __FUNCTION__, error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000388
389 // Mark the inferior as invalid.
390 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000391 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000392
Pavel Labath4abe5d62016-07-15 10:18:15 +0000393 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000394 }
Todd Fiala202ecd22014-07-10 04:39:13 +0000395 assert(WIFSTOPPED(status) && (wpid == static_cast< ::pid_t> (pid)) &&
Todd Fialaaf245d12014-06-30 21:05:18 +0000396 "Could not sync with inferior process.");
397
398 if (log)
399 log->Printf ("NativeProcessLinux::%s inferior started, now in stopped state", __FUNCTION__);
400
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000401 error = SetDefaultPtraceOpts(pid);
402 if (error.Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000403 {
Todd Fialaaf245d12014-06-30 21:05:18 +0000404 if (log)
405 log->Printf ("NativeProcessLinux::%s inferior failed to set default ptrace options: %s",
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000406 __FUNCTION__, error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000407
408 // Mark the inferior as invalid.
409 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000410 SetState (StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000411
Pavel Labath4abe5d62016-07-15 10:18:15 +0000412 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000413 }
414
415 // Release the master terminal descriptor and pass it off to the
416 // NativeProcessLinux instance. Similarly stash the inferior pid.
Pavel Labath5ad891f2016-07-21 14:54:03 +0000417 m_terminal_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000418 m_pid = pid;
Pavel Labath4abe5d62016-07-15 10:18:15 +0000419 launch_info.SetProcessID(pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000420
Pavel Labath5ad891f2016-07-21 14:54:03 +0000421 if (m_terminal_fd != -1)
Todd Fialaaf245d12014-06-30 21:05:18 +0000422 {
Pavel Labath5ad891f2016-07-21 14:54:03 +0000423 error = EnsureFDFlags(m_terminal_fd, O_NONBLOCK);
424 if (error.Fail())
425 {
426 if (log)
427 log->Printf(
428 "NativeProcessLinux::%s inferior EnsureFDFlags failed for ensuring terminal O_NONBLOCK setting: %s",
429 __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000430
Pavel Labath5ad891f2016-07-21 14:54:03 +0000431 // Mark the inferior as invalid.
432 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid.
433 SetState(StateType::eStateInvalid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000434
Pavel Labath5ad891f2016-07-21 14:54:03 +0000435 return error;
436 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000437 }
438
439 if (log)
Pavel Labath5ad891f2016-07-21 14:54:03 +0000440 log->Printf("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__, uint64_t(pid));
Todd Fialaaf245d12014-06-30 21:05:18 +0000441
Pavel Labath2a86b552016-06-14 17:30:52 +0000442 ResolveProcessArchitecture(m_pid, m_arch);
Pavel Labathf9077782015-08-21 09:13:53 +0000443 NativeThreadLinuxSP thread_sp = AddThread(pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000444 assert (thread_sp && "AddThread() returned a nullptr thread");
Pavel Labathf9077782015-08-21 09:13:53 +0000445 thread_sp->SetStoppedBySignal(SIGSTOP);
446 ThreadWasCreated(*thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +0000447
448 // Let our process instance know the thread has stopped.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000449 SetCurrentThreadID (thread_sp->GetID ());
450 SetState (StateType::eStateStopped);
Todd Fialaaf245d12014-06-30 21:05:18 +0000451
Todd Fialaaf245d12014-06-30 21:05:18 +0000452 if (log)
453 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000454 if (error.Success ())
Pavel Labath4abe5d62016-07-15 10:18:15 +0000455 log->Printf("NativeProcessLinux::%s inferior launching succeeded", __FUNCTION__);
Todd Fialaaf245d12014-06-30 21:05:18 +0000456 else
Pavel Labath4abe5d62016-07-15 10:18:15 +0000457 log->Printf("NativeProcessLinux::%s inferior launching failed: %s", __FUNCTION__, error.AsCString());
Todd Fialaaf245d12014-06-30 21:05:18 +0000458 }
Pavel Labath4abe5d62016-07-15 10:18:15 +0000459 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +0000460}
461
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000462::pid_t
463NativeProcessLinux::Attach(lldb::pid_t pid, Error &error)
Todd Fialaaf245d12014-06-30 21:05:18 +0000464{
Todd Fialaaf245d12014-06-30 21:05:18 +0000465 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
466
467 // Use a map to keep track of the threads which we have attached/need to attach.
468 Host::TidMap tids_to_attach;
469 if (pid <= 1)
470 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000471 error.SetErrorToGenericError();
472 error.SetErrorString("Attaching to process 1 is not allowed.");
473 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000474 }
475
476 while (Host::FindProcessThreads(pid, tids_to_attach))
477 {
478 for (Host::TidMap::iterator it = tids_to_attach.begin();
479 it != tids_to_attach.end();)
480 {
481 if (it->second == false)
482 {
483 lldb::tid_t tid = it->first;
484
485 // Attach to the requested process.
486 // An attach will cause the thread to stop with a SIGSTOP.
Pavel Labath4a9babb2015-06-30 17:04:49 +0000487 error = PtraceWrapper(PTRACE_ATTACH, tid);
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000488 if (error.Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000489 {
490 // No such thread. The thread may have exited.
491 // More error handling may be needed.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000492 if (error.GetError() == ESRCH)
Todd Fialaaf245d12014-06-30 21:05:18 +0000493 {
494 it = tids_to_attach.erase(it);
495 continue;
496 }
497 else
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000498 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000499 }
500
501 int status;
502 // Need to use __WALL otherwise we receive an error with errno=ECHLD
503 // At this point we should have a thread stopped if waitpid succeeds.
504 if ((status = waitpid(tid, NULL, __WALL)) < 0)
505 {
506 // No such thread. The thread may have exited.
507 // More error handling may be needed.
508 if (errno == ESRCH)
509 {
510 it = tids_to_attach.erase(it);
511 continue;
512 }
513 else
514 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000515 error.SetErrorToErrno();
516 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000517 }
518 }
519
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000520 error = SetDefaultPtraceOpts(tid);
521 if (error.Fail())
522 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000523
524 if (log)
525 log->Printf ("NativeProcessLinux::%s() adding tid = %" PRIu64, __FUNCTION__, tid);
526
527 it->second = true;
528
529 // Create the thread, mark it as stopped.
Pavel Labathf9077782015-08-21 09:13:53 +0000530 NativeThreadLinuxSP thread_sp (AddThread(static_cast<lldb::tid_t>(tid)));
Todd Fialaaf245d12014-06-30 21:05:18 +0000531 assert (thread_sp && "AddThread() returned a nullptr");
Chaoren Linfa03ad22015-02-03 01:50:42 +0000532
533 // This will notify this is a new thread and tell the system it is stopped.
Pavel Labathf9077782015-08-21 09:13:53 +0000534 thread_sp->SetStoppedBySignal(SIGSTOP);
535 ThreadWasCreated(*thread_sp);
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000536 SetCurrentThreadID (thread_sp->GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000537 }
538
539 // move the loop forward
540 ++it;
541 }
542 }
543
544 if (tids_to_attach.size() > 0)
545 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000546 m_pid = pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000547 // Let our process instance know the thread has stopped.
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000548 SetState (StateType::eStateStopped);
Todd Fialaaf245d12014-06-30 21:05:18 +0000549 }
550 else
551 {
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000552 error.SetErrorToGenericError();
553 error.SetErrorString("No such process.");
554 return -1;
Todd Fialaaf245d12014-06-30 21:05:18 +0000555 }
556
Pavel Labathbd7cbc52015-04-20 13:53:49 +0000557 return pid;
Todd Fialaaf245d12014-06-30 21:05:18 +0000558}
559
Chaoren Lin97ccc292015-02-03 01:51:12 +0000560Error
Todd Fialaaf245d12014-06-30 21:05:18 +0000561NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid)
562{
563 long ptrace_opts = 0;
564
565 // Have the child raise an event on exit. This is used to keep the child in
566 // limbo until it is destroyed.
567 ptrace_opts |= PTRACE_O_TRACEEXIT;
568
569 // Have the tracer trace threads which spawn in the inferior process.
570 // TODO: if we want to support tracing the inferiors' child, add the
571 // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK)
572 ptrace_opts |= PTRACE_O_TRACECLONE;
573
574 // Have the tracer notify us before execve returns
575 // (needed to disable legacy SIGTRAP generation)
576 ptrace_opts |= PTRACE_O_TRACEEXEC;
577
Pavel Labath4a9babb2015-06-30 17:04:49 +0000578 return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void*)ptrace_opts);
Todd Fialaaf245d12014-06-30 21:05:18 +0000579}
580
581static ExitType convert_pid_status_to_exit_type (int status)
582{
583 if (WIFEXITED (status))
584 return ExitType::eExitTypeExit;
585 else if (WIFSIGNALED (status))
586 return ExitType::eExitTypeSignal;
587 else if (WIFSTOPPED (status))
588 return ExitType::eExitTypeStop;
589 else
590 {
591 // We don't know what this is.
592 return ExitType::eExitTypeInvalid;
593 }
594}
595
596static int convert_pid_status_to_return_code (int status)
597{
598 if (WIFEXITED (status))
599 return WEXITSTATUS (status);
600 else if (WIFSIGNALED (status))
601 return WTERMSIG (status);
602 else if (WIFSTOPPED (status))
603 return WSTOPSIG (status);
604 else
605 {
606 // We don't know what this is.
607 return ExitType::eExitTypeInvalid;
608 }
609}
610
Pavel Labath1107b5a2015-04-17 14:07:49 +0000611// Handles all waitpid events from the inferior process.
612void
613NativeProcessLinux::MonitorCallback(lldb::pid_t pid,
Tamas Berghammer1e209fc2015-03-13 11:36:47 +0000614 bool exited,
615 int signal,
616 int status)
Todd Fialaaf245d12014-06-30 21:05:18 +0000617{
618 Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
619
Todd Fialaaf245d12014-06-30 21:05:18 +0000620 // Certain activities differ based on whether the pid is the tid of the main thread.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000621 const bool is_main_thread = (pid == GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000622
623 // Handle when the thread exits.
624 if (exited)
625 {
626 if (log)
Chaoren Lin86fd8e42015-02-03 01:51:15 +0000627 log->Printf ("NativeProcessLinux::%s() got exit signal(%d) , tid = %" PRIu64 " (%s main thread)", __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not");
Todd Fialaaf245d12014-06-30 21:05:18 +0000628
629 // This is a thread that exited. Ensure we're not tracking it anymore.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000630 const bool thread_found = StopTrackingThread (pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000631
632 if (is_main_thread)
633 {
634 // We only set the exit status and notify the delegate if we haven't already set the process
635 // state to an exited state. We normally should have received a SIGTRAP | (PTRACE_EVENT_EXIT << 8)
636 // for the main thread.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000637 const bool already_notified = (GetState() == StateType::eStateExited) || (GetState () == StateType::eStateCrashed);
Todd Fialaaf245d12014-06-30 21:05:18 +0000638 if (!already_notified)
639 {
640 if (log)
Pavel Labath1107b5a2015-04-17 14:07:49 +0000641 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling main thread exit (%s), expected exit state already set but state was %s instead, setting exit state now", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found", StateAsCString (GetState ()));
Todd Fialaaf245d12014-06-30 21:05:18 +0000642 // The main thread exited. We're done monitoring. Report to delegate.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000643 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000644
645 // Notify delegate that our process has exited.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000646 SetState (StateType::eStateExited, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000647 }
648 else
649 {
650 if (log)
651 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " main thread now exited (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
652 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000653 }
654 else
655 {
656 // Do we want to report to the delegate in this case? I think not. If this was an orderly
657 // thread exit, we would already have received the SIGTRAP | (PTRACE_EVENT_EXIT << 8) signal,
658 // and we would have done an all-stop then.
659 if (log)
660 log->Printf ("NativeProcessLinux::%s() tid = %" PRIu64 " handling non-main thread exit (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
Todd Fialaaf245d12014-06-30 21:05:18 +0000661 }
Pavel Labath1107b5a2015-04-17 14:07:49 +0000662 return;
Todd Fialaaf245d12014-06-30 21:05:18 +0000663 }
664
Todd Fialaaf245d12014-06-30 21:05:18 +0000665 siginfo_t info;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000666 const auto info_err = GetSignalInfo(pid, &info);
667 auto thread_sp = GetThreadByID(pid);
668
669 if (! thread_sp)
670 {
671 // Normally, the only situation when we cannot find the thread is if we have just
672 // received a new thread notification. This is indicated by GetSignalInfo() returning
673 // si_code == SI_USER and si_pid == 0
674 if (log)
675 log->Printf("NativeProcessLinux::%s received notification about an unknown tid %" PRIu64 ".", __FUNCTION__, pid);
676
677 if (info_err.Fail())
678 {
679 if (log)
680 log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") GetSignalInfo failed (%s). Ingoring this notification.", __FUNCTION__, pid, info_err.AsCString());
681 return;
682 }
683
684 if (log && (info.si_code != SI_USER || info.si_pid != 0))
685 log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") unexpected signal info (si_code: %d, si_pid: %d). Treating as a new thread notification anyway.", __FUNCTION__, pid, info.si_code, info.si_pid);
686
687 auto thread_sp = AddThread(pid);
688 // Resume the newly created thread.
689 ResumeThread(*thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
690 ThreadWasCreated(*thread_sp);
691 return;
692 }
693
694 // Get details on the signal raised.
695 if (info_err.Success())
Chaoren Linfa03ad22015-02-03 01:50:42 +0000696 {
697 // We have retrieved the signal info. Dispatch appropriately.
698 if (info.si_signo == SIGTRAP)
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000699 MonitorSIGTRAP(info, *thread_sp);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000700 else
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000701 MonitorSignal(info, *thread_sp, exited);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000702 }
703 else
Todd Fialaaf245d12014-06-30 21:05:18 +0000704 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000705 if (info_err.GetError() == EINVAL)
Todd Fialaaf245d12014-06-30 21:05:18 +0000706 {
Chaoren Linfa03ad22015-02-03 01:50:42 +0000707 // This is a group stop reception for this tid.
Pavel Labath39036ac2015-05-21 08:32:18 +0000708 // We can reach here if we reinject SIGSTOP, SIGSTP, SIGTTIN or SIGTTOU into the
709 // tracee, triggering the group-stop mechanism. Normally receiving these would stop
710 // the process, pending a SIGCONT. Simulating this state in a debugger is hard and is
711 // generally not needed (one use case is debugging background task being managed by a
712 // shell). For general use, it is sufficient to stop the process in a signal-delivery
713 // stop which happens before the group stop. This done by MonitorSignal and works
714 // correctly for all signals.
Chaoren Linfa03ad22015-02-03 01:50:42 +0000715 if (log)
Pavel Labath39036ac2015-05-21 08:32:18 +0000716 log->Printf("NativeProcessLinux::%s received a group stop for pid %" PRIu64 " tid %" PRIu64 ". Transparent handling of group stops not supported, resuming the thread.", __FUNCTION__, GetID (), pid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000717 ResumeThread(*thread_sp, thread_sp->GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +0000718 }
719 else
720 {
721 // ptrace(GETSIGINFO) failed (but not due to group-stop).
722
723 // A return value of ESRCH means the thread/process is no longer on the system,
724 // so it was killed somehow outside of our control. Either way, we can't do anything
725 // with it anymore.
726
Todd Fialaaf245d12014-06-30 21:05:18 +0000727 // Stop tracking the metadata for the thread since it's entirely off the system now.
Pavel Labath1107b5a2015-04-17 14:07:49 +0000728 const bool thread_found = StopTrackingThread (pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000729
730 if (log)
731 log->Printf ("NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d (%s, %s, %s)",
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000732 __FUNCTION__, info_err.AsCString(), pid, signal, status, info_err.GetError() == ESRCH ? "thread/process killed" : "unknown reason", is_main_thread ? "is main thread" : "is not main thread", thread_found ? "thread metadata removed" : "thread metadata not found");
Todd Fialaaf245d12014-06-30 21:05:18 +0000733
734 if (is_main_thread)
735 {
736 // Notify the delegate - our process is not available but appears to have been killed outside
737 // our control. Is eStateExited the right exit state in this case?
Pavel Labath1107b5a2015-04-17 14:07:49 +0000738 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
739 SetState (StateType::eStateExited, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000740 }
741 else
742 {
743 // This thread was pulled out from underneath us. Anything to do here? Do we want to do an all stop?
744 if (log)
Pavel Labath1107b5a2015-04-17 14:07:49 +0000745 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 " non-main thread exit occurred, didn't tell delegate anything since thread disappeared out from underneath us", __FUNCTION__, GetID (), pid);
Todd Fialaaf245d12014-06-30 21:05:18 +0000746 }
747 }
748 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000749}
750
751void
Pavel Labath426bdf82015-04-28 07:51:52 +0000752NativeProcessLinux::WaitForNewThread(::pid_t tid)
753{
754 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
755
Pavel Labathf9077782015-08-21 09:13:53 +0000756 NativeThreadLinuxSP new_thread_sp = GetThreadByID(tid);
Pavel Labath426bdf82015-04-28 07:51:52 +0000757
758 if (new_thread_sp)
759 {
760 // We are already tracking the thread - we got the event on the new thread (see
761 // MonitorSignal) before this one. We are done.
762 return;
763 }
764
765 // The thread is not tracked yet, let's wait for it to appear.
766 int status = -1;
767 ::pid_t wait_pid;
768 do
769 {
770 if (log)
771 log->Printf ("NativeProcessLinux::%s() received thread creation event for tid %" PRIu32 ". tid not tracked yet, waiting for thread to appear...", __FUNCTION__, tid);
772 wait_pid = waitpid(tid, &status, __WALL);
773 }
774 while (wait_pid == -1 && errno == EINTR);
775 // Since we are waiting on a specific tid, this must be the creation event. But let's do
776 // some checks just in case.
777 if (wait_pid != tid) {
778 if (log)
779 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime", __FUNCTION__, tid);
780 // The only way I know of this could happen is if the whole process was
781 // SIGKILLed in the mean time. In any case, we can't do anything about that now.
782 return;
783 }
784 if (WIFEXITED(status))
785 {
786 if (log)
787 log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " returned an 'exited' event. Not tracking the thread.", __FUNCTION__, tid);
788 // Also a very improbable event.
789 return;
790 }
791
792 siginfo_t info;
793 Error error = GetSignalInfo(tid, &info);
794 if (error.Fail())
795 {
796 if (log)
797 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime.", __FUNCTION__, tid);
798 return;
799 }
800
801 if (((info.si_pid != 0) || (info.si_code != SI_USER)) && log)
802 {
803 // We should be getting a thread creation signal here, but we received something
804 // else. There isn't much we can do about it now, so we will just log that. Since the
805 // thread is alive and we are receiving events from it, we shall pretend that it was
806 // created properly.
807 log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " received unexpected signal with code %d from pid %d.", __FUNCTION__, tid, info.si_code, info.si_pid);
808 }
809
810 if (log)
811 log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 ": tracking new thread tid %" PRIu32,
812 __FUNCTION__, GetID (), tid);
813
Pavel Labathf9077782015-08-21 09:13:53 +0000814 new_thread_sp = AddThread(tid);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000815 ResumeThread(*new_thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
Pavel Labathf9077782015-08-21 09:13:53 +0000816 ThreadWasCreated(*new_thread_sp);
Pavel Labath426bdf82015-04-28 07:51:52 +0000817}
818
819void
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000820NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thread)
Todd Fialaaf245d12014-06-30 21:05:18 +0000821{
822 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000823 const bool is_main_thread = (thread.GetID() == GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +0000824
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000825 assert(info.si_signo == SIGTRAP && "Unexpected child signal!");
Todd Fialaaf245d12014-06-30 21:05:18 +0000826
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000827 switch (info.si_code)
Todd Fialaaf245d12014-06-30 21:05:18 +0000828 {
829 // TODO: these two cases are required if we want to support tracing of the inferiors' children. We'd need this to debug a monitor.
830 // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):
831 // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):
832
833 case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
834 {
Pavel Labath5fd24c62015-04-23 09:04:35 +0000835 // This is the notification on the parent thread which informs us of new thread
Pavel Labath426bdf82015-04-28 07:51:52 +0000836 // creation.
837 // We don't want to do anything with the parent thread so we just resume it. In case we
838 // want to implement "break on thread creation" functionality, we would need to stop
839 // here.
Todd Fialaaf245d12014-06-30 21:05:18 +0000840
Pavel Labath426bdf82015-04-28 07:51:52 +0000841 unsigned long event_message = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000842 if (GetEventMessage(thread.GetID(), &event_message).Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000843 {
Pavel Labath426bdf82015-04-28 07:51:52 +0000844 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000845 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " received thread creation event but GetEventMessage failed so we don't know the new tid", __FUNCTION__, thread.GetID());
Pavel Labath426bdf82015-04-28 07:51:52 +0000846 } else
847 WaitForNewThread(event_message);
Todd Fialaaf245d12014-06-30 21:05:18 +0000848
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000849 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +0000850 break;
851 }
852
853 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)):
Todd Fialaa9882ce2014-08-28 15:46:54 +0000854 {
Pavel Labathf9077782015-08-21 09:13:53 +0000855 NativeThreadLinuxSP main_thread_sp;
Todd Fialaaf245d12014-06-30 21:05:18 +0000856 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000857 log->Printf ("NativeProcessLinux::%s() received exec event, code = %d", __FUNCTION__, info.si_code ^ SIGTRAP);
Todd Fialaa9882ce2014-08-28 15:46:54 +0000858
Pavel Labath1dbc6c92015-05-12 08:35:33 +0000859 // Exec clears any pending notifications.
Pavel Labath0e1d7292015-08-20 09:06:12 +0000860 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
Chaoren Linfa03ad22015-02-03 01:50:42 +0000861
Pavel Labath57a77112016-05-16 09:18:30 +0000862 // Remove all but the main thread here. Linux fork creates a new process which only copies the main thread.
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000863 if (log)
864 log->Printf ("NativeProcessLinux::%s exec received, stop tracking all but main thread", __FUNCTION__);
865
866 for (auto thread_sp : m_threads)
Todd Fialaa9882ce2014-08-28 15:46:54 +0000867 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000868 const bool is_main_thread = thread_sp && thread_sp->GetID () == GetID ();
869 if (is_main_thread)
Todd Fialaa9882ce2014-08-28 15:46:54 +0000870 {
Pavel Labathf9077782015-08-21 09:13:53 +0000871 main_thread_sp = std::static_pointer_cast<NativeThreadLinux>(thread_sp);
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000872 if (log)
873 log->Printf ("NativeProcessLinux::%s found main thread with tid %" PRIu64 ", keeping", __FUNCTION__, main_thread_sp->GetID ());
Todd Fialaa9882ce2014-08-28 15:46:54 +0000874 }
875 else
876 {
Todd Fialaa9882ce2014-08-28 15:46:54 +0000877 if (log)
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000878 log->Printf ("NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64 " due to exec", __FUNCTION__, thread_sp->GetID ());
Todd Fialaa9882ce2014-08-28 15:46:54 +0000879 }
880 }
881
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000882 m_threads.clear ();
883
884 if (main_thread_sp)
885 {
886 m_threads.push_back (main_thread_sp);
887 SetCurrentThreadID (main_thread_sp->GetID ());
Pavel Labathf9077782015-08-21 09:13:53 +0000888 main_thread_sp->SetStoppedByExec();
Tamas Berghammer5830aa72015-02-06 10:42:33 +0000889 }
890 else
891 {
892 SetCurrentThreadID (LLDB_INVALID_THREAD_ID);
893 if (log)
894 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 "no main thread found, discarded all threads, we're in a no-thread state!", __FUNCTION__, GetID ());
895 }
896
Chaoren Linfa03ad22015-02-03 01:50:42 +0000897 // Tell coordinator about about the "new" (since exec) stopped main thread.
Pavel Labathf9077782015-08-21 09:13:53 +0000898 ThreadWasCreated(*main_thread_sp);
Chaoren Linfa03ad22015-02-03 01:50:42 +0000899
Todd Fialaa9882ce2014-08-28 15:46:54 +0000900 // Let our delegate know we have just exec'd.
901 NotifyDidExec ();
902
903 // If we have a main thread, indicate we are stopped.
904 assert (main_thread_sp && "exec called during ptraced process but no main thread metadata tracked");
Chaoren Linfa03ad22015-02-03 01:50:42 +0000905
906 // Let the process know we're stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000907 StopRunningThreads(main_thread_sp->GetID());
Todd Fialaa9882ce2014-08-28 15:46:54 +0000908
Todd Fialaaf245d12014-06-30 21:05:18 +0000909 break;
Todd Fialaa9882ce2014-08-28 15:46:54 +0000910 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000911
912 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
913 {
914 // The inferior process or one of its threads is about to exit.
Pavel Labath6e351632015-05-15 13:30:59 +0000915 // We don't want to do anything with the thread so we just resume it. In case we
916 // want to implement "break on thread exit" functionality, we would need to stop
917 // here.
Chaoren Linfa03ad22015-02-03 01:50:42 +0000918
Todd Fialaaf245d12014-06-30 21:05:18 +0000919 unsigned long data = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000920 if (GetEventMessage(thread.GetID(), &data).Fail())
Todd Fialaaf245d12014-06-30 21:05:18 +0000921 data = -1;
922
923 if (log)
924 {
925 log->Printf ("NativeProcessLinux::%s() received PTRACE_EVENT_EXIT, data = %lx (WIFEXITED=%s,WIFSIGNALED=%s), pid = %" PRIu64 " (%s)",
926 __FUNCTION__,
927 data, WIFEXITED (data) ? "true" : "false", WIFSIGNALED (data) ? "true" : "false",
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000928 thread.GetID(),
Todd Fialaaf245d12014-06-30 21:05:18 +0000929 is_main_thread ? "is main thread" : "not main thread");
930 }
931
Todd Fialaaf245d12014-06-30 21:05:18 +0000932 if (is_main_thread)
933 {
934 SetExitStatus (convert_pid_status_to_exit_type (data), convert_pid_status_to_return_code (data), nullptr, true);
Todd Fialaaf245d12014-06-30 21:05:18 +0000935 }
Todd Fiala75f47c32014-10-11 21:42:09 +0000936
Pavel Labath86852d32015-09-01 10:59:36 +0000937 StateType state = thread.GetState();
938 if (! StateIsRunningState(state))
939 {
940 // Due to a kernel bug, we may sometimes get this stop after the inferior gets a
941 // SIGKILL. This confuses our state tracking logic in ResumeThread(), since normally,
942 // we should not be receiving any ptrace events while the inferior is stopped. This
943 // makes sure that the inferior is resumed and exits normally.
944 state = eStateRunning;
945 }
946 ResumeThread(thread, state, LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +0000947
948 break;
949 }
950
951 case 0:
Chaoren Linc16f5dc2015-03-19 23:28:10 +0000952 case TRAP_TRACE: // We receive this on single stepping.
953 case TRAP_HWBKPT: // We receive this on watchpoint hit
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000954 {
955 // If a watchpoint was hit, report it
956 uint32_t wp_index;
Tamas Berghammer1fa5c4b2015-10-13 16:48:04 +0000957 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, (uintptr_t)info.si_addr);
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000958 if (error.Fail() && log)
959 log->Printf("NativeProcessLinux::%s() "
960 "received error while checking for watchpoint hits, "
961 "pid = %" PRIu64 " error = %s",
962 __FUNCTION__, thread.GetID(), error.AsCString());
963 if (wp_index != LLDB_INVALID_INDEX32)
Chaoren Lin86fd8e42015-02-03 01:51:15 +0000964 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000965 MonitorWatchpoint(thread, wp_index);
966 break;
Chaoren Lin86fd8e42015-02-03 01:51:15 +0000967 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000968
Tamas Berghammerbe379e12016-02-16 15:14:36 +0000969 // Otherwise, report step over
970 MonitorTrace(thread);
Todd Fialaaf245d12014-06-30 21:05:18 +0000971 break;
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000972 }
Todd Fialaaf245d12014-06-30 21:05:18 +0000973
974 case SI_KERNEL:
Mohit K. Bhakkad35799962015-06-18 04:53:18 +0000975#if defined __mips__
976 // For mips there is no special signal for watchpoint
977 // So we check for watchpoint in kernel trap
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000978 {
979 // If a watchpoint was hit, report it
980 uint32_t wp_index;
981 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, LLDB_INVALID_ADDRESS);
982 if (error.Fail() && log)
983 log->Printf("NativeProcessLinux::%s() "
984 "received error while checking for watchpoint hits, "
985 "pid = %" PRIu64 " error = %s",
Mohit K. Bhakkad16ad0322015-08-28 12:08:26 +0000986 __FUNCTION__, thread.GetID(), error.AsCString());
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000987 if (wp_index != LLDB_INVALID_INDEX32)
Mohit K. Bhakkad35799962015-06-18 04:53:18 +0000988 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000989 MonitorWatchpoint(thread, wp_index);
990 break;
Mohit K. Bhakkad35799962015-06-18 04:53:18 +0000991 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000992 }
Mohit K. Bhakkad35799962015-06-18 04:53:18 +0000993 // NO BREAK
994#endif
Todd Fialaaf245d12014-06-30 21:05:18 +0000995 case TRAP_BRKPT:
Pavel Labathb9cc0c72015-08-24 09:22:04 +0000996 MonitorBreakpoint(thread);
Todd Fialaaf245d12014-06-30 21:05:18 +0000997 break;
998
999 case SIGTRAP:
1000 case (SIGTRAP | 0x80):
1001 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001002 log->Printf ("NativeProcessLinux::%s() received unknown SIGTRAP system call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming", __FUNCTION__, GetID (), thread.GetID());
Chaoren Linfa03ad22015-02-03 01:50:42 +00001003
Todd Fialaaf245d12014-06-30 21:05:18 +00001004 // Ignore these signals until we know more about them.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001005 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
Todd Fialaaf245d12014-06-30 21:05:18 +00001006 break;
1007
1008 default:
1009 assert(false && "Unexpected SIGTRAP code!");
1010 if (log)
Pavel Labath6e351632015-05-15 13:30:59 +00001011 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64 " received unhandled SIGTRAP code: 0x%d",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001012 __FUNCTION__, GetID(), thread.GetID(), info.si_code);
Todd Fialaaf245d12014-06-30 21:05:18 +00001013 break;
1014
1015 }
1016}
1017
1018void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001019NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001020{
1021 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1022 if (log)
1023 log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64 " (single stepping)",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001024 __FUNCTION__, thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001025
Pavel Labath0e1d7292015-08-20 09:06:12 +00001026 // This thread is currently stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001027 thread.SetStoppedByTrace();
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001028
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001029 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001030}
1031
1032void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001033NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001034{
1035 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
1036 if (log)
1037 log->Printf("NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64,
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001038 __FUNCTION__, thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001039
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001040 // Mark the thread as stopped at breakpoint.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001041 thread.SetStoppedByBreakpoint();
1042 Error error = FixupBreakpointPCAsNeeded(thread);
1043 if (error.Fail())
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001044 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001045 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s",
1046 __FUNCTION__, thread.GetID(), error.AsCString());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001047
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001048 if (m_threads_stepping_with_breakpoint.find(thread.GetID()) != m_threads_stepping_with_breakpoint.end())
1049 thread.SetStoppedByTrace();
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001050
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001051 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001052}
1053
1054void
Pavel Labathf9077782015-08-21 09:13:53 +00001055NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread, uint32_t wp_index)
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001056{
1057 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS));
1058 if (log)
1059 log->Printf("NativeProcessLinux::%s() received watchpoint event, "
1060 "pid = %" PRIu64 ", wp_index = %" PRIu32,
Pavel Labathf9077782015-08-21 09:13:53 +00001061 __FUNCTION__, thread.GetID(), wp_index);
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001062
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001063 // Mark the thread as stopped at watchpoint.
1064 // The address is at (lldb::addr_t)info->si_addr if we need it.
Pavel Labathf9077782015-08-21 09:13:53 +00001065 thread.SetStoppedByWatchpoint(wp_index);
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001066
1067 // We need to tell all other running threads before we notify the delegate about this stop.
Pavel Labathf9077782015-08-21 09:13:53 +00001068 StopRunningThreads(thread.GetID());
Chaoren Linc16f5dc2015-03-19 23:28:10 +00001069}
1070
1071void
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001072NativeProcessLinux::MonitorSignal(const siginfo_t &info, NativeThreadLinux &thread, bool exited)
Todd Fialaaf245d12014-06-30 21:05:18 +00001073{
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001074 const int signo = info.si_signo;
1075 const bool is_from_llgs = info.si_pid == getpid ();
Todd Fialaaf245d12014-06-30 21:05:18 +00001076
1077 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1078
1079 // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
1080 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
1081 // kill(2) or raise(3). Similarly for tgkill(2) on Linux.
1082 //
1083 // IOW, user generated signals never generate what we consider to be a
1084 // "crash".
1085 //
1086 // Similarly, ACK signals generated by this monitor.
1087
Todd Fialaaf245d12014-06-30 21:05:18 +00001088 // Handle the signal.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001089 if (info.si_code == SI_TKILL || info.si_code == SI_USER)
Todd Fialaaf245d12014-06-30 21:05:18 +00001090 {
1091 if (log)
1092 log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")",
1093 __FUNCTION__,
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001094 Host::GetSignalAsCString(signo),
Todd Fialaaf245d12014-06-30 21:05:18 +00001095 signo,
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001096 (info.si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"),
1097 info.si_pid,
Todd Fiala511e5cd2014-09-11 23:29:14 +00001098 is_from_llgs ? "from llgs" : "not from llgs",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001099 thread.GetID());
Todd Fiala58a2f662014-08-12 17:02:07 +00001100 }
1101
1102 // Check for thread stop notification.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001103 if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP))
Todd Fiala58a2f662014-08-12 17:02:07 +00001104 {
1105 // This is a tgkill()-based stop.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001106 if (log)
1107 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread stopped",
1108 __FUNCTION__,
1109 GetID (),
1110 thread.GetID());
1111
1112 // Check that we're not already marked with a stop reason.
1113 // Note this thread really shouldn't already be marked as stopped - if we were, that would imply that
1114 // the kernel signaled us with the thread stopping which we handled and marked as stopped,
1115 // and that, without an intervening resume, we received another stop. It is more likely
1116 // that we are missing the marking of a run state somewhere if we find that the thread was
1117 // marked as stopped.
1118 const StateType thread_state = thread.GetState();
1119 if (!StateIsStoppedState (thread_state, false))
Todd Fiala58a2f662014-08-12 17:02:07 +00001120 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001121 // An inferior thread has stopped because of a SIGSTOP we have sent it.
1122 // Generally, these are not important stops and we don't want to report them as
1123 // they are just used to stop other threads when one thread (the one with the
1124 // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in the
1125 // case of an asynchronous Interrupt(), this *is* the real stop reason, so we
1126 // leave the signal intact if this is the thread that was chosen as the
1127 // triggering thread.
1128 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID)
Chaoren Linaab58632015-02-03 01:50:57 +00001129 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001130 if (m_pending_notification_tid == thread.GetID())
1131 thread.SetStoppedBySignal(SIGSTOP, &info);
Pavel Labath0e1d7292015-08-20 09:06:12 +00001132 else
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001133 thread.SetStoppedWithNoReason();
1134
1135 SetCurrentThreadID (thread.GetID ());
1136 SignalIfAllThreadsStopped();
Chaoren Linaab58632015-02-03 01:50:57 +00001137 }
1138 else
1139 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001140 // We can end up here if stop was initiated by LLGS but by this time a
1141 // thread stop has occurred - maybe initiated by another event.
1142 Error error = ResumeThread(thread, thread.GetState(), 0);
1143 if (error.Fail() && log)
Chaoren Linaab58632015-02-03 01:50:57 +00001144 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001145 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s",
1146 __FUNCTION__, thread.GetID(), error.AsCString());
Chaoren Linaab58632015-02-03 01:50:57 +00001147 }
1148 }
Todd Fiala58a2f662014-08-12 17:02:07 +00001149 }
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001150 else
1151 {
1152 if (log)
1153 {
1154 // Retrieve the signal name if the thread was stopped by a signal.
1155 int stop_signo = 0;
1156 const bool stopped_by_signal = thread.IsStopped(&stop_signo);
1157 const char *signal_name = stopped_by_signal ? Host::GetSignalAsCString(stop_signo) : "<not stopped by signal>";
1158 if (!signal_name)
1159 signal_name = "<no-signal-name>";
1160
1161 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread was already marked as a stopped state (state=%s, signal=%d (%s)), leaving stop signal as is",
1162 __FUNCTION__,
1163 GetID (),
1164 thread.GetID(),
1165 StateAsCString (thread_state),
1166 stop_signo,
1167 signal_name);
1168 }
1169 SignalIfAllThreadsStopped();
1170 }
Todd Fiala58a2f662014-08-12 17:02:07 +00001171
1172 // Done handling.
Todd Fialaaf245d12014-06-30 21:05:18 +00001173 return;
1174 }
1175
1176 if (log)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001177 log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, Host::GetSignalAsCString(signo));
Todd Fialaaf245d12014-06-30 21:05:18 +00001178
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001179 // This thread is stopped.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001180 thread.SetStoppedBySignal(signo, &info);
Chaoren Lin86fd8e42015-02-03 01:51:15 +00001181
1182 // Send a stop to the debugger after we get all other threads to stop.
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001183 StopRunningThreads(thread.GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001184}
1185
Tamas Berghammere7708682015-04-22 10:00:23 +00001186namespace {
1187
1188struct EmulatorBaton
1189{
1190 NativeProcessLinux* m_process;
1191 NativeRegisterContext* m_reg_context;
Tamas Berghammere7708682015-04-22 10:00:23 +00001192
Pavel Labath6648fcc2015-04-27 09:21:14 +00001193 // eRegisterKindDWARF -> RegsiterValue
1194 std::unordered_map<uint32_t, RegisterValue> m_register_values;
1195
1196 EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) :
Tamas Berghammere7708682015-04-22 10:00:23 +00001197 m_process(process), m_reg_context(reg_context) {}
1198};
1199
1200} // anonymous namespace
1201
1202static size_t
1203ReadMemoryCallback (EmulateInstruction *instruction,
1204 void *baton,
1205 const EmulateInstruction::Context &context,
1206 lldb::addr_t addr,
1207 void *dst,
1208 size_t length)
1209{
1210 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1211
Chaoren Lin3eb4b452015-04-29 17:24:48 +00001212 size_t bytes_read;
Tamas Berghammere7708682015-04-22 10:00:23 +00001213 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read);
1214 return bytes_read;
1215}
1216
1217static bool
1218ReadRegisterCallback (EmulateInstruction *instruction,
1219 void *baton,
1220 const RegisterInfo *reg_info,
1221 RegisterValue &reg_value)
1222{
1223 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1224
Pavel Labath6648fcc2015-04-27 09:21:14 +00001225 auto it = emulator_baton->m_register_values.find(reg_info->kinds[eRegisterKindDWARF]);
1226 if (it != emulator_baton->m_register_values.end())
1227 {
1228 reg_value = it->second;
1229 return true;
1230 }
1231
Tamas Berghammere7708682015-04-22 10:00:23 +00001232 // The emulator only fill in the dwarf regsiter numbers (and in some case
1233 // the generic register numbers). Get the full register info from the
1234 // register context based on the dwarf register numbers.
1235 const RegisterInfo* full_reg_info = emulator_baton->m_reg_context->GetRegisterInfo(
1236 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]);
1237
1238 Error error = emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value);
Pavel Labath6648fcc2015-04-27 09:21:14 +00001239 if (error.Success())
Pavel Labath6648fcc2015-04-27 09:21:14 +00001240 return true;
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001241
Pavel Labath6648fcc2015-04-27 09:21:14 +00001242 return false;
Tamas Berghammere7708682015-04-22 10:00:23 +00001243}
1244
1245static bool
1246WriteRegisterCallback (EmulateInstruction *instruction,
1247 void *baton,
1248 const EmulateInstruction::Context &context,
1249 const RegisterInfo *reg_info,
1250 const RegisterValue &reg_value)
1251{
1252 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
Pavel Labath6648fcc2015-04-27 09:21:14 +00001253 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value;
Tamas Berghammere7708682015-04-22 10:00:23 +00001254 return true;
1255}
1256
1257static size_t
1258WriteMemoryCallback (EmulateInstruction *instruction,
1259 void *baton,
1260 const EmulateInstruction::Context &context,
1261 lldb::addr_t addr,
1262 const void *dst,
1263 size_t length)
1264{
1265 return length;
1266}
1267
1268static lldb::addr_t
1269ReadFlags (NativeRegisterContext* regsiter_context)
1270{
1271 const RegisterInfo* flags_info = regsiter_context->GetRegisterInfo(
1272 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1273 return regsiter_context->ReadRegisterAsUnsigned(flags_info, LLDB_INVALID_ADDRESS);
1274}
1275
1276Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001277NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadLinux &thread)
Tamas Berghammere7708682015-04-22 10:00:23 +00001278{
1279 Error error;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001280 NativeRegisterContextSP register_context_sp = thread.GetRegisterContext();
Tamas Berghammere7708682015-04-22 10:00:23 +00001281
1282 std::unique_ptr<EmulateInstruction> emulator_ap(
1283 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, nullptr));
1284
1285 if (emulator_ap == nullptr)
1286 return Error("Instruction emulator not found!");
1287
1288 EmulatorBaton baton(this, register_context_sp.get());
1289 emulator_ap->SetBaton(&baton);
1290 emulator_ap->SetReadMemCallback(&ReadMemoryCallback);
1291 emulator_ap->SetReadRegCallback(&ReadRegisterCallback);
1292 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback);
1293 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback);
1294
1295 if (!emulator_ap->ReadInstruction())
1296 return Error("Read instruction failed!");
1297
Pavel Labath6648fcc2015-04-27 09:21:14 +00001298 bool emulation_result = emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC);
1299
1300 const RegisterInfo* reg_info_pc = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1301 const RegisterInfo* reg_info_flags = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1302
1303 auto pc_it = baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]);
1304 auto flags_it = baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]);
1305
Tamas Berghammere7708682015-04-22 10:00:23 +00001306 lldb::addr_t next_pc;
1307 lldb::addr_t next_flags;
Pavel Labath6648fcc2015-04-27 09:21:14 +00001308 if (emulation_result)
Tamas Berghammere7708682015-04-22 10:00:23 +00001309 {
Pavel Labath6648fcc2015-04-27 09:21:14 +00001310 assert(pc_it != baton.m_register_values.end() && "Emulation was successfull but PC wasn't updated");
1311 next_pc = pc_it->second.GetAsUInt64();
1312
1313 if (flags_it != baton.m_register_values.end())
1314 next_flags = flags_it->second.GetAsUInt64();
Tamas Berghammere7708682015-04-22 10:00:23 +00001315 else
1316 next_flags = ReadFlags (register_context_sp.get());
1317 }
Pavel Labath6648fcc2015-04-27 09:21:14 +00001318 else if (pc_it == baton.m_register_values.end())
Tamas Berghammere7708682015-04-22 10:00:23 +00001319 {
1320 // Emulate instruction failed and it haven't changed PC. Advance PC
1321 // with the size of the current opcode because the emulation of all
1322 // PC modifying instruction should be successful. The failure most
1323 // likely caused by a not supported instruction which don't modify PC.
1324 next_pc = register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize();
1325 next_flags = ReadFlags (register_context_sp.get());
1326 }
1327 else
1328 {
1329 // The instruction emulation failed after it modified the PC. It is an
1330 // unknown error where we can't continue because the next instruction is
1331 // modifying the PC but we don't know how.
1332 return Error ("Instruction emulation failed unexpectedly.");
1333 }
1334
1335 if (m_arch.GetMachine() == llvm::Triple::arm)
1336 {
1337 if (next_flags & 0x20)
1338 {
1339 // Thumb mode
1340 error = SetSoftwareBreakpoint(next_pc, 2);
1341 }
1342 else
1343 {
1344 // Arm mode
1345 error = SetSoftwareBreakpoint(next_pc, 4);
1346 }
1347 }
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001348 else if (m_arch.GetMachine() == llvm::Triple::mips64
Jaydeep Patilc60c9452015-06-23 03:37:08 +00001349 || m_arch.GetMachine() == llvm::Triple::mips64el
1350 || m_arch.GetMachine() == llvm::Triple::mips
1351 || m_arch.GetMachine() == llvm::Triple::mipsel)
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001352 error = SetSoftwareBreakpoint(next_pc, 4);
Tamas Berghammere7708682015-04-22 10:00:23 +00001353 else
1354 {
1355 // No size hint is given for the next breakpoint
1356 error = SetSoftwareBreakpoint(next_pc, 0);
1357 }
1358
Tamas Berghammere7708682015-04-22 10:00:23 +00001359 if (error.Fail())
1360 return error;
1361
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001362 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc});
Tamas Berghammere7708682015-04-22 10:00:23 +00001363
1364 return Error();
1365}
1366
1367bool
1368NativeProcessLinux::SupportHardwareSingleStepping() const
1369{
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001370 if (m_arch.GetMachine() == llvm::Triple::arm
Jaydeep Patilc60c9452015-06-23 03:37:08 +00001371 || m_arch.GetMachine() == llvm::Triple::mips64 || m_arch.GetMachine() == llvm::Triple::mips64el
1372 || m_arch.GetMachine() == llvm::Triple::mips || m_arch.GetMachine() == llvm::Triple::mipsel)
Mohit K. Bhakkadcdc22a82015-05-07 05:56:27 +00001373 return false;
1374 return true;
Tamas Berghammere7708682015-04-22 10:00:23 +00001375}
1376
Todd Fialaaf245d12014-06-30 21:05:18 +00001377Error
1378NativeProcessLinux::Resume (const ResumeActionList &resume_actions)
1379{
Todd Fialaaf245d12014-06-30 21:05:18 +00001380 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD));
1381 if (log)
1382 log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ());
1383
Tamas Berghammere7708682015-04-22 10:00:23 +00001384 bool software_single_step = !SupportHardwareSingleStepping();
Todd Fialaaf245d12014-06-30 21:05:18 +00001385
Tamas Berghammere7708682015-04-22 10:00:23 +00001386 if (software_single_step)
1387 {
1388 for (auto thread_sp : m_threads)
1389 {
1390 assert (thread_sp && "thread list should not contain NULL threads");
1391
1392 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1393 if (action == nullptr)
1394 continue;
1395
1396 if (action->state == eStateStepping)
1397 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001398 Error error = SetupSoftwareSingleStepping(static_cast<NativeThreadLinux &>(*thread_sp));
Tamas Berghammere7708682015-04-22 10:00:23 +00001399 if (error.Fail())
1400 return error;
1401 }
1402 }
1403 }
1404
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001405 for (auto thread_sp : m_threads)
Todd Fialaaf245d12014-06-30 21:05:18 +00001406 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001407 assert (thread_sp && "thread list should not contain NULL threads");
1408
1409 const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1410
1411 if (action == nullptr)
Todd Fialaaf245d12014-06-30 21:05:18 +00001412 {
Chaoren Linfa03ad22015-02-03 01:50:42 +00001413 if (log)
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001414 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64,
1415 __FUNCTION__, GetID (), thread_sp->GetID ());
1416 continue;
1417 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001418
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001419 if (log)
1420 {
1421 log->Printf ("NativeProcessLinux::%s processing resume action state %s for pid %" PRIu64 " tid %" PRIu64,
1422 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
1423 }
Todd Fialaaf245d12014-06-30 21:05:18 +00001424
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001425 switch (action->state)
1426 {
1427 case eStateRunning:
Pavel Labath0e1d7292015-08-20 09:06:12 +00001428 case eStateStepping:
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001429 {
1430 // Run the thread, possibly feeding it the signal.
1431 const int signo = action->signal;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001432 ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state, signo);
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001433 break;
1434 }
1435
1436 case eStateSuspended:
1437 case eStateStopped:
Pavel Labath108c3252015-05-12 09:03:18 +00001438 lldbassert(0 && "Unexpected state");
Chaoren Linfa03ad22015-02-03 01:50:42 +00001439
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001440 default:
1441 return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64,
1442 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
Todd Fialaaf245d12014-06-30 21:05:18 +00001443 }
1444 }
1445
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001446 return Error();
Todd Fialaaf245d12014-06-30 21:05:18 +00001447}
1448
1449Error
1450NativeProcessLinux::Halt ()
1451{
1452 Error error;
1453
Todd Fialaaf245d12014-06-30 21:05:18 +00001454 if (kill (GetID (), SIGSTOP) != 0)
1455 error.SetErrorToErrno ();
1456
1457 return error;
1458}
1459
1460Error
1461NativeProcessLinux::Detach ()
1462{
1463 Error error;
1464
Todd Fialaaf245d12014-06-30 21:05:18 +00001465 // Stop monitoring the inferior.
Pavel Labath19cbe962015-07-21 13:20:32 +00001466 m_sigchld_handle.reset();
Todd Fialaaf245d12014-06-30 21:05:18 +00001467
Pavel Labath7a9495b2015-09-01 15:00:51 +00001468 // Tell ptrace to detach from the process.
1469 if (GetID () == LLDB_INVALID_PROCESS_ID)
1470 return error;
1471
1472 for (auto thread_sp : m_threads)
1473 {
1474 Error e = Detach(thread_sp->GetID());
1475 if (e.Fail())
1476 error = e; // Save the error, but still attempt to detach from other threads.
1477 }
1478
Todd Fialaaf245d12014-06-30 21:05:18 +00001479 return error;
1480}
1481
1482Error
1483NativeProcessLinux::Signal (int signo)
1484{
1485 Error error;
1486
1487 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1488 if (log)
Chaoren Lin98d0a4b2015-07-14 01:09:28 +00001489 log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64,
1490 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID());
Todd Fialaaf245d12014-06-30 21:05:18 +00001491
1492 if (kill(GetID(), signo))
1493 error.SetErrorToErrno();
1494
1495 return error;
1496}
1497
1498Error
Chaoren Line9547b82015-02-03 01:51:00 +00001499NativeProcessLinux::Interrupt ()
1500{
1501 // Pick a running thread (or if none, a not-dead stopped thread) as
1502 // the chosen thread that will be the stop-reason thread.
Chaoren Line9547b82015-02-03 01:51:00 +00001503 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1504
1505 NativeThreadProtocolSP running_thread_sp;
1506 NativeThreadProtocolSP stopped_thread_sp;
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001507
1508 if (log)
1509 log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__);
1510
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001511 for (auto thread_sp : m_threads)
Chaoren Line9547b82015-02-03 01:51:00 +00001512 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001513 // The thread shouldn't be null but lets just cover that here.
1514 if (!thread_sp)
1515 continue;
Chaoren Line9547b82015-02-03 01:51:00 +00001516
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001517 // 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 ||
1521 thread_state == eStateStepping)
Chaoren Line9547b82015-02-03 01:51:00 +00001522 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001523 running_thread_sp = thread_sp;
1524 break;
1525 }
1526 else if (!stopped_thread_sp && StateIsStoppedState (thread_state, true))
1527 {
1528 // Remember the first non-dead stopped thread. We'll use that as a backup if there are no running threads.
1529 stopped_thread_sp = thread_sp;
Chaoren Line9547b82015-02-03 01:51:00 +00001530 }
1531 }
1532
1533 if (!running_thread_sp && !stopped_thread_sp)
1534 {
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001535 Error error("found no running/stepping or live stopped threads as target for interrupt");
Chaoren Line9547b82015-02-03 01:51:00 +00001536 if (log)
Chaoren Line9547b82015-02-03 01:51:00 +00001537 log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ());
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001538
Chaoren Line9547b82015-02-03 01:51:00 +00001539 return error;
1540 }
1541
1542 NativeThreadProtocolSP deferred_signal_thread_sp = running_thread_sp ? running_thread_sp : stopped_thread_sp;
1543
1544 if (log)
1545 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64 " chosen for interrupt target",
1546 __FUNCTION__,
1547 GetID (),
1548 running_thread_sp ? "running" : "stopped",
1549 deferred_signal_thread_sp->GetID ());
1550
Pavel Labathed89c7f2015-05-06 12:22:37 +00001551 StopRunningThreads(deferred_signal_thread_sp->GetID());
Pavel Labath45f5cb32015-05-05 15:05:50 +00001552
Tamas Berghammer5830aa72015-02-06 10:42:33 +00001553 return Error();
Chaoren Line9547b82015-02-03 01:51:00 +00001554}
1555
1556Error
Todd Fialaaf245d12014-06-30 21:05:18 +00001557NativeProcessLinux::Kill ()
1558{
1559 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1560 if (log)
1561 log->Printf ("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__, GetID ());
1562
1563 Error error;
1564
1565 switch (m_state)
1566 {
1567 case StateType::eStateInvalid:
1568 case StateType::eStateExited:
1569 case StateType::eStateCrashed:
1570 case StateType::eStateDetached:
1571 case StateType::eStateUnloaded:
1572 // Nothing to do - the process is already dead.
1573 if (log)
1574 log->Printf ("NativeProcessLinux::%s ignored for PID %" PRIu64 " due to current state: %s", __FUNCTION__, GetID (), StateAsCString (m_state));
1575 return error;
1576
1577 case StateType::eStateConnected:
1578 case StateType::eStateAttaching:
1579 case StateType::eStateLaunching:
1580 case StateType::eStateStopped:
1581 case StateType::eStateRunning:
1582 case StateType::eStateStepping:
1583 case StateType::eStateSuspended:
1584 // We can try to kill a process in these states.
1585 break;
1586 }
1587
1588 if (kill (GetID (), SIGKILL) != 0)
1589 {
1590 error.SetErrorToErrno ();
1591 return error;
1592 }
1593
1594 return error;
1595}
1596
1597static Error
1598ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info)
1599{
1600 memory_region_info.Clear();
1601
Pavel Labathb9739d42016-08-31 08:43:37 +00001602 StringExtractor line_extractor (maps_line.c_str ());
Todd Fialaaf245d12014-06-30 21:05:18 +00001603
1604 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode pathname
1605 // perms: rwxp (letter is present if set, '-' if not, final character is p=private, s=shared).
1606
1607 // Parse out the starting address
1608 lldb::addr_t start_address = line_extractor.GetHexMaxU64 (false, 0);
1609
1610 // Parse out hyphen separating start and end address from range.
1611 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != '-'))
1612 return Error ("malformed /proc/{pid}/maps entry, missing dash between address range");
1613
1614 // Parse out the ending address
1615 lldb::addr_t end_address = line_extractor.GetHexMaxU64 (false, start_address);
1616
1617 // Parse out the space after the address.
1618 if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != ' '))
1619 return Error ("malformed /proc/{pid}/maps entry, missing space after range");
1620
1621 // Save the range.
1622 memory_region_info.GetRange ().SetRangeBase (start_address);
1623 memory_region_info.GetRange ().SetRangeEnd (end_address);
1624
Howard Hellyerad007562016-07-07 08:21:28 +00001625 // Any memory region in /proc/{pid}/maps is by definition mapped into the process.
1626 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes);
1627
Todd Fialaaf245d12014-06-30 21:05:18 +00001628 // Parse out each permission entry.
1629 if (line_extractor.GetBytesLeft () < 4)
1630 return Error ("malformed /proc/{pid}/maps entry, missing some portion of permissions");
1631
1632 // Handle read permission.
1633 const char read_perm_char = line_extractor.GetChar ();
1634 if (read_perm_char == 'r')
1635 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eYes);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001636 else if (read_perm_char == '-')
Todd Fialaaf245d12014-06-30 21:05:18 +00001637 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001638 else
1639 return Error ("unexpected /proc/{pid}/maps read permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001640
1641 // Handle write permission.
1642 const char write_perm_char = line_extractor.GetChar ();
1643 if (write_perm_char == 'w')
1644 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eYes);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001645 else if (write_perm_char == '-')
Todd Fialaaf245d12014-06-30 21:05:18 +00001646 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001647 else
1648 return Error ("unexpected /proc/{pid}/maps write permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001649
1650 // Handle execute permission.
1651 const char exec_perm_char = line_extractor.GetChar ();
1652 if (exec_perm_char == 'x')
1653 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eYes);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001654 else if (exec_perm_char == '-')
Todd Fialaaf245d12014-06-30 21:05:18 +00001655 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
Tamas Berghammerc73301b2016-07-11 13:43:27 +00001656 else
1657 return Error ("unexpected /proc/{pid}/maps exec permission char");
Todd Fialaaf245d12014-06-30 21:05:18 +00001658
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001659 line_extractor.GetChar(); // Read the private bit
1660 line_extractor.SkipSpaces(); // Skip the separator
1661 line_extractor.GetHexMaxU64(false, 0); // Read the offset
1662 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1663 line_extractor.GetChar(); // Read the device id separator
1664 line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1665 line_extractor.SkipSpaces(); // Skip the separator
1666 line_extractor.GetU64(0, 10); // Read the inode number
1667
1668 line_extractor.SkipSpaces();
Pavel Labathb9739d42016-08-31 08:43:37 +00001669 const char* name = line_extractor.Peek();
1670 if (name)
1671 memory_region_info.SetName(name);
Tamas Berghammerd7d69f82016-07-22 12:55:35 +00001672
Todd Fialaaf245d12014-06-30 21:05:18 +00001673 return Error ();
1674}
1675
1676Error
1677NativeProcessLinux::GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &range_info)
1678{
1679 // FIXME review that the final memory region returned extends to the end of the virtual address space,
1680 // with no perms if it is not mapped.
1681
1682 // Use an approach that reads memory regions from /proc/{pid}/maps.
1683 // Assume proc maps entries are in ascending order.
1684 // FIXME assert if we find differently.
Todd Fialaaf245d12014-06-30 21:05:18 +00001685
1686 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1687 Error error;
1688
1689 if (m_supports_mem_region == LazyBool::eLazyBoolNo)
1690 {
1691 // We're done.
1692 error.SetErrorString ("unsupported");
1693 return error;
1694 }
1695
1696 // If our cache is empty, pull the latest. There should always be at least one memory region
1697 // if memory region handling is supported.
1698 if (m_mem_region_cache.empty ())
1699 {
1700 error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
1701 [&] (const std::string &line) -> bool
1702 {
1703 MemoryRegionInfo info;
1704 const Error parse_error = ParseMemoryRegionInfoFromProcMapsLine (line, info);
1705 if (parse_error.Success ())
1706 {
1707 m_mem_region_cache.push_back (info);
1708 return true;
1709 }
1710 else
1711 {
1712 if (log)
1713 log->Printf ("NativeProcessLinux::%s failed to parse proc maps line '%s': %s", __FUNCTION__, line.c_str (), error.AsCString ());
1714 return false;
1715 }
1716 });
1717
1718 // If we had an error, we'll mark unsupported.
1719 if (error.Fail ())
1720 {
1721 m_supports_mem_region = LazyBool::eLazyBoolNo;
1722 return error;
1723 }
1724 else if (m_mem_region_cache.empty ())
1725 {
1726 // No entries after attempting to read them. This shouldn't happen if /proc/{pid}/maps
1727 // is supported. Assume we don't support map entries via procfs.
1728 if (log)
1729 log->Printf ("NativeProcessLinux::%s failed to find any procfs maps entries, assuming no support for memory region metadata retrieval", __FUNCTION__);
1730 m_supports_mem_region = LazyBool::eLazyBoolNo;
1731 error.SetErrorString ("not supported");
1732 return error;
1733 }
1734
1735 if (log)
1736 log->Printf ("NativeProcessLinux::%s read %" PRIu64 " memory region entries from /proc/%" PRIu64 "/maps", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()), GetID ());
1737
1738 // We support memory retrieval, remember that.
1739 m_supports_mem_region = LazyBool::eLazyBoolYes;
1740 }
1741 else
1742 {
1743 if (log)
1744 log->Printf ("NativeProcessLinux::%s reusing %" PRIu64 " cached memory region entries", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
1745 }
1746
1747 lldb::addr_t prev_base_address = 0;
1748
1749 // FIXME start by finding the last region that is <= target address using binary search. Data is sorted.
1750 // There can be a ton of regions on pthreads apps with lots of threads.
1751 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end (); ++it)
1752 {
1753 MemoryRegionInfo &proc_entry_info = *it;
1754
1755 // Sanity check assumption that /proc/{pid}/maps entries are ascending.
1756 assert ((proc_entry_info.GetRange ().GetRangeBase () >= prev_base_address) && "descending /proc/pid/maps entries detected, unexpected");
1757 prev_base_address = proc_entry_info.GetRange ().GetRangeBase ();
1758
1759 // If the target address comes before this entry, indicate distance to next region.
1760 if (load_addr < proc_entry_info.GetRange ().GetRangeBase ())
1761 {
1762 range_info.GetRange ().SetRangeBase (load_addr);
1763 range_info.GetRange ().SetByteSize (proc_entry_info.GetRange ().GetRangeBase () - load_addr);
1764 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1765 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1766 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
Howard Hellyerad007562016-07-07 08:21:28 +00001767 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
Todd Fialaaf245d12014-06-30 21:05:18 +00001768
1769 return error;
1770 }
1771 else if (proc_entry_info.GetRange ().Contains (load_addr))
1772 {
1773 // The target address is within the memory region we're processing here.
1774 range_info = proc_entry_info;
1775 return error;
1776 }
1777
1778 // The target memory address comes somewhere after the region we just parsed.
1779 }
1780
Tamas Berghammer09839c32015-07-03 09:30:19 +00001781 // If we made it here, we didn't find an entry that contained the given address. Return the
1782 // load_addr as start and the amount of bytes betwwen load address and the end of the memory as
1783 // size.
1784 range_info.GetRange ().SetRangeBase (load_addr);
Howard Hellyerad007562016-07-07 08:21:28 +00001785 range_info.GetRange ().SetRangeEnd(LLDB_INVALID_ADDRESS);
Tamas Berghammer09839c32015-07-03 09:30:19 +00001786 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1787 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1788 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
Howard Hellyerad007562016-07-07 08:21:28 +00001789 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
Todd Fialaaf245d12014-06-30 21:05:18 +00001790 return error;
1791}
1792
1793void
1794NativeProcessLinux::DoStopIDBumped (uint32_t newBumpId)
1795{
1796 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1797 if (log)
1798 log->Printf ("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called", __FUNCTION__, newBumpId);
1799
Todd Fialaaf245d12014-06-30 21:05:18 +00001800 if (log)
1801 log->Printf ("NativeProcessLinux::%s clearing %" PRIu64 " entries from the cache", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
1802 m_mem_region_cache.clear ();
Todd Fialaaf245d12014-06-30 21:05:18 +00001803}
1804
1805Error
Chaoren Lin3eb4b452015-04-29 17:24:48 +00001806NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr)
Todd Fialaaf245d12014-06-30 21:05:18 +00001807{
1808 // FIXME implementing this requires the equivalent of
1809 // InferiorCallPOSIX::InferiorCallMmap, which depends on
1810 // functional ThreadPlans working with Native*Protocol.
1811#if 1
1812 return Error ("not implemented yet");
1813#else
1814 addr = LLDB_INVALID_ADDRESS;
1815
1816 unsigned prot = 0;
1817 if (permissions & lldb::ePermissionsReadable)
1818 prot |= eMmapProtRead;
1819 if (permissions & lldb::ePermissionsWritable)
1820 prot |= eMmapProtWrite;
1821 if (permissions & lldb::ePermissionsExecutable)
1822 prot |= eMmapProtExec;
1823
1824 // TODO implement this directly in NativeProcessLinux
1825 // (and lift to NativeProcessPOSIX if/when that class is
1826 // refactored out).
1827 if (InferiorCallMmap(this, addr, 0, size, prot,
1828 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
1829 m_addr_to_mmap_size[addr] = size;
1830 return Error ();
1831 } else {
1832 addr = LLDB_INVALID_ADDRESS;
1833 return Error("unable to allocate %" PRIu64 " bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
1834 }
1835#endif
1836}
1837
1838Error
1839NativeProcessLinux::DeallocateMemory (lldb::addr_t addr)
1840{
1841 // FIXME see comments in AllocateMemory - required lower-level
1842 // bits not in place yet (ThreadPlans)
1843 return Error ("not implemented");
1844}
1845
1846lldb::addr_t
1847NativeProcessLinux::GetSharedLibraryInfoAddress ()
1848{
Todd Fialaaf245d12014-06-30 21:05:18 +00001849 // punt on this for now
1850 return LLDB_INVALID_ADDRESS;
Todd Fialaaf245d12014-06-30 21:05:18 +00001851}
1852
1853size_t
1854NativeProcessLinux::UpdateThreads ()
1855{
1856 // The NativeProcessLinux monitoring threads are always up to date
1857 // with respect to thread state and they keep the thread list
1858 // populated properly. All this method needs to do is return the
1859 // thread count.
Todd Fialaaf245d12014-06-30 21:05:18 +00001860 return m_threads.size ();
1861}
1862
1863bool
1864NativeProcessLinux::GetArchitecture (ArchSpec &arch) const
1865{
1866 arch = m_arch;
1867 return true;
1868}
1869
1870Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00001871NativeProcessLinux::GetSoftwareBreakpointPCOffset(uint32_t &actual_opcode_size)
Todd Fialaaf245d12014-06-30 21:05:18 +00001872{
1873 // FIXME put this behind a breakpoint protocol class that can be
1874 // set per architecture. Need ARM, MIPS support here.
1875 static const uint8_t g_i386_opcode [] = { 0xCC };
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001876 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
Todd Fialaaf245d12014-06-30 21:05:18 +00001877
1878 switch (m_arch.GetMachine ())
1879 {
1880 case llvm::Triple::x86:
1881 case llvm::Triple::x86_64:
1882 actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode));
1883 return Error ();
1884
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001885 case llvm::Triple::systemz:
1886 actual_opcode_size = static_cast<uint32_t> (sizeof(g_s390x_opcode));
1887 return Error ();
1888
Tamas Berghammerff7fd902015-07-03 12:51:30 +00001889 case llvm::Triple::arm:
1890 case llvm::Triple::aarch64:
Mohit K. Bhakkade8659b52015-04-23 06:36:20 +00001891 case llvm::Triple::mips64:
1892 case llvm::Triple::mips64el:
Sagar Thakurce815e42015-06-03 10:14:24 +00001893 case llvm::Triple::mips:
1894 case llvm::Triple::mipsel:
Tamas Berghammerff7fd902015-07-03 12:51:30 +00001895 // On these architectures the PC don't get updated for breakpoint hits
Jaydeep Patilc60c9452015-06-23 03:37:08 +00001896 actual_opcode_size = 0;
Mohit K. Bhakkade8659b52015-04-23 06:36:20 +00001897 return Error ();
1898
Todd Fialaaf245d12014-06-30 21:05:18 +00001899 default:
1900 assert(false && "CPU type not supported!");
1901 return Error ("CPU type not supported");
1902 }
1903}
1904
1905Error
1906NativeProcessLinux::SetBreakpoint (lldb::addr_t addr, uint32_t size, bool hardware)
1907{
1908 if (hardware)
1909 return Error ("NativeProcessLinux does not support hardware breakpoints");
1910 else
1911 return SetSoftwareBreakpoint (addr, size);
1912}
1913
1914Error
Tamas Berghammer63c8be92015-04-15 09:38:48 +00001915NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint,
1916 size_t &actual_opcode_size,
1917 const uint8_t *&trap_opcode_bytes)
Todd Fialaaf245d12014-06-30 21:05:18 +00001918{
Tamas Berghammer63c8be92015-04-15 09:38:48 +00001919 // FIXME put this behind a breakpoint protocol class that can be set per
1920 // architecture. Need MIPS support here.
Todd Fiala2afc5962014-08-21 16:42:31 +00001921 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 };
Tamas Berghammerbe379e12016-02-16 15:14:36 +00001922 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
1923 // linux kernel does otherwise.
1924 static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
Todd Fialaaf245d12014-06-30 21:05:18 +00001925 static const uint8_t g_i386_opcode [] = { 0xCC };
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00001926 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d };
Mohit K. Bhakkad2c2acf92015-04-09 07:12:15 +00001927 static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 };
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001928 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
Tamas Berghammerbe379e12016-02-16 15:14:36 +00001929 static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
Todd Fialaaf245d12014-06-30 21:05:18 +00001930
1931 switch (m_arch.GetMachine ())
1932 {
Todd Fiala2afc5962014-08-21 16:42:31 +00001933 case llvm::Triple::aarch64:
1934 trap_opcode_bytes = g_aarch64_opcode;
1935 actual_opcode_size = sizeof(g_aarch64_opcode);
1936 return Error ();
1937
Tamas Berghammer63c8be92015-04-15 09:38:48 +00001938 case llvm::Triple::arm:
1939 switch (trap_opcode_size_hint)
1940 {
1941 case 2:
1942 trap_opcode_bytes = g_thumb_breakpoint_opcode;
1943 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
1944 return Error ();
1945 case 4:
1946 trap_opcode_bytes = g_arm_breakpoint_opcode;
1947 actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
1948 return Error ();
1949 default:
1950 assert(false && "Unrecognised trap opcode size hint!");
1951 return Error ("Unrecognised trap opcode size hint!");
1952 }
1953
Todd Fialaaf245d12014-06-30 21:05:18 +00001954 case llvm::Triple::x86:
1955 case llvm::Triple::x86_64:
1956 trap_opcode_bytes = g_i386_opcode;
1957 actual_opcode_size = sizeof(g_i386_opcode);
1958 return Error ();
1959
Sagar Thakurce815e42015-06-03 10:14:24 +00001960 case llvm::Triple::mips:
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00001961 case llvm::Triple::mips64:
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +00001962 trap_opcode_bytes = g_mips64_opcode;
1963 actual_opcode_size = sizeof(g_mips64_opcode);
1964 return Error ();
1965
Sagar Thakurce815e42015-06-03 10:14:24 +00001966 case llvm::Triple::mipsel:
Mohit K. Bhakkad2c2acf92015-04-09 07:12:15 +00001967 case llvm::Triple::mips64el:
1968 trap_opcode_bytes = g_mips64el_opcode;
1969 actual_opcode_size = sizeof(g_mips64el_opcode);
1970 return Error ();
1971
Ulrich Weigandbb00d0b2016-04-14 14:28:34 +00001972 case llvm::Triple::systemz:
1973 trap_opcode_bytes = g_s390x_opcode;
1974 actual_opcode_size = sizeof(g_s390x_opcode);
1975 return Error ();
1976
Todd Fialaaf245d12014-06-30 21:05:18 +00001977 default:
1978 assert(false && "CPU type not supported!");
1979 return Error ("CPU type not supported");
1980 }
1981}
1982
1983#if 0
1984ProcessMessage::CrashReason
1985NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info)
1986{
1987 ProcessMessage::CrashReason reason;
1988 assert(info->si_signo == SIGSEGV);
1989
1990 reason = ProcessMessage::eInvalidCrashReason;
1991
1992 switch (info->si_code)
1993 {
1994 default:
1995 assert(false && "unexpected si_code for SIGSEGV");
1996 break;
1997 case SI_KERNEL:
1998 // Linux will occasionally send spurious SI_KERNEL codes.
1999 // (this is poorly documented in sigaction)
2000 // One way to get this is via unaligned SIMD loads.
2001 reason = ProcessMessage::eInvalidAddress; // for lack of anything better
2002 break;
2003 case SEGV_MAPERR:
2004 reason = ProcessMessage::eInvalidAddress;
2005 break;
2006 case SEGV_ACCERR:
2007 reason = ProcessMessage::ePrivilegedAddress;
2008 break;
2009 }
2010
2011 return reason;
2012}
2013#endif
2014
2015
2016#if 0
2017ProcessMessage::CrashReason
2018NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info)
2019{
2020 ProcessMessage::CrashReason reason;
2021 assert(info->si_signo == SIGILL);
2022
2023 reason = ProcessMessage::eInvalidCrashReason;
2024
2025 switch (info->si_code)
2026 {
2027 default:
2028 assert(false && "unexpected si_code for SIGILL");
2029 break;
2030 case ILL_ILLOPC:
2031 reason = ProcessMessage::eIllegalOpcode;
2032 break;
2033 case ILL_ILLOPN:
2034 reason = ProcessMessage::eIllegalOperand;
2035 break;
2036 case ILL_ILLADR:
2037 reason = ProcessMessage::eIllegalAddressingMode;
2038 break;
2039 case ILL_ILLTRP:
2040 reason = ProcessMessage::eIllegalTrap;
2041 break;
2042 case ILL_PRVOPC:
2043 reason = ProcessMessage::ePrivilegedOpcode;
2044 break;
2045 case ILL_PRVREG:
2046 reason = ProcessMessage::ePrivilegedRegister;
2047 break;
2048 case ILL_COPROC:
2049 reason = ProcessMessage::eCoprocessorError;
2050 break;
2051 case ILL_BADSTK:
2052 reason = ProcessMessage::eInternalStackError;
2053 break;
2054 }
2055
2056 return reason;
2057}
2058#endif
2059
2060#if 0
2061ProcessMessage::CrashReason
2062NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info)
2063{
2064 ProcessMessage::CrashReason reason;
2065 assert(info->si_signo == SIGFPE);
2066
2067 reason = ProcessMessage::eInvalidCrashReason;
2068
2069 switch (info->si_code)
2070 {
2071 default:
2072 assert(false && "unexpected si_code for SIGFPE");
2073 break;
2074 case FPE_INTDIV:
2075 reason = ProcessMessage::eIntegerDivideByZero;
2076 break;
2077 case FPE_INTOVF:
2078 reason = ProcessMessage::eIntegerOverflow;
2079 break;
2080 case FPE_FLTDIV:
2081 reason = ProcessMessage::eFloatDivideByZero;
2082 break;
2083 case FPE_FLTOVF:
2084 reason = ProcessMessage::eFloatOverflow;
2085 break;
2086 case FPE_FLTUND:
2087 reason = ProcessMessage::eFloatUnderflow;
2088 break;
2089 case FPE_FLTRES:
2090 reason = ProcessMessage::eFloatInexactResult;
2091 break;
2092 case FPE_FLTINV:
2093 reason = ProcessMessage::eFloatInvalidOperation;
2094 break;
2095 case FPE_FLTSUB:
2096 reason = ProcessMessage::eFloatSubscriptRange;
2097 break;
2098 }
2099
2100 return reason;
2101}
2102#endif
2103
2104#if 0
2105ProcessMessage::CrashReason
2106NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info)
2107{
2108 ProcessMessage::CrashReason reason;
2109 assert(info->si_signo == SIGBUS);
2110
2111 reason = ProcessMessage::eInvalidCrashReason;
2112
2113 switch (info->si_code)
2114 {
2115 default:
2116 assert(false && "unexpected si_code for SIGBUS");
2117 break;
2118 case BUS_ADRALN:
2119 reason = ProcessMessage::eIllegalAlignment;
2120 break;
2121 case BUS_ADRERR:
2122 reason = ProcessMessage::eIllegalAddress;
2123 break;
2124 case BUS_OBJERR:
2125 reason = ProcessMessage::eHardwareError;
2126 break;
2127 }
2128
2129 return reason;
2130}
2131#endif
2132
Todd Fialaaf245d12014-06-30 21:05:18 +00002133Error
Chaoren Lin26438d22015-05-05 17:50:53 +00002134NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
Todd Fialaaf245d12014-06-30 21:05:18 +00002135{
Pavel Labathdf7c6992015-06-17 18:38:49 +00002136 if (ProcessVmReadvSupported()) {
2137 // The process_vm_readv path is about 50 times faster than ptrace api. We want to use
2138 // this syscall if it is supported.
2139
2140 const ::pid_t pid = GetID();
2141
2142 struct iovec local_iov, remote_iov;
2143 local_iov.iov_base = buf;
2144 local_iov.iov_len = size;
2145 remote_iov.iov_base = reinterpret_cast<void *>(addr);
2146 remote_iov.iov_len = size;
2147
2148 bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0);
2149 const bool success = bytes_read == size;
2150
2151 Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2152 if (log)
2153 log->Printf ("NativeProcessLinux::%s using process_vm_readv to read %zd bytes from inferior address 0x%" PRIx64": %s",
2154 __FUNCTION__, size, addr, success ? "Success" : strerror(errno));
2155
2156 if (success)
2157 return Error();
2158 // else
2159 // the call failed for some reason, let's retry the read using ptrace api.
2160 }
2161
Pavel Labath19cbe962015-07-21 13:20:32 +00002162 unsigned char *dst = static_cast<unsigned char*>(buf);
2163 size_t remainder;
2164 long data;
2165
2166 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2167 if (log)
2168 ProcessPOSIXLog::IncNestLevel();
2169 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
2170 log->Printf ("NativeProcessLinux::%s(%p, %p, %zd, _)", __FUNCTION__, (void*)addr, buf, size);
2171
2172 for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
2173 {
2174 Error error = NativeProcessLinux::PtraceWrapper(PTRACE_PEEKDATA, GetID(), (void*)addr, nullptr, 0, &data);
2175 if (error.Fail())
2176 {
2177 if (log)
2178 ProcessPOSIXLog::DecNestLevel();
2179 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
Mohit K. Bhakkadf6ef1872015-12-23 12:34:58 +00002186 memcpy(dst, &data, remainder);
Pavel Labath19cbe962015-07-21 13:20:32 +00002187
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 {
2193 uintptr_t print_dst = 0;
2194 // Format bytes from data by moving into print_dst for log output
2195 for (unsigned i = 0; i < remainder; ++i)
2196 print_dst |= (((data >> i*8) & 0xFF) << i*8);
Pavel Labath79203992015-07-23 13:07:37 +00002197 log->Printf ("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64 " (0x%" PRIx64 ")",
2198 __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data));
Pavel Labath19cbe962015-07-21 13:20:32 +00002199 }
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
2209Error
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002210NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
2211{
2212 Error error = ReadMemory(addr, buf, size, bytes_read);
2213 if (error.Fail()) return error;
2214 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size);
2215}
2216
2217Error
2218NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written)
Todd Fialaaf245d12014-06-30 21:05:18 +00002219{
Pavel Labath19cbe962015-07-21 13:20:32 +00002220 const unsigned char *src = static_cast<const unsigned char*>(buf);
2221 size_t remainder;
2222 Error error;
2223
2224 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2225 if (log)
2226 ProcessPOSIXLog::IncNestLevel();
2227 if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
Pavel Labath79203992015-07-23 13:07:37 +00002228 log->Printf ("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__, addr, buf, size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002229
2230 for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
2231 {
2232 remainder = size - bytes_written;
2233 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2234
2235 if (remainder == k_ptrace_word_size)
2236 {
2237 unsigned long data = 0;
Mohit K. Bhakkadf6ef1872015-12-23 12:34:58 +00002238 memcpy(&data, src, k_ptrace_word_size);
Pavel Labath19cbe962015-07-21 13:20:32 +00002239
2240 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(), (void*)addr, (void*)data);
2248 if (error.Fail())
2249 {
2250 if (log)
2251 ProcessPOSIXLog::DecNestLevel();
2252 return error;
2253 }
2254 }
2255 else
2256 {
2257 unsigned char buff[8];
2258 size_t bytes_read;
2259 error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read);
2260 if (error.Fail())
2261 {
2262 if (log)
2263 ProcessPOSIXLog::DecNestLevel();
2264 return error;
2265 }
2266
2267 memcpy(buff, src, remainder);
2268
2269 size_t bytes_written_rec;
2270 error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec);
2271 if (error.Fail())
2272 {
2273 if (log)
2274 ProcessPOSIXLog::DecNestLevel();
2275 return error;
2276 }
2277
2278 if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2279 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2280 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2281 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2282 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2283 (void*)addr, *(const unsigned long*)src, *(unsigned long*)buff);
2284 }
2285
2286 addr += k_ptrace_word_size;
2287 src += k_ptrace_word_size;
2288 }
2289 if (log)
2290 ProcessPOSIXLog::DecNestLevel();
2291 return error;
Todd Fialaaf245d12014-06-30 21:05:18 +00002292}
2293
Chaoren Lin97ccc292015-02-03 01:51:12 +00002294Error
Chaoren Lin97ccc292015-02-03 01:51:12 +00002295NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo)
Todd Fialaaf245d12014-06-30 21:05:18 +00002296{
Pavel Labath19cbe962015-07-21 13:20:32 +00002297 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo);
Todd Fialaaf245d12014-06-30 21:05:18 +00002298}
2299
Chaoren Lin97ccc292015-02-03 01:51:12 +00002300Error
Todd Fialaaf245d12014-06-30 21:05:18 +00002301NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message)
2302{
Pavel Labath19cbe962015-07-21 13:20:32 +00002303 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message);
Todd Fialaaf245d12014-06-30 21:05:18 +00002304}
2305
Tamas Berghammerdb264a62015-03-31 09:52:22 +00002306Error
Todd Fialaaf245d12014-06-30 21:05:18 +00002307NativeProcessLinux::Detach(lldb::tid_t tid)
2308{
Chaoren Lin97ccc292015-02-03 01:51:12 +00002309 if (tid == LLDB_INVALID_THREAD_ID)
2310 return Error();
2311
Pavel Labath19cbe962015-07-21 13:20:32 +00002312 return PtraceWrapper(PTRACE_DETACH, tid);
Todd Fialaaf245d12014-06-30 21:05:18 +00002313}
2314
2315bool
Todd Fialaaf245d12014-06-30 21:05:18 +00002316NativeProcessLinux::HasThreadNoLock (lldb::tid_t thread_id)
2317{
2318 for (auto thread_sp : m_threads)
2319 {
2320 assert (thread_sp && "thread list should not contain NULL threads");
2321 if (thread_sp->GetID () == thread_id)
2322 {
2323 // We have this thread.
2324 return true;
2325 }
2326 }
2327
2328 // We don't have this thread.
2329 return false;
2330}
2331
Todd Fialaaf245d12014-06-30 21:05:18 +00002332bool
2333NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id)
2334{
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002335 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2336
2337 if (log)
2338 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread_id);
2339
2340 bool found = false;
2341
Todd Fialaaf245d12014-06-30 21:05:18 +00002342 for (auto it = m_threads.begin (); it != m_threads.end (); ++it)
2343 {
2344 if (*it && ((*it)->GetID () == thread_id))
2345 {
2346 m_threads.erase (it);
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002347 found = true;
2348 break;
Todd Fialaaf245d12014-06-30 21:05:18 +00002349 }
2350 }
2351
Pavel Labath0e1d7292015-08-20 09:06:12 +00002352 SignalIfAllThreadsStopped();
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002353
2354 return found;
Todd Fialaaf245d12014-06-30 21:05:18 +00002355}
2356
Pavel Labathf9077782015-08-21 09:13:53 +00002357NativeThreadLinuxSP
Todd Fialaaf245d12014-06-30 21:05:18 +00002358NativeProcessLinux::AddThread (lldb::tid_t thread_id)
2359{
2360 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
2361
Todd Fialaaf245d12014-06-30 21:05:18 +00002362 if (log)
2363 {
2364 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " adding thread with tid %" PRIu64,
2365 __FUNCTION__,
2366 GetID (),
2367 thread_id);
2368 }
2369
2370 assert (!HasThreadNoLock (thread_id) && "attempted to add a thread by id that already exists");
2371
2372 // If this is the first thread, save it as the current thread
2373 if (m_threads.empty ())
2374 SetCurrentThreadID (thread_id);
2375
Pavel Labathf9077782015-08-21 09:13:53 +00002376 auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id);
Todd Fialaaf245d12014-06-30 21:05:18 +00002377 m_threads.push_back (thread_sp);
Todd Fialaaf245d12014-06-30 21:05:18 +00002378 return thread_sp;
2379}
2380
Todd Fialaaf245d12014-06-30 21:05:18 +00002381Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002382NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread)
Todd Fialaaf245d12014-06-30 21:05:18 +00002383{
Todd Fiala75f47c32014-10-11 21:42:09 +00002384 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
Todd Fialaaf245d12014-06-30 21:05:18 +00002385
2386 Error error;
2387
Todd Fialaaf245d12014-06-30 21:05:18 +00002388 // Find out the size of a breakpoint (might depend on where we are in the code).
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002389 NativeRegisterContextSP context_sp = thread.GetRegisterContext();
Todd Fialaaf245d12014-06-30 21:05:18 +00002390 if (!context_sp)
2391 {
2392 error.SetErrorString ("cannot get a NativeRegisterContext for the thread");
2393 if (log)
2394 log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ());
2395 return error;
2396 }
2397
2398 uint32_t breakpoint_size = 0;
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002399 error = GetSoftwareBreakpointPCOffset(breakpoint_size);
Todd Fialaaf245d12014-06-30 21:05:18 +00002400 if (error.Fail ())
2401 {
2402 if (log)
2403 log->Printf ("NativeProcessLinux::%s GetBreakpointSize() failed: %s", __FUNCTION__, error.AsCString ());
2404 return error;
2405 }
2406 else
2407 {
2408 if (log)
2409 log->Printf ("NativeProcessLinux::%s breakpoint size: %" PRIu32, __FUNCTION__, breakpoint_size);
2410 }
2411
2412 // First try probing for a breakpoint at a software breakpoint location: PC - breakpoint size.
Jaydeep Patilc60c9452015-06-23 03:37:08 +00002413 const lldb::addr_t initial_pc_addr = context_sp->GetPCfromBreakpointLocation ();
Todd Fialaaf245d12014-06-30 21:05:18 +00002414 lldb::addr_t breakpoint_addr = initial_pc_addr;
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002415 if (breakpoint_size > 0)
Todd Fialaaf245d12014-06-30 21:05:18 +00002416 {
2417 // Do not allow breakpoint probe to wrap around.
Chaoren Lin3eb4b452015-04-29 17:24:48 +00002418 if (breakpoint_addr >= breakpoint_size)
2419 breakpoint_addr -= breakpoint_size;
Todd Fialaaf245d12014-06-30 21:05:18 +00002420 }
2421
2422 // Check if we stopped because of a breakpoint.
2423 NativeBreakpointSP breakpoint_sp;
2424 error = m_breakpoint_list.GetBreakpoint (breakpoint_addr, breakpoint_sp);
2425 if (!error.Success () || !breakpoint_sp)
2426 {
2427 // We didn't find one at a software probe location. Nothing to do.
2428 if (log)
2429 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64, __FUNCTION__, GetID (), breakpoint_addr);
2430 return Error ();
2431 }
2432
2433 // If the breakpoint is not a software breakpoint, nothing to do.
2434 if (!breakpoint_sp->IsSoftwareBreakpoint ())
2435 {
2436 if (log)
2437 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", not software, nothing to adjust", __FUNCTION__, GetID (), breakpoint_addr);
2438 return Error ();
2439 }
2440
2441 //
2442 // We have a software breakpoint and need to adjust the PC.
2443 //
2444
2445 // Sanity check.
2446 if (breakpoint_size == 0)
2447 {
2448 // Nothing to do! How did we get here?
2449 if (log)
2450 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", it is software, but the size is zero, nothing to do (unexpected)", __FUNCTION__, GetID (), breakpoint_addr);
2451 return Error ();
2452 }
2453
2454 // Change the program counter.
2455 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002456 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64, __FUNCTION__, GetID(), thread.GetID(), initial_pc_addr, breakpoint_addr);
Todd Fialaaf245d12014-06-30 21:05:18 +00002457
2458 error = context_sp->SetPC (breakpoint_addr);
2459 if (error.Fail ())
2460 {
2461 if (log)
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002462 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID(), thread.GetID(), error.AsCString ());
Todd Fialaaf245d12014-06-30 21:05:18 +00002463 return error;
2464 }
2465
2466 return error;
2467}
Chaoren Linfa03ad22015-02-03 01:50:42 +00002468
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002469Error
2470NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec)
2471{
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002472 FileSpec module_file_spec(module_path, true);
2473
Pavel Labath162fb8e2015-07-23 14:47:33 +00002474 bool found = false;
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002475 file_spec.Clear();
Pavel Labath162fb8e2015-07-23 14:47:33 +00002476 ProcFileReader::ProcessLineByLine(GetID(), "maps",
2477 [&] (const std::string &line)
2478 {
2479 SmallVector<StringRef, 16> columns;
2480 StringRef(line).split(columns, " ", -1, false);
2481 if (columns.size() < 6)
2482 return true; // continue searching
2483
2484 FileSpec this_file_spec(columns[5].str().c_str(), false);
2485 if (this_file_spec.GetFilename() != module_file_spec.GetFilename())
2486 return true; // continue searching
2487
2488 file_spec = this_file_spec;
2489 found = true;
2490 return false; // we are done
2491 });
2492
2493 if (! found)
2494 return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
2495 module_file_spec.GetFilename().AsCString(), GetID());
2496
2497 return Error();
Tamas Berghammer7cb18bf2015-03-24 11:15:23 +00002498}
Pavel Labathc0765592015-05-06 10:46:34 +00002499
Pavel Labath5eb721e2015-05-07 08:30:31 +00002500Error
Tamas Berghammer783bfc82015-06-18 20:43:56 +00002501NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef& file_name, lldb::addr_t& load_addr)
2502{
2503 load_addr = LLDB_INVALID_ADDRESS;
2504 Error error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
2505 [&] (const std::string &line) -> bool
2506 {
2507 StringRef maps_row(line);
2508
2509 SmallVector<StringRef, 16> maps_columns;
2510 maps_row.split(maps_columns, StringRef(" "), -1, false);
2511
2512 if (maps_columns.size() < 6)
2513 {
2514 // Return true to continue reading the proc file
2515 return true;
2516 }
2517
2518 if (maps_columns[5] == file_name)
2519 {
2520 StringExtractor addr_extractor(maps_columns[0].str().c_str());
2521 load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2522
2523 // Return false to stop reading the proc file further
2524 return false;
2525 }
2526
2527 // Return true to continue reading the proc file
2528 return true;
2529 });
2530 return error;
2531}
2532
Pavel Labathf9077782015-08-21 09:13:53 +00002533NativeThreadLinuxSP
2534NativeProcessLinux::GetThreadByID(lldb::tid_t tid)
2535{
2536 return std::static_pointer_cast<NativeThreadLinux>(NativeProcessProtocol::GetThreadByID(tid));
2537}
2538
Tamas Berghammer783bfc82015-06-18 20:43:56 +00002539Error
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002540NativeProcessLinux::ResumeThread(NativeThreadLinux &thread, lldb::StateType state, int signo)
Pavel Labathc0765592015-05-06 10:46:34 +00002541{
Pavel Labath5eb721e2015-05-07 08:30:31 +00002542 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002543
2544 if (log)
Pavel Labath0e1d7292015-08-20 09:06:12 +00002545 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")",
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002546 __FUNCTION__, thread.GetID());
Pavel Labath5eb721e2015-05-07 08:30:31 +00002547
Pavel Labathc0765592015-05-06 10:46:34 +00002548 // Before we do the resume below, first check if we have a pending
Pavel Labath108c3252015-05-12 09:03:18 +00002549 // stop notification that is currently waiting for
Pavel Labath0e1d7292015-08-20 09:06:12 +00002550 // all threads to stop. This is potentially a buggy situation since
Pavel Labathc0765592015-05-06 10:46:34 +00002551 // we're ostensibly waiting for threads to stop before we send out the
2552 // pending notification, and here we are resuming one before we send
2553 // out the pending stop notification.
Pavel Labath0e1d7292015-08-20 09:06:12 +00002554 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log)
Pavel Labathc0765592015-05-06 10:46:34 +00002555 {
Pavel Labathb9cc0c72015-08-24 09:22:04 +00002556 log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64 " per explicit request but we have a pending stop notification (tid %" PRIu64 ") that is actively waiting for this thread to stop. Valid sequence of events?", __FUNCTION__, thread.GetID(), m_pending_notification_tid);
Pavel Labathc0765592015-05-06 10:46:34 +00002557 }
2558
2559 // Request a resume. We expect this to be synchronous and the system
2560 // to reflect it is running after this completes.
Pavel Labath0e1d7292015-08-20 09:06:12 +00002561 switch (state)
Pavel Labathc0765592015-05-06 10:46:34 +00002562 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002563 case eStateRunning:
2564 {
Pavel Labath605b51b2016-02-23 13:56:30 +00002565 const auto resume_result = thread.Resume(signo);
Pavel Labath0e1d7292015-08-20 09:06:12 +00002566 if (resume_result.Success())
2567 SetState(eStateRunning, true);
2568 return resume_result;
Pavel Labathc0765592015-05-06 10:46:34 +00002569 }
Pavel Labath0e1d7292015-08-20 09:06:12 +00002570 case eStateStepping:
2571 {
Pavel Labath605b51b2016-02-23 13:56:30 +00002572 const auto step_result = thread.SingleStep(signo);
Pavel Labath0e1d7292015-08-20 09:06:12 +00002573 if (step_result.Success())
2574 SetState(eStateRunning, true);
2575 return step_result;
2576 }
2577 default:
2578 if (log)
2579 log->Printf("NativeProcessLinux::%s Unhandled state %s.",
2580 __FUNCTION__, StateAsCString(state));
2581 llvm_unreachable("Unhandled state for resume");
2582 }
Pavel Labathc0765592015-05-06 10:46:34 +00002583}
2584
2585//===----------------------------------------------------------------------===//
2586
2587void
Pavel Labath337f3eb2015-05-08 08:57:45 +00002588NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid)
Pavel Labathc0765592015-05-06 10:46:34 +00002589{
Pavel Labath5eb721e2015-05-07 08:30:31 +00002590 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
Pavel Labathc0765592015-05-06 10:46:34 +00002591
Pavel Labath5eb721e2015-05-07 08:30:31 +00002592 if (log)
Pavel Labathc0765592015-05-06 10:46:34 +00002593 {
Pavel Labath5eb721e2015-05-07 08:30:31 +00002594 log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")",
Pavel Labathc0765592015-05-06 10:46:34 +00002595 __FUNCTION__, triggering_tid);
2596 }
2597
Pavel Labath0e1d7292015-08-20 09:06:12 +00002598 m_pending_notification_tid = triggering_tid;
2599
2600 // Request a stop for all the thread stops that need to be stopped
2601 // and are not already known to be stopped.
2602 for (const auto &thread_sp: m_threads)
2603 {
2604 if (StateIsRunningState(thread_sp->GetState()))
2605 static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop();
2606 }
2607
2608 SignalIfAllThreadsStopped();
Pavel Labathc0765592015-05-06 10:46:34 +00002609
Pavel Labath5eb721e2015-05-07 08:30:31 +00002610 if (log)
Pavel Labathc0765592015-05-06 10:46:34 +00002611 {
Pavel Labath5eb721e2015-05-07 08:30:31 +00002612 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__);
Pavel Labathc0765592015-05-06 10:46:34 +00002613 }
2614}
2615
2616void
Pavel Labath9eb1ecb2015-05-15 13:49:01 +00002617NativeProcessLinux::SignalIfAllThreadsStopped()
Pavel Labathc0765592015-05-06 10:46:34 +00002618{
Pavel Labath0e1d7292015-08-20 09:06:12 +00002619 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID)
2620 return; // No pending notification. Nothing to do.
Pavel Labath9eb1ecb2015-05-15 13:49:01 +00002621
Pavel Labath8c8ff7a2015-05-11 10:03:10 +00002622 for (const auto &thread_sp: m_threads)
Pavel Labathc0765592015-05-06 10:46:34 +00002623 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002624 if (StateIsRunningState(thread_sp->GetState()))
2625 return; // Some threads are still running. Don't signal yet.
Pavel Labathc0765592015-05-06 10:46:34 +00002626 }
2627
Pavel Labath0e1d7292015-08-20 09:06:12 +00002628 // We have a pending notification and all threads have stopped.
2629 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
Pavel Labathc0765592015-05-06 10:46:34 +00002630
Pavel Labath0e1d7292015-08-20 09:06:12 +00002631 // Clear any temporary breakpoints we used to implement software single stepping.
2632 for (const auto &thread_info: m_threads_stepping_with_breakpoint)
Pavel Labathc0765592015-05-06 10:46:34 +00002633 {
Pavel Labath0e1d7292015-08-20 09:06:12 +00002634 Error error = RemoveBreakpoint (thread_info.second);
2635 if (error.Fail())
2636 if (log)
2637 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " remove stepping breakpoint: %s",
2638 __FUNCTION__, thread_info.first, error.AsCString());
Pavel Labathc0765592015-05-06 10:46:34 +00002639 }
Pavel Labath0e1d7292015-08-20 09:06:12 +00002640 m_threads_stepping_with_breakpoint.clear();
Pavel Labathc0765592015-05-06 10:46:34 +00002641
Pavel Labath0e1d7292015-08-20 09:06:12 +00002642 // Notify the delegate about the stop
2643 SetCurrentThreadID(m_pending_notification_tid);
2644 SetState(StateType::eStateStopped, true);
2645 m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
Pavel Labathc0765592015-05-06 10:46:34 +00002646}
2647
2648void
Pavel Labathf9077782015-08-21 09:13:53 +00002649NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread)
Pavel Labathc0765592015-05-06 10:46:34 +00002650{
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002651 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2652
2653 if (log)
Pavel Labathf9077782015-08-21 09:13:53 +00002654 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread.GetID());
Pavel Labath1dbc6c92015-05-12 08:35:33 +00002655
Pavel Labathf9077782015-08-21 09:13:53 +00002656 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && StateIsRunningState(thread.GetState()))
Pavel Labathc0765592015-05-06 10:46:34 +00002657 {
2658 // We will need to wait for this new thread to stop as well before firing the
2659 // notification.
Pavel Labathf9077782015-08-21 09:13:53 +00002660 thread.RequestStop();
Pavel Labathc0765592015-05-06 10:46:34 +00002661 }
2662}
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002663
Pavel Labath19cbe962015-07-21 13:20:32 +00002664void
2665NativeProcessLinux::SigchldHandler()
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002666{
Pavel Labath19cbe962015-07-21 13:20:32 +00002667 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
2668 // Process all pending waitpid notifications.
2669 while (true)
2670 {
2671 int status = -1;
2672 ::pid_t wait_pid = waitpid(-1, &status, __WALL | __WNOTHREAD | WNOHANG);
2673
2674 if (wait_pid == 0)
2675 break; // We are done.
2676
2677 if (wait_pid == -1)
2678 {
2679 if (errno == EINTR)
2680 continue;
2681
2682 Error error(errno, eErrorTypePOSIX);
2683 if (log)
2684 log->Printf("NativeProcessLinux::%s waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG) failed: %s",
2685 __FUNCTION__, error.AsCString());
2686 break;
2687 }
2688
2689 bool exited = false;
2690 int signal = 0;
2691 int exit_status = 0;
2692 const char *status_cstr = nullptr;
2693 if (WIFSTOPPED(status))
2694 {
2695 signal = WSTOPSIG(status);
2696 status_cstr = "STOPPED";
2697 }
2698 else if (WIFEXITED(status))
2699 {
2700 exit_status = WEXITSTATUS(status);
2701 status_cstr = "EXITED";
2702 exited = true;
2703 }
2704 else if (WIFSIGNALED(status))
2705 {
2706 signal = WTERMSIG(status);
2707 status_cstr = "SIGNALED";
Omair Javaiddee4a862015-08-19 10:44:16 +00002708 if (wait_pid == static_cast< ::pid_t>(GetID())) {
Pavel Labath19cbe962015-07-21 13:20:32 +00002709 exited = true;
2710 exit_status = -1;
2711 }
2712 }
2713 else
2714 status_cstr = "(\?\?\?)";
2715
2716 if (log)
2717 log->Printf("NativeProcessLinux::%s: waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG)"
2718 "=> pid = %" PRIi32 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
2719 __FUNCTION__, wait_pid, status, status_cstr, signal, exit_status);
2720
2721 MonitorCallback (wait_pid, exited, signal, exit_status);
2722 }
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002723}
2724
2725// Wrapper for ptrace to catch errors and log calls.
2726// Note that ptrace sets errno on error because -1 can be a valid result (i.e. for PTRACE_PEEK*)
Pavel Labath4a9babb2015-06-30 17:04:49 +00002727Error
2728NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, long *result)
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002729{
Pavel Labath4a9babb2015-06-30 17:04:49 +00002730 Error error;
2731 long int ret;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002732
2733 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE));
2734
2735 PtraceDisplayBytes(req, data, data_size);
2736
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002737 errno = 0;
2738 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
Pavel Labath4a9babb2015-06-30 17:04:49 +00002739 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002740 else
Pavel Labath4a9babb2015-06-30 17:04:49 +00002741 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002742
Pavel Labath4a9babb2015-06-30 17:04:49 +00002743 if (ret == -1)
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002744 error.SetErrorToErrno();
2745
Pavel Labath4a9babb2015-06-30 17:04:49 +00002746 if (result)
2747 *result = ret;
2748
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002749 if (log)
Pavel Labath4a9babb2015-06-30 17:04:49 +00002750 log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr, data, data_size, ret);
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002751
2752 PtraceDisplayBytes(req, data, data_size);
2753
2754 if (log && error.GetError() != 0)
2755 {
2756 const char* str;
2757 switch (error.GetError())
2758 {
2759 case ESRCH: str = "ESRCH"; break;
2760 case EINVAL: str = "EINVAL"; break;
2761 case EBUSY: str = "EBUSY"; break;
2762 case EPERM: str = "EPERM"; break;
2763 default: str = error.AsCString();
2764 }
2765 log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str);
2766 }
2767
Pavel Labath4a9babb2015-06-30 17:04:49 +00002768 return error;
Tamas Berghammer068f8a72015-05-26 11:58:52 +00002769}