1 //===-- 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 10 #include "NativeProcessLinux.h" 11 12 // C Includes 13 #include <errno.h> 14 #include <stdint.h> 15 #include <string.h> 16 #include <unistd.h> 17 18 // C++ Includes 19 #include <fstream> 20 #include <mutex> 21 #include <sstream> 22 #include <string> 23 #include <unordered_map> 24 25 // Other libraries and framework includes 26 #include "lldb/Core/EmulateInstruction.h" 27 #include "lldb/Core/ModuleSpec.h" 28 #include "lldb/Core/RegisterValue.h" 29 #include "lldb/Core/State.h" 30 #include "lldb/Host/Host.h" 31 #include "lldb/Host/HostProcess.h" 32 #include "lldb/Host/PseudoTerminal.h" 33 #include "lldb/Host/ThreadLauncher.h" 34 #include "lldb/Host/common/NativeBreakpoint.h" 35 #include "lldb/Host/common/NativeRegisterContext.h" 36 #include "lldb/Host/linux/Ptrace.h" 37 #include "lldb/Host/linux/Uio.h" 38 #include "lldb/Host/posix/ProcessLauncherPosixFork.h" 39 #include "lldb/Symbol/ObjectFile.h" 40 #include "lldb/Target/Process.h" 41 #include "lldb/Target/ProcessLaunchInfo.h" 42 #include "lldb/Target/Target.h" 43 #include "lldb/Utility/LLDBAssert.h" 44 #include "lldb/Utility/Status.h" 45 #include "lldb/Utility/StringExtractor.h" 46 #include "llvm/Support/Errno.h" 47 #include "llvm/Support/FileSystem.h" 48 #include "llvm/Support/Threading.h" 49 50 #include "NativeThreadLinux.h" 51 #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" 52 #include "Procfs.h" 53 54 #include <linux/unistd.h> 55 #include <sys/socket.h> 56 #include <sys/syscall.h> 57 #include <sys/types.h> 58 #include <sys/user.h> 59 #include <sys/wait.h> 60 61 // Support hardware breakpoints in case it has not been defined 62 #ifndef TRAP_HWBKPT 63 #define TRAP_HWBKPT 4 64 #endif 65 66 using namespace lldb; 67 using namespace lldb_private; 68 using namespace lldb_private::process_linux; 69 using namespace llvm; 70 71 // Private bits we only need internally. 72 73 static bool ProcessVmReadvSupported() { 74 static bool is_supported; 75 static llvm::once_flag flag; 76 77 llvm::call_once(flag, [] { 78 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 79 80 uint32_t source = 0x47424742; 81 uint32_t dest = 0; 82 83 struct iovec local, remote; 84 remote.iov_base = &source; 85 local.iov_base = &dest; 86 remote.iov_len = local.iov_len = sizeof source; 87 88 // We shall try if cross-process-memory reads work by attempting to read a 89 // value from our own process. 90 ssize_t res = process_vm_readv(getpid(), &local, 1, &remote, 1, 0); 91 is_supported = (res == sizeof(source) && source == dest); 92 if (is_supported) 93 LLDB_LOG(log, 94 "Detected kernel support for process_vm_readv syscall. " 95 "Fast memory reads enabled."); 96 else 97 LLDB_LOG(log, 98 "syscall process_vm_readv failed (error: {0}). Fast memory " 99 "reads disabled.", 100 llvm::sys::StrError()); 101 }); 102 103 return is_supported; 104 } 105 106 namespace { 107 void MaybeLogLaunchInfo(const ProcessLaunchInfo &info) { 108 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 109 if (!log) 110 return; 111 112 if (const FileAction *action = info.GetFileActionForFD(STDIN_FILENO)) 113 LLDB_LOG(log, "setting STDIN to '{0}'", action->GetFileSpec()); 114 else 115 LLDB_LOG(log, "leaving STDIN as is"); 116 117 if (const FileAction *action = info.GetFileActionForFD(STDOUT_FILENO)) 118 LLDB_LOG(log, "setting STDOUT to '{0}'", action->GetFileSpec()); 119 else 120 LLDB_LOG(log, "leaving STDOUT as is"); 121 122 if (const FileAction *action = info.GetFileActionForFD(STDERR_FILENO)) 123 LLDB_LOG(log, "setting STDERR to '{0}'", action->GetFileSpec()); 124 else 125 LLDB_LOG(log, "leaving STDERR as is"); 126 127 int i = 0; 128 for (const char **args = info.GetArguments().GetConstArgumentVector(); *args; 129 ++args, ++i) 130 LLDB_LOG(log, "arg {0}: '{1}'", i, *args); 131 } 132 133 void DisplayBytes(StreamString &s, void *bytes, uint32_t count) { 134 uint8_t *ptr = (uint8_t *)bytes; 135 const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count); 136 for (uint32_t i = 0; i < loop_count; i++) { 137 s.Printf("[%x]", *ptr); 138 ptr++; 139 } 140 } 141 142 void PtraceDisplayBytes(int &req, void *data, size_t data_size) { 143 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 144 if (!log) 145 return; 146 StreamString buf; 147 148 switch (req) { 149 case PTRACE_POKETEXT: { 150 DisplayBytes(buf, &data, 8); 151 LLDB_LOGV(log, "PTRACE_POKETEXT {0}", buf.GetData()); 152 break; 153 } 154 case PTRACE_POKEDATA: { 155 DisplayBytes(buf, &data, 8); 156 LLDB_LOGV(log, "PTRACE_POKEDATA {0}", buf.GetData()); 157 break; 158 } 159 case PTRACE_POKEUSER: { 160 DisplayBytes(buf, &data, 8); 161 LLDB_LOGV(log, "PTRACE_POKEUSER {0}", buf.GetData()); 162 break; 163 } 164 case PTRACE_SETREGS: { 165 DisplayBytes(buf, data, data_size); 166 LLDB_LOGV(log, "PTRACE_SETREGS {0}", buf.GetData()); 167 break; 168 } 169 case PTRACE_SETFPREGS: { 170 DisplayBytes(buf, data, data_size); 171 LLDB_LOGV(log, "PTRACE_SETFPREGS {0}", buf.GetData()); 172 break; 173 } 174 case PTRACE_SETSIGINFO: { 175 DisplayBytes(buf, data, sizeof(siginfo_t)); 176 LLDB_LOGV(log, "PTRACE_SETSIGINFO {0}", buf.GetData()); 177 break; 178 } 179 case PTRACE_SETREGSET: { 180 // Extract iov_base from data, which is a pointer to the struct iovec 181 DisplayBytes(buf, *(void **)data, data_size); 182 LLDB_LOGV(log, "PTRACE_SETREGSET {0}", buf.GetData()); 183 break; 184 } 185 default: {} 186 } 187 } 188 189 static constexpr unsigned k_ptrace_word_size = sizeof(void *); 190 static_assert(sizeof(long) >= k_ptrace_word_size, 191 "Size of long must be larger than ptrace word size"); 192 } // end of anonymous namespace 193 194 // Simple helper function to ensure flags are enabled on the given file 195 // descriptor. 196 static Status EnsureFDFlags(int fd, int flags) { 197 Status error; 198 199 int status = fcntl(fd, F_GETFL); 200 if (status == -1) { 201 error.SetErrorToErrno(); 202 return error; 203 } 204 205 if (fcntl(fd, F_SETFL, status | flags) == -1) { 206 error.SetErrorToErrno(); 207 return error; 208 } 209 210 return error; 211 } 212 213 // ----------------------------------------------------------------------------- 214 // Public Static Methods 215 // ----------------------------------------------------------------------------- 216 217 llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 218 NativeProcessLinux::Factory::Launch(ProcessLaunchInfo &launch_info, 219 NativeDelegate &native_delegate, 220 MainLoop &mainloop) const { 221 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 222 223 MaybeLogLaunchInfo(launch_info); 224 225 Status status; 226 ::pid_t pid = ProcessLauncherPosixFork() 227 .LaunchProcess(launch_info, status) 228 .GetProcessId(); 229 LLDB_LOG(log, "pid = {0:x}", pid); 230 if (status.Fail()) { 231 LLDB_LOG(log, "failed to launch process: {0}", status); 232 return status.ToError(); 233 } 234 235 // Wait for the child process to trap on its call to execve. 236 int wstatus; 237 ::pid_t wpid = llvm::sys::RetryAfterSignal(-1, ::waitpid, pid, &wstatus, 0); 238 assert(wpid == pid); 239 (void)wpid; 240 if (!WIFSTOPPED(wstatus)) { 241 LLDB_LOG(log, "Could not sync with inferior process: wstatus={1}", 242 WaitStatus::Decode(wstatus)); 243 return llvm::make_error<StringError>("Could not sync with inferior process", 244 llvm::inconvertibleErrorCode()); 245 } 246 LLDB_LOG(log, "inferior started, now in stopped state"); 247 248 ArchSpec arch; 249 if ((status = ResolveProcessArchitecture(pid, arch)).Fail()) 250 return status.ToError(); 251 252 // Set the architecture to the exe architecture. 253 LLDB_LOG(log, "pid = {0:x}, detected architecture {1}", pid, 254 arch.GetArchitectureName()); 255 256 status = SetDefaultPtraceOpts(pid); 257 if (status.Fail()) { 258 LLDB_LOG(log, "failed to set default ptrace options: {0}", status); 259 return status.ToError(); 260 } 261 262 return std::unique_ptr<NativeProcessLinux>(new NativeProcessLinux( 263 pid, launch_info.GetPTY().ReleaseMasterFileDescriptor(), native_delegate, 264 arch, mainloop, {pid})); 265 } 266 267 llvm::Expected<std::unique_ptr<NativeProcessProtocol>> 268 NativeProcessLinux::Factory::Attach( 269 lldb::pid_t pid, NativeProcessProtocol::NativeDelegate &native_delegate, 270 MainLoop &mainloop) const { 271 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 272 LLDB_LOG(log, "pid = {0:x}", pid); 273 274 // Retrieve the architecture for the running process. 275 ArchSpec arch; 276 Status status = ResolveProcessArchitecture(pid, arch); 277 if (!status.Success()) 278 return status.ToError(); 279 280 auto tids_or = NativeProcessLinux::Attach(pid); 281 if (!tids_or) 282 return tids_or.takeError(); 283 284 return std::unique_ptr<NativeProcessLinux>(new NativeProcessLinux( 285 pid, -1, native_delegate, arch, mainloop, *tids_or)); 286 } 287 288 // ----------------------------------------------------------------------------- 289 // Public Instance Methods 290 // ----------------------------------------------------------------------------- 291 292 NativeProcessLinux::NativeProcessLinux(::pid_t pid, int terminal_fd, 293 NativeDelegate &delegate, 294 const ArchSpec &arch, MainLoop &mainloop, 295 llvm::ArrayRef<::pid_t> tids) 296 : NativeProcessProtocol(pid, terminal_fd, delegate), m_arch(arch) { 297 if (m_terminal_fd != -1) { 298 Status status = EnsureFDFlags(m_terminal_fd, O_NONBLOCK); 299 assert(status.Success()); 300 } 301 302 Status status; 303 m_sigchld_handle = mainloop.RegisterSignal( 304 SIGCHLD, [this](MainLoopBase &) { SigchldHandler(); }, status); 305 assert(m_sigchld_handle && status.Success()); 306 307 for (const auto &tid : tids) { 308 NativeThreadLinux &thread = AddThread(tid); 309 thread.SetStoppedBySignal(SIGSTOP); 310 ThreadWasCreated(thread); 311 } 312 313 // Let our process instance know the thread has stopped. 314 SetCurrentThreadID(tids[0]); 315 SetState(StateType::eStateStopped, false); 316 317 // Proccess any signals we received before installing our handler 318 SigchldHandler(); 319 } 320 321 llvm::Expected<std::vector<::pid_t>> NativeProcessLinux::Attach(::pid_t pid) { 322 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 323 324 Status status; 325 // Use a map to keep track of the threads which we have attached/need to 326 // attach. 327 Host::TidMap tids_to_attach; 328 while (Host::FindProcessThreads(pid, tids_to_attach)) { 329 for (Host::TidMap::iterator it = tids_to_attach.begin(); 330 it != tids_to_attach.end();) { 331 if (it->second == false) { 332 lldb::tid_t tid = it->first; 333 334 // Attach to the requested process. 335 // An attach will cause the thread to stop with a SIGSTOP. 336 if ((status = PtraceWrapper(PTRACE_ATTACH, tid)).Fail()) { 337 // No such thread. The thread may have exited. 338 // More error handling may be needed. 339 if (status.GetError() == ESRCH) { 340 it = tids_to_attach.erase(it); 341 continue; 342 } 343 return status.ToError(); 344 } 345 346 int wpid = 347 llvm::sys::RetryAfterSignal(-1, ::waitpid, tid, nullptr, __WALL); 348 // Need to use __WALL otherwise we receive an error with errno=ECHLD 349 // At this point we should have a thread stopped if waitpid succeeds. 350 if (wpid < 0) { 351 // No such thread. The thread may have exited. 352 // More error handling may be needed. 353 if (errno == ESRCH) { 354 it = tids_to_attach.erase(it); 355 continue; 356 } 357 return llvm::errorCodeToError( 358 std::error_code(errno, std::generic_category())); 359 } 360 361 if ((status = SetDefaultPtraceOpts(tid)).Fail()) 362 return status.ToError(); 363 364 LLDB_LOG(log, "adding tid = {0}", tid); 365 it->second = true; 366 } 367 368 // move the loop forward 369 ++it; 370 } 371 } 372 373 size_t tid_count = tids_to_attach.size(); 374 if (tid_count == 0) 375 return llvm::make_error<StringError>("No such process", 376 llvm::inconvertibleErrorCode()); 377 378 std::vector<::pid_t> tids; 379 tids.reserve(tid_count); 380 for (const auto &p : tids_to_attach) 381 tids.push_back(p.first); 382 return std::move(tids); 383 } 384 385 Status NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid) { 386 long ptrace_opts = 0; 387 388 // Have the child raise an event on exit. This is used to keep the child in 389 // limbo until it is destroyed. 390 ptrace_opts |= PTRACE_O_TRACEEXIT; 391 392 // Have the tracer trace threads which spawn in the inferior process. 393 // TODO: if we want to support tracing the inferiors' child, add the 394 // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK) 395 ptrace_opts |= PTRACE_O_TRACECLONE; 396 397 // Have the tracer notify us before execve returns 398 // (needed to disable legacy SIGTRAP generation) 399 ptrace_opts |= PTRACE_O_TRACEEXEC; 400 401 return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void *)ptrace_opts); 402 } 403 404 // Handles all waitpid events from the inferior process. 405 void NativeProcessLinux::MonitorCallback(lldb::pid_t pid, bool exited, 406 WaitStatus status) { 407 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS)); 408 409 // Certain activities differ based on whether the pid is the tid of the main 410 // thread. 411 const bool is_main_thread = (pid == GetID()); 412 413 // Handle when the thread exits. 414 if (exited) { 415 LLDB_LOG(log, 416 "got exit signal({0}) , tid = {1} ({2} main thread), process " 417 "state = {3}", 418 signal, pid, is_main_thread ? "is" : "is not", GetState()); 419 420 // This is a thread that exited. Ensure we're not tracking it anymore. 421 StopTrackingThread(pid); 422 423 if (is_main_thread) { 424 // The main thread exited. We're done monitoring. Report to delegate. 425 SetExitStatus(status, true); 426 427 // Notify delegate that our process has exited. 428 SetState(StateType::eStateExited, true); 429 } 430 return; 431 } 432 433 siginfo_t info; 434 const auto info_err = GetSignalInfo(pid, &info); 435 auto thread_sp = GetThreadByID(pid); 436 437 if (!thread_sp) { 438 // Normally, the only situation when we cannot find the thread is if we have 439 // just received a new thread notification. This is indicated by 440 // GetSignalInfo() returning si_code == SI_USER and si_pid == 0 441 LLDB_LOG(log, "received notification about an unknown tid {0}.", pid); 442 443 if (info_err.Fail()) { 444 LLDB_LOG(log, 445 "(tid {0}) GetSignalInfo failed ({1}). " 446 "Ingoring this notification.", 447 pid, info_err); 448 return; 449 } 450 451 LLDB_LOG(log, "tid {0}, si_code: {1}, si_pid: {2}", pid, info.si_code, 452 info.si_pid); 453 454 NativeThreadLinux &thread = AddThread(pid); 455 456 // Resume the newly created thread. 457 ResumeThread(thread, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER); 458 ThreadWasCreated(thread); 459 return; 460 } 461 462 // Get details on the signal raised. 463 if (info_err.Success()) { 464 // We have retrieved the signal info. Dispatch appropriately. 465 if (info.si_signo == SIGTRAP) 466 MonitorSIGTRAP(info, *thread_sp); 467 else 468 MonitorSignal(info, *thread_sp, exited); 469 } else { 470 if (info_err.GetError() == EINVAL) { 471 // This is a group stop reception for this tid. 472 // We can reach here if we reinject SIGSTOP, SIGSTP, SIGTTIN or SIGTTOU 473 // into the tracee, triggering the group-stop mechanism. Normally 474 // receiving these would stop the process, pending a SIGCONT. Simulating 475 // this state in a debugger is hard and is generally not needed (one use 476 // case is debugging background task being managed by a shell). For 477 // general use, it is sufficient to stop the process in a signal-delivery 478 // stop which happens before the group stop. This done by MonitorSignal 479 // and works correctly for all signals. 480 LLDB_LOG(log, 481 "received a group stop for pid {0} tid {1}. Transparent " 482 "handling of group stops not supported, resuming the " 483 "thread.", 484 GetID(), pid); 485 ResumeThread(*thread_sp, thread_sp->GetState(), 486 LLDB_INVALID_SIGNAL_NUMBER); 487 } else { 488 // ptrace(GETSIGINFO) failed (but not due to group-stop). 489 490 // A return value of ESRCH means the thread/process is no longer on the 491 // system, so it was killed somehow outside of our control. Either way, 492 // we can't do anything with it anymore. 493 494 // Stop tracking the metadata for the thread since it's entirely off the 495 // system now. 496 const bool thread_found = StopTrackingThread(pid); 497 498 LLDB_LOG(log, 499 "GetSignalInfo failed: {0}, tid = {1}, signal = {2}, " 500 "status = {3}, main_thread = {4}, thread_found: {5}", 501 info_err, pid, signal, status, is_main_thread, thread_found); 502 503 if (is_main_thread) { 504 // Notify the delegate - our process is not available but appears to 505 // have been killed outside 506 // our control. Is eStateExited the right exit state in this case? 507 SetExitStatus(status, true); 508 SetState(StateType::eStateExited, true); 509 } else { 510 // This thread was pulled out from underneath us. Anything to do here? 511 // Do we want to do an all stop? 512 LLDB_LOG(log, 513 "pid {0} tid {1} non-main thread exit occurred, didn't " 514 "tell delegate anything since thread disappeared out " 515 "from underneath us", 516 GetID(), pid); 517 } 518 } 519 } 520 } 521 522 void NativeProcessLinux::WaitForNewThread(::pid_t tid) { 523 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 524 525 if (GetThreadByID(tid)) { 526 // We are already tracking the thread - we got the event on the new thread 527 // (see MonitorSignal) before this one. We are done. 528 return; 529 } 530 531 // The thread is not tracked yet, let's wait for it to appear. 532 int status = -1; 533 LLDB_LOG(log, 534 "received thread creation event for tid {0}. tid not tracked " 535 "yet, waiting for thread to appear...", 536 tid); 537 ::pid_t wait_pid = llvm::sys::RetryAfterSignal(-1, ::waitpid, tid, &status, __WALL); 538 // Since we are waiting on a specific tid, this must be the creation event. 539 // But let's do some checks just in case. 540 if (wait_pid != tid) { 541 LLDB_LOG(log, 542 "waiting for tid {0} failed. Assuming the thread has " 543 "disappeared in the meantime", 544 tid); 545 // The only way I know of this could happen is if the whole process was 546 // SIGKILLed in the mean time. In any case, we can't do anything about that 547 // now. 548 return; 549 } 550 if (WIFEXITED(status)) { 551 LLDB_LOG(log, 552 "waiting for tid {0} returned an 'exited' event. Not " 553 "tracking the thread.", 554 tid); 555 // Also a very improbable event. 556 return; 557 } 558 559 LLDB_LOG(log, "pid = {0}: tracking new thread tid {1}", GetID(), tid); 560 NativeThreadLinux &new_thread = AddThread(tid); 561 562 ResumeThread(new_thread, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER); 563 ThreadWasCreated(new_thread); 564 } 565 566 void NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, 567 NativeThreadLinux &thread) { 568 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 569 const bool is_main_thread = (thread.GetID() == GetID()); 570 571 assert(info.si_signo == SIGTRAP && "Unexpected child signal!"); 572 573 switch (info.si_code) { 574 // TODO: these two cases are required if we want to support tracing of the 575 // inferiors' children. We'd need this to debug a monitor. 576 // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)): 577 // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)): 578 579 case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)): { 580 // This is the notification on the parent thread which informs us of new 581 // thread 582 // creation. 583 // We don't want to do anything with the parent thread so we just resume it. 584 // In case we 585 // want to implement "break on thread creation" functionality, we would need 586 // to stop 587 // here. 588 589 unsigned long event_message = 0; 590 if (GetEventMessage(thread.GetID(), &event_message).Fail()) { 591 LLDB_LOG(log, 592 "pid {0} received thread creation event but " 593 "GetEventMessage failed so we don't know the new tid", 594 thread.GetID()); 595 } else 596 WaitForNewThread(event_message); 597 598 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER); 599 break; 600 } 601 602 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)): { 603 LLDB_LOG(log, "received exec event, code = {0}", info.si_code ^ SIGTRAP); 604 605 // Exec clears any pending notifications. 606 m_pending_notification_tid = LLDB_INVALID_THREAD_ID; 607 608 // Remove all but the main thread here. Linux fork creates a new process 609 // which only copies the main thread. 610 LLDB_LOG(log, "exec received, stop tracking all but main thread"); 611 612 for (auto i = m_threads.begin(); i != m_threads.end();) { 613 if ((*i)->GetID() == GetID()) 614 i = m_threads.erase(i); 615 else 616 ++i; 617 } 618 assert(m_threads.size() == 1); 619 auto *main_thread = static_cast<NativeThreadLinux *>(m_threads[0].get()); 620 621 SetCurrentThreadID(main_thread->GetID()); 622 main_thread->SetStoppedByExec(); 623 624 // Tell coordinator about about the "new" (since exec) stopped main thread. 625 ThreadWasCreated(*main_thread); 626 627 // Let our delegate know we have just exec'd. 628 NotifyDidExec(); 629 630 // Let the process know we're stopped. 631 StopRunningThreads(main_thread->GetID()); 632 633 break; 634 } 635 636 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): { 637 // The inferior process or one of its threads is about to exit. 638 // We don't want to do anything with the thread so we just resume it. In 639 // case we want to implement "break on thread exit" functionality, we would 640 // need to stop here. 641 642 unsigned long data = 0; 643 if (GetEventMessage(thread.GetID(), &data).Fail()) 644 data = -1; 645 646 LLDB_LOG(log, 647 "received PTRACE_EVENT_EXIT, data = {0:x}, WIFEXITED={1}, " 648 "WIFSIGNALED={2}, pid = {3}, main_thread = {4}", 649 data, WIFEXITED(data), WIFSIGNALED(data), thread.GetID(), 650 is_main_thread); 651 652 653 StateType state = thread.GetState(); 654 if (!StateIsRunningState(state)) { 655 // Due to a kernel bug, we may sometimes get this stop after the inferior 656 // gets a SIGKILL. This confuses our state tracking logic in 657 // ResumeThread(), since normally, we should not be receiving any ptrace 658 // events while the inferior is stopped. This makes sure that the inferior 659 // is resumed and exits normally. 660 state = eStateRunning; 661 } 662 ResumeThread(thread, state, LLDB_INVALID_SIGNAL_NUMBER); 663 664 break; 665 } 666 667 case 0: 668 case TRAP_TRACE: // We receive this on single stepping. 669 case TRAP_HWBKPT: // We receive this on watchpoint hit 670 { 671 // If a watchpoint was hit, report it 672 uint32_t wp_index; 673 Status error = thread.GetRegisterContext().GetWatchpointHitIndex( 674 wp_index, (uintptr_t)info.si_addr); 675 if (error.Fail()) 676 LLDB_LOG(log, 677 "received error while checking for watchpoint hits, pid = " 678 "{0}, error = {1}", 679 thread.GetID(), error); 680 if (wp_index != LLDB_INVALID_INDEX32) { 681 MonitorWatchpoint(thread, wp_index); 682 break; 683 } 684 685 // If a breakpoint was hit, report it 686 uint32_t bp_index; 687 error = thread.GetRegisterContext().GetHardwareBreakHitIndex( 688 bp_index, (uintptr_t)info.si_addr); 689 if (error.Fail()) 690 LLDB_LOG(log, "received error while checking for hardware " 691 "breakpoint hits, pid = {0}, error = {1}", 692 thread.GetID(), error); 693 if (bp_index != LLDB_INVALID_INDEX32) { 694 MonitorBreakpoint(thread); 695 break; 696 } 697 698 // Otherwise, report step over 699 MonitorTrace(thread); 700 break; 701 } 702 703 case SI_KERNEL: 704 #if defined __mips__ 705 // For mips there is no special signal for watchpoint 706 // So we check for watchpoint in kernel trap 707 { 708 // If a watchpoint was hit, report it 709 uint32_t wp_index; 710 Status error = thread.GetRegisterContext().GetWatchpointHitIndex( 711 wp_index, LLDB_INVALID_ADDRESS); 712 if (error.Fail()) 713 LLDB_LOG(log, 714 "received error while checking for watchpoint hits, pid = " 715 "{0}, error = {1}", 716 thread.GetID(), error); 717 if (wp_index != LLDB_INVALID_INDEX32) { 718 MonitorWatchpoint(thread, wp_index); 719 break; 720 } 721 } 722 // NO BREAK 723 #endif 724 case TRAP_BRKPT: 725 MonitorBreakpoint(thread); 726 break; 727 728 case SIGTRAP: 729 case (SIGTRAP | 0x80): 730 LLDB_LOG( 731 log, 732 "received unknown SIGTRAP stop event ({0}, pid {1} tid {2}, resuming", 733 info.si_code, GetID(), thread.GetID()); 734 735 // Ignore these signals until we know more about them. 736 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER); 737 break; 738 739 default: 740 LLDB_LOG(log, "received unknown SIGTRAP stop event ({0}, pid {1} tid {2}", 741 info.si_code, GetID(), thread.GetID()); 742 MonitorSignal(info, thread, false); 743 break; 744 } 745 } 746 747 void NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread) { 748 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 749 LLDB_LOG(log, "received trace event, pid = {0}", thread.GetID()); 750 751 // This thread is currently stopped. 752 thread.SetStoppedByTrace(); 753 754 StopRunningThreads(thread.GetID()); 755 } 756 757 void NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread) { 758 Log *log( 759 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 760 LLDB_LOG(log, "received breakpoint event, pid = {0}", thread.GetID()); 761 762 // Mark the thread as stopped at breakpoint. 763 thread.SetStoppedByBreakpoint(); 764 Status error = FixupBreakpointPCAsNeeded(thread); 765 if (error.Fail()) 766 LLDB_LOG(log, "pid = {0} fixup: {1}", thread.GetID(), error); 767 768 if (m_threads_stepping_with_breakpoint.find(thread.GetID()) != 769 m_threads_stepping_with_breakpoint.end()) 770 thread.SetStoppedByTrace(); 771 772 StopRunningThreads(thread.GetID()); 773 } 774 775 void NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread, 776 uint32_t wp_index) { 777 Log *log( 778 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS)); 779 LLDB_LOG(log, "received watchpoint event, pid = {0}, wp_index = {1}", 780 thread.GetID(), wp_index); 781 782 // Mark the thread as stopped at watchpoint. 783 // The address is at (lldb::addr_t)info->si_addr if we need it. 784 thread.SetStoppedByWatchpoint(wp_index); 785 786 // We need to tell all other running threads before we notify the delegate 787 // about this stop. 788 StopRunningThreads(thread.GetID()); 789 } 790 791 void NativeProcessLinux::MonitorSignal(const siginfo_t &info, 792 NativeThreadLinux &thread, bool exited) { 793 const int signo = info.si_signo; 794 const bool is_from_llgs = info.si_pid == getpid(); 795 796 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 797 798 // POSIX says that process behaviour is undefined after it ignores a SIGFPE, 799 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a 800 // kill(2) or raise(3). Similarly for tgkill(2) on Linux. 801 // 802 // IOW, user generated signals never generate what we consider to be a 803 // "crash". 804 // 805 // Similarly, ACK signals generated by this monitor. 806 807 // Handle the signal. 808 LLDB_LOG(log, 809 "received signal {0} ({1}) with code {2}, (siginfo pid = {3}, " 810 "waitpid pid = {4})", 811 Host::GetSignalAsCString(signo), signo, info.si_code, 812 thread.GetID()); 813 814 // Check for thread stop notification. 815 if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP)) { 816 // This is a tgkill()-based stop. 817 LLDB_LOG(log, "pid {0} tid {1}, thread stopped", GetID(), thread.GetID()); 818 819 // Check that we're not already marked with a stop reason. 820 // Note this thread really shouldn't already be marked as stopped - if we 821 // were, that would imply that the kernel signaled us with the thread 822 // stopping which we handled and marked as stopped, and that, without an 823 // intervening resume, we received another stop. It is more likely that we 824 // are missing the marking of a run state somewhere if we find that the 825 // thread was marked as stopped. 826 const StateType thread_state = thread.GetState(); 827 if (!StateIsStoppedState(thread_state, false)) { 828 // An inferior thread has stopped because of a SIGSTOP we have sent it. 829 // Generally, these are not important stops and we don't want to report 830 // them as they are just used to stop other threads when one thread (the 831 // one with the *real* stop reason) hits a breakpoint (watchpoint, 832 // etc...). However, in the case of an asynchronous Interrupt(), this *is* 833 // the real stop reason, so we leave the signal intact if this is the 834 // thread that was chosen as the triggering thread. 835 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID) { 836 if (m_pending_notification_tid == thread.GetID()) 837 thread.SetStoppedBySignal(SIGSTOP, &info); 838 else 839 thread.SetStoppedWithNoReason(); 840 841 SetCurrentThreadID(thread.GetID()); 842 SignalIfAllThreadsStopped(); 843 } else { 844 // We can end up here if stop was initiated by LLGS but by this time a 845 // thread stop has occurred - maybe initiated by another event. 846 Status error = ResumeThread(thread, thread.GetState(), 0); 847 if (error.Fail()) 848 LLDB_LOG(log, "failed to resume thread {0}: {1}", thread.GetID(), 849 error); 850 } 851 } else { 852 LLDB_LOG(log, 853 "pid {0} tid {1}, thread was already marked as a stopped " 854 "state (state={2}), leaving stop signal as is", 855 GetID(), thread.GetID(), thread_state); 856 SignalIfAllThreadsStopped(); 857 } 858 859 // Done handling. 860 return; 861 } 862 863 // Check if debugger should stop at this signal or just ignore it 864 // and resume the inferior. 865 if (m_signals_to_ignore.find(signo) != m_signals_to_ignore.end()) { 866 ResumeThread(thread, thread.GetState(), signo); 867 return; 868 } 869 870 // This thread is stopped. 871 LLDB_LOG(log, "received signal {0}", Host::GetSignalAsCString(signo)); 872 thread.SetStoppedBySignal(signo, &info); 873 874 // Send a stop to the debugger after we get all other threads to stop. 875 StopRunningThreads(thread.GetID()); 876 } 877 878 namespace { 879 880 struct EmulatorBaton { 881 NativeProcessLinux &m_process; 882 NativeRegisterContext &m_reg_context; 883 884 // eRegisterKindDWARF -> RegsiterValue 885 std::unordered_map<uint32_t, RegisterValue> m_register_values; 886 887 EmulatorBaton(NativeProcessLinux &process, NativeRegisterContext ®_context) 888 : m_process(process), m_reg_context(reg_context) {} 889 }; 890 891 } // anonymous namespace 892 893 static size_t ReadMemoryCallback(EmulateInstruction *instruction, void *baton, 894 const EmulateInstruction::Context &context, 895 lldb::addr_t addr, void *dst, size_t length) { 896 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton); 897 898 size_t bytes_read; 899 emulator_baton->m_process.ReadMemory(addr, dst, length, bytes_read); 900 return bytes_read; 901 } 902 903 static bool ReadRegisterCallback(EmulateInstruction *instruction, void *baton, 904 const RegisterInfo *reg_info, 905 RegisterValue ®_value) { 906 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton); 907 908 auto it = emulator_baton->m_register_values.find( 909 reg_info->kinds[eRegisterKindDWARF]); 910 if (it != emulator_baton->m_register_values.end()) { 911 reg_value = it->second; 912 return true; 913 } 914 915 // The emulator only fill in the dwarf regsiter numbers (and in some case 916 // the generic register numbers). Get the full register info from the 917 // register context based on the dwarf register numbers. 918 const RegisterInfo *full_reg_info = 919 emulator_baton->m_reg_context.GetRegisterInfo( 920 eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]); 921 922 Status error = 923 emulator_baton->m_reg_context.ReadRegister(full_reg_info, reg_value); 924 if (error.Success()) 925 return true; 926 927 return false; 928 } 929 930 static bool WriteRegisterCallback(EmulateInstruction *instruction, void *baton, 931 const EmulateInstruction::Context &context, 932 const RegisterInfo *reg_info, 933 const RegisterValue ®_value) { 934 EmulatorBaton *emulator_baton = static_cast<EmulatorBaton *>(baton); 935 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = 936 reg_value; 937 return true; 938 } 939 940 static size_t WriteMemoryCallback(EmulateInstruction *instruction, void *baton, 941 const EmulateInstruction::Context &context, 942 lldb::addr_t addr, const void *dst, 943 size_t length) { 944 return length; 945 } 946 947 static lldb::addr_t ReadFlags(NativeRegisterContext ®siter_context) { 948 const RegisterInfo *flags_info = regsiter_context.GetRegisterInfo( 949 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 950 return regsiter_context.ReadRegisterAsUnsigned(flags_info, 951 LLDB_INVALID_ADDRESS); 952 } 953 954 Status 955 NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadLinux &thread) { 956 Status error; 957 NativeRegisterContext& register_context = thread.GetRegisterContext(); 958 959 std::unique_ptr<EmulateInstruction> emulator_ap( 960 EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, 961 nullptr)); 962 963 if (emulator_ap == nullptr) 964 return Status("Instruction emulator not found!"); 965 966 EmulatorBaton baton(*this, register_context); 967 emulator_ap->SetBaton(&baton); 968 emulator_ap->SetReadMemCallback(&ReadMemoryCallback); 969 emulator_ap->SetReadRegCallback(&ReadRegisterCallback); 970 emulator_ap->SetWriteMemCallback(&WriteMemoryCallback); 971 emulator_ap->SetWriteRegCallback(&WriteRegisterCallback); 972 973 if (!emulator_ap->ReadInstruction()) 974 return Status("Read instruction failed!"); 975 976 bool emulation_result = 977 emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC); 978 979 const RegisterInfo *reg_info_pc = register_context.GetRegisterInfo( 980 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC); 981 const RegisterInfo *reg_info_flags = register_context.GetRegisterInfo( 982 eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS); 983 984 auto pc_it = 985 baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]); 986 auto flags_it = 987 baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]); 988 989 lldb::addr_t next_pc; 990 lldb::addr_t next_flags; 991 if (emulation_result) { 992 assert(pc_it != baton.m_register_values.end() && 993 "Emulation was successfull but PC wasn't updated"); 994 next_pc = pc_it->second.GetAsUInt64(); 995 996 if (flags_it != baton.m_register_values.end()) 997 next_flags = flags_it->second.GetAsUInt64(); 998 else 999 next_flags = ReadFlags(register_context); 1000 } else if (pc_it == baton.m_register_values.end()) { 1001 // Emulate instruction failed and it haven't changed PC. Advance PC 1002 // with the size of the current opcode because the emulation of all 1003 // PC modifying instruction should be successful. The failure most 1004 // likely caused by a not supported instruction which don't modify PC. 1005 next_pc = register_context.GetPC() + emulator_ap->GetOpcode().GetByteSize(); 1006 next_flags = ReadFlags(register_context); 1007 } else { 1008 // The instruction emulation failed after it modified the PC. It is an 1009 // unknown error where we can't continue because the next instruction is 1010 // modifying the PC but we don't know how. 1011 return Status("Instruction emulation failed unexpectedly."); 1012 } 1013 1014 if (m_arch.GetMachine() == llvm::Triple::arm) { 1015 if (next_flags & 0x20) { 1016 // Thumb mode 1017 error = SetSoftwareBreakpoint(next_pc, 2); 1018 } else { 1019 // Arm mode 1020 error = SetSoftwareBreakpoint(next_pc, 4); 1021 } 1022 } else if (m_arch.GetMachine() == llvm::Triple::mips64 || 1023 m_arch.GetMachine() == llvm::Triple::mips64el || 1024 m_arch.GetMachine() == llvm::Triple::mips || 1025 m_arch.GetMachine() == llvm::Triple::mipsel || 1026 m_arch.GetMachine() == llvm::Triple::ppc64le) 1027 error = SetSoftwareBreakpoint(next_pc, 4); 1028 else { 1029 // No size hint is given for the next breakpoint 1030 error = SetSoftwareBreakpoint(next_pc, 0); 1031 } 1032 1033 // If setting the breakpoint fails because next_pc is out of 1034 // the address space, ignore it and let the debugee segfault. 1035 if (error.GetError() == EIO || error.GetError() == EFAULT) { 1036 return Status(); 1037 } else if (error.Fail()) 1038 return error; 1039 1040 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc}); 1041 1042 return Status(); 1043 } 1044 1045 bool NativeProcessLinux::SupportHardwareSingleStepping() const { 1046 if (m_arch.GetMachine() == llvm::Triple::arm || 1047 m_arch.GetMachine() == llvm::Triple::mips64 || 1048 m_arch.GetMachine() == llvm::Triple::mips64el || 1049 m_arch.GetMachine() == llvm::Triple::mips || 1050 m_arch.GetMachine() == llvm::Triple::mipsel) 1051 return false; 1052 return true; 1053 } 1054 1055 Status NativeProcessLinux::Resume(const ResumeActionList &resume_actions) { 1056 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1057 LLDB_LOG(log, "pid {0}", GetID()); 1058 1059 bool software_single_step = !SupportHardwareSingleStepping(); 1060 1061 if (software_single_step) { 1062 for (const auto &thread : m_threads) { 1063 assert(thread && "thread list should not contain NULL threads"); 1064 1065 const ResumeAction *const action = 1066 resume_actions.GetActionForThread(thread->GetID(), true); 1067 if (action == nullptr) 1068 continue; 1069 1070 if (action->state == eStateStepping) { 1071 Status error = SetupSoftwareSingleStepping( 1072 static_cast<NativeThreadLinux &>(*thread)); 1073 if (error.Fail()) 1074 return error; 1075 } 1076 } 1077 } 1078 1079 for (const auto &thread : m_threads) { 1080 assert(thread && "thread list should not contain NULL threads"); 1081 1082 const ResumeAction *const action = 1083 resume_actions.GetActionForThread(thread->GetID(), true); 1084 1085 if (action == nullptr) { 1086 LLDB_LOG(log, "no action specified for pid {0} tid {1}", GetID(), 1087 thread->GetID()); 1088 continue; 1089 } 1090 1091 LLDB_LOG(log, "processing resume action state {0} for pid {1} tid {2}", 1092 action->state, GetID(), thread->GetID()); 1093 1094 switch (action->state) { 1095 case eStateRunning: 1096 case eStateStepping: { 1097 // Run the thread, possibly feeding it the signal. 1098 const int signo = action->signal; 1099 ResumeThread(static_cast<NativeThreadLinux &>(*thread), action->state, 1100 signo); 1101 break; 1102 } 1103 1104 case eStateSuspended: 1105 case eStateStopped: 1106 llvm_unreachable("Unexpected state"); 1107 1108 default: 1109 return Status("NativeProcessLinux::%s (): unexpected state %s specified " 1110 "for pid %" PRIu64 ", tid %" PRIu64, 1111 __FUNCTION__, StateAsCString(action->state), GetID(), 1112 thread->GetID()); 1113 } 1114 } 1115 1116 return Status(); 1117 } 1118 1119 Status NativeProcessLinux::Halt() { 1120 Status error; 1121 1122 if (kill(GetID(), SIGSTOP) != 0) 1123 error.SetErrorToErrno(); 1124 1125 return error; 1126 } 1127 1128 Status NativeProcessLinux::Detach() { 1129 Status error; 1130 1131 // Stop monitoring the inferior. 1132 m_sigchld_handle.reset(); 1133 1134 // Tell ptrace to detach from the process. 1135 if (GetID() == LLDB_INVALID_PROCESS_ID) 1136 return error; 1137 1138 for (const auto &thread : m_threads) { 1139 Status e = Detach(thread->GetID()); 1140 if (e.Fail()) 1141 error = 1142 e; // Save the error, but still attempt to detach from other threads. 1143 } 1144 1145 m_processor_trace_monitor.clear(); 1146 m_pt_proces_trace_id = LLDB_INVALID_UID; 1147 1148 return error; 1149 } 1150 1151 Status NativeProcessLinux::Signal(int signo) { 1152 Status error; 1153 1154 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1155 LLDB_LOG(log, "sending signal {0} ({1}) to pid {1}", signo, 1156 Host::GetSignalAsCString(signo), GetID()); 1157 1158 if (kill(GetID(), signo)) 1159 error.SetErrorToErrno(); 1160 1161 return error; 1162 } 1163 1164 Status NativeProcessLinux::Interrupt() { 1165 // Pick a running thread (or if none, a not-dead stopped thread) as 1166 // the chosen thread that will be the stop-reason thread. 1167 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1168 1169 NativeThreadProtocol *running_thread = nullptr; 1170 NativeThreadProtocol *stopped_thread = nullptr; 1171 1172 LLDB_LOG(log, "selecting running thread for interrupt target"); 1173 for (const auto &thread : m_threads) { 1174 // If we have a running or stepping thread, we'll call that the 1175 // target of the interrupt. 1176 const auto thread_state = thread->GetState(); 1177 if (thread_state == eStateRunning || thread_state == eStateStepping) { 1178 running_thread = thread.get(); 1179 break; 1180 } else if (!stopped_thread && StateIsStoppedState(thread_state, true)) { 1181 // Remember the first non-dead stopped thread. We'll use that as a backup 1182 // if there are no running threads. 1183 stopped_thread = thread.get(); 1184 } 1185 } 1186 1187 if (!running_thread && !stopped_thread) { 1188 Status error("found no running/stepping or live stopped threads as target " 1189 "for interrupt"); 1190 LLDB_LOG(log, "skipping due to error: {0}", error); 1191 1192 return error; 1193 } 1194 1195 NativeThreadProtocol *deferred_signal_thread = 1196 running_thread ? running_thread : stopped_thread; 1197 1198 LLDB_LOG(log, "pid {0} {1} tid {2} chosen for interrupt target", GetID(), 1199 running_thread ? "running" : "stopped", 1200 deferred_signal_thread->GetID()); 1201 1202 StopRunningThreads(deferred_signal_thread->GetID()); 1203 1204 return Status(); 1205 } 1206 1207 Status NativeProcessLinux::Kill() { 1208 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1209 LLDB_LOG(log, "pid {0}", GetID()); 1210 1211 Status error; 1212 1213 switch (m_state) { 1214 case StateType::eStateInvalid: 1215 case StateType::eStateExited: 1216 case StateType::eStateCrashed: 1217 case StateType::eStateDetached: 1218 case StateType::eStateUnloaded: 1219 // Nothing to do - the process is already dead. 1220 LLDB_LOG(log, "ignored for PID {0} due to current state: {1}", GetID(), 1221 m_state); 1222 return error; 1223 1224 case StateType::eStateConnected: 1225 case StateType::eStateAttaching: 1226 case StateType::eStateLaunching: 1227 case StateType::eStateStopped: 1228 case StateType::eStateRunning: 1229 case StateType::eStateStepping: 1230 case StateType::eStateSuspended: 1231 // We can try to kill a process in these states. 1232 break; 1233 } 1234 1235 if (kill(GetID(), SIGKILL) != 0) { 1236 error.SetErrorToErrno(); 1237 return error; 1238 } 1239 1240 return error; 1241 } 1242 1243 static Status 1244 ParseMemoryRegionInfoFromProcMapsLine(llvm::StringRef &maps_line, 1245 MemoryRegionInfo &memory_region_info) { 1246 memory_region_info.Clear(); 1247 1248 StringExtractor line_extractor(maps_line); 1249 1250 // Format: {address_start_hex}-{address_end_hex} perms offset dev inode 1251 // pathname 1252 // perms: rwxp (letter is present if set, '-' if not, final character is 1253 // p=private, s=shared). 1254 1255 // Parse out the starting address 1256 lldb::addr_t start_address = line_extractor.GetHexMaxU64(false, 0); 1257 1258 // Parse out hyphen separating start and end address from range. 1259 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != '-')) 1260 return Status( 1261 "malformed /proc/{pid}/maps entry, missing dash between address range"); 1262 1263 // Parse out the ending address 1264 lldb::addr_t end_address = line_extractor.GetHexMaxU64(false, start_address); 1265 1266 // Parse out the space after the address. 1267 if (!line_extractor.GetBytesLeft() || (line_extractor.GetChar() != ' ')) 1268 return Status( 1269 "malformed /proc/{pid}/maps entry, missing space after range"); 1270 1271 // Save the range. 1272 memory_region_info.GetRange().SetRangeBase(start_address); 1273 memory_region_info.GetRange().SetRangeEnd(end_address); 1274 1275 // Any memory region in /proc/{pid}/maps is by definition mapped into the 1276 // process. 1277 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes); 1278 1279 // Parse out each permission entry. 1280 if (line_extractor.GetBytesLeft() < 4) 1281 return Status("malformed /proc/{pid}/maps entry, missing some portion of " 1282 "permissions"); 1283 1284 // Handle read permission. 1285 const char read_perm_char = line_extractor.GetChar(); 1286 if (read_perm_char == 'r') 1287 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eYes); 1288 else if (read_perm_char == '-') 1289 memory_region_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo); 1290 else 1291 return Status("unexpected /proc/{pid}/maps read permission char"); 1292 1293 // Handle write permission. 1294 const char write_perm_char = line_extractor.GetChar(); 1295 if (write_perm_char == 'w') 1296 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eYes); 1297 else if (write_perm_char == '-') 1298 memory_region_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo); 1299 else 1300 return Status("unexpected /proc/{pid}/maps write permission char"); 1301 1302 // Handle execute permission. 1303 const char exec_perm_char = line_extractor.GetChar(); 1304 if (exec_perm_char == 'x') 1305 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eYes); 1306 else if (exec_perm_char == '-') 1307 memory_region_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo); 1308 else 1309 return Status("unexpected /proc/{pid}/maps exec permission char"); 1310 1311 line_extractor.GetChar(); // Read the private bit 1312 line_extractor.SkipSpaces(); // Skip the separator 1313 line_extractor.GetHexMaxU64(false, 0); // Read the offset 1314 line_extractor.GetHexMaxU64(false, 0); // Read the major device number 1315 line_extractor.GetChar(); // Read the device id separator 1316 line_extractor.GetHexMaxU64(false, 0); // Read the major device number 1317 line_extractor.SkipSpaces(); // Skip the separator 1318 line_extractor.GetU64(0, 10); // Read the inode number 1319 1320 line_extractor.SkipSpaces(); 1321 const char *name = line_extractor.Peek(); 1322 if (name) 1323 memory_region_info.SetName(name); 1324 1325 return Status(); 1326 } 1327 1328 Status NativeProcessLinux::GetMemoryRegionInfo(lldb::addr_t load_addr, 1329 MemoryRegionInfo &range_info) { 1330 // FIXME review that the final memory region returned extends to the end of 1331 // the virtual address space, 1332 // with no perms if it is not mapped. 1333 1334 // Use an approach that reads memory regions from /proc/{pid}/maps. 1335 // Assume proc maps entries are in ascending order. 1336 // FIXME assert if we find differently. 1337 1338 if (m_supports_mem_region == LazyBool::eLazyBoolNo) { 1339 // We're done. 1340 return Status("unsupported"); 1341 } 1342 1343 Status error = PopulateMemoryRegionCache(); 1344 if (error.Fail()) { 1345 return error; 1346 } 1347 1348 lldb::addr_t prev_base_address = 0; 1349 1350 // FIXME start by finding the last region that is <= target address using 1351 // binary search. Data is sorted. 1352 // There can be a ton of regions on pthreads apps with lots of threads. 1353 for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end(); 1354 ++it) { 1355 MemoryRegionInfo &proc_entry_info = it->first; 1356 1357 // Sanity check assumption that /proc/{pid}/maps entries are ascending. 1358 assert((proc_entry_info.GetRange().GetRangeBase() >= prev_base_address) && 1359 "descending /proc/pid/maps entries detected, unexpected"); 1360 prev_base_address = proc_entry_info.GetRange().GetRangeBase(); 1361 UNUSED_IF_ASSERT_DISABLED(prev_base_address); 1362 1363 // If the target address comes before this entry, indicate distance to next 1364 // region. 1365 if (load_addr < proc_entry_info.GetRange().GetRangeBase()) { 1366 range_info.GetRange().SetRangeBase(load_addr); 1367 range_info.GetRange().SetByteSize( 1368 proc_entry_info.GetRange().GetRangeBase() - load_addr); 1369 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo); 1370 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo); 1371 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo); 1372 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo); 1373 1374 return error; 1375 } else if (proc_entry_info.GetRange().Contains(load_addr)) { 1376 // The target address is within the memory region we're processing here. 1377 range_info = proc_entry_info; 1378 return error; 1379 } 1380 1381 // The target memory address comes somewhere after the region we just 1382 // parsed. 1383 } 1384 1385 // If we made it here, we didn't find an entry that contained the given 1386 // address. Return the 1387 // load_addr as start and the amount of bytes betwwen load address and the end 1388 // of the memory as 1389 // size. 1390 range_info.GetRange().SetRangeBase(load_addr); 1391 range_info.GetRange().SetRangeEnd(LLDB_INVALID_ADDRESS); 1392 range_info.SetReadable(MemoryRegionInfo::OptionalBool::eNo); 1393 range_info.SetWritable(MemoryRegionInfo::OptionalBool::eNo); 1394 range_info.SetExecutable(MemoryRegionInfo::OptionalBool::eNo); 1395 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo); 1396 return error; 1397 } 1398 1399 Status NativeProcessLinux::PopulateMemoryRegionCache() { 1400 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1401 1402 // If our cache is empty, pull the latest. There should always be at least 1403 // one memory region if memory region handling is supported. 1404 if (!m_mem_region_cache.empty()) { 1405 LLDB_LOG(log, "reusing {0} cached memory region entries", 1406 m_mem_region_cache.size()); 1407 return Status(); 1408 } 1409 1410 auto BufferOrError = getProcFile(GetID(), "maps"); 1411 if (!BufferOrError) { 1412 m_supports_mem_region = LazyBool::eLazyBoolNo; 1413 return BufferOrError.getError(); 1414 } 1415 StringRef Rest = BufferOrError.get()->getBuffer(); 1416 while (! Rest.empty()) { 1417 StringRef Line; 1418 std::tie(Line, Rest) = Rest.split('\n'); 1419 MemoryRegionInfo info; 1420 const Status parse_error = 1421 ParseMemoryRegionInfoFromProcMapsLine(Line, info); 1422 if (parse_error.Fail()) { 1423 LLDB_LOG(log, "failed to parse proc maps line '{0}': {1}", Line, 1424 parse_error); 1425 m_supports_mem_region = LazyBool::eLazyBoolNo; 1426 return parse_error; 1427 } 1428 m_mem_region_cache.emplace_back( 1429 info, FileSpec(info.GetName().GetCString(), true)); 1430 } 1431 1432 if (m_mem_region_cache.empty()) { 1433 // No entries after attempting to read them. This shouldn't happen if 1434 // /proc/{pid}/maps is supported. Assume we don't support map entries 1435 // via procfs. 1436 m_supports_mem_region = LazyBool::eLazyBoolNo; 1437 LLDB_LOG(log, 1438 "failed to find any procfs maps entries, assuming no support " 1439 "for memory region metadata retrieval"); 1440 return Status("not supported"); 1441 } 1442 1443 LLDB_LOG(log, "read {0} memory region entries from /proc/{1}/maps", 1444 m_mem_region_cache.size(), GetID()); 1445 1446 // We support memory retrieval, remember that. 1447 m_supports_mem_region = LazyBool::eLazyBoolYes; 1448 return Status(); 1449 } 1450 1451 void NativeProcessLinux::DoStopIDBumped(uint32_t newBumpId) { 1452 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1453 LLDB_LOG(log, "newBumpId={0}", newBumpId); 1454 LLDB_LOG(log, "clearing {0} entries from memory region cache", 1455 m_mem_region_cache.size()); 1456 m_mem_region_cache.clear(); 1457 } 1458 1459 Status NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, 1460 lldb::addr_t &addr) { 1461 // FIXME implementing this requires the equivalent of 1462 // InferiorCallPOSIX::InferiorCallMmap, which depends on 1463 // functional ThreadPlans working with Native*Protocol. 1464 #if 1 1465 return Status("not implemented yet"); 1466 #else 1467 addr = LLDB_INVALID_ADDRESS; 1468 1469 unsigned prot = 0; 1470 if (permissions & lldb::ePermissionsReadable) 1471 prot |= eMmapProtRead; 1472 if (permissions & lldb::ePermissionsWritable) 1473 prot |= eMmapProtWrite; 1474 if (permissions & lldb::ePermissionsExecutable) 1475 prot |= eMmapProtExec; 1476 1477 // TODO implement this directly in NativeProcessLinux 1478 // (and lift to NativeProcessPOSIX if/when that class is 1479 // refactored out). 1480 if (InferiorCallMmap(this, addr, 0, size, prot, 1481 eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) { 1482 m_addr_to_mmap_size[addr] = size; 1483 return Status(); 1484 } else { 1485 addr = LLDB_INVALID_ADDRESS; 1486 return Status("unable to allocate %" PRIu64 1487 " bytes of memory with permissions %s", 1488 size, GetPermissionsAsCString(permissions)); 1489 } 1490 #endif 1491 } 1492 1493 Status NativeProcessLinux::DeallocateMemory(lldb::addr_t addr) { 1494 // FIXME see comments in AllocateMemory - required lower-level 1495 // bits not in place yet (ThreadPlans) 1496 return Status("not implemented"); 1497 } 1498 1499 lldb::addr_t NativeProcessLinux::GetSharedLibraryInfoAddress() { 1500 // punt on this for now 1501 return LLDB_INVALID_ADDRESS; 1502 } 1503 1504 size_t NativeProcessLinux::UpdateThreads() { 1505 // The NativeProcessLinux monitoring threads are always up to date 1506 // with respect to thread state and they keep the thread list 1507 // populated properly. All this method needs to do is return the 1508 // thread count. 1509 return m_threads.size(); 1510 } 1511 1512 Status NativeProcessLinux::GetSoftwareBreakpointPCOffset( 1513 uint32_t &actual_opcode_size) { 1514 // FIXME put this behind a breakpoint protocol class that can be 1515 // set per architecture. Need ARM, MIPS support here. 1516 static const uint8_t g_i386_opcode[] = {0xCC}; 1517 static const uint8_t g_s390x_opcode[] = {0x00, 0x01}; 1518 static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f}; // trap 1519 1520 switch (m_arch.GetMachine()) { 1521 case llvm::Triple::x86: 1522 case llvm::Triple::x86_64: 1523 actual_opcode_size = static_cast<uint32_t>(sizeof(g_i386_opcode)); 1524 return Status(); 1525 1526 case llvm::Triple::systemz: 1527 actual_opcode_size = static_cast<uint32_t>(sizeof(g_s390x_opcode)); 1528 return Status(); 1529 1530 case llvm::Triple::ppc64le: 1531 actual_opcode_size = static_cast<uint32_t>(sizeof(g_ppc64le_opcode)); 1532 return Status(); 1533 1534 case llvm::Triple::arm: 1535 case llvm::Triple::aarch64: 1536 case llvm::Triple::mips64: 1537 case llvm::Triple::mips64el: 1538 case llvm::Triple::mips: 1539 case llvm::Triple::mipsel: 1540 // On these architectures the PC don't get updated for breakpoint hits 1541 actual_opcode_size = 0; 1542 return Status(); 1543 1544 default: 1545 assert(false && "CPU type not supported!"); 1546 return Status("CPU type not supported"); 1547 } 1548 } 1549 1550 Status NativeProcessLinux::SetBreakpoint(lldb::addr_t addr, uint32_t size, 1551 bool hardware) { 1552 if (hardware) 1553 return SetHardwareBreakpoint(addr, size); 1554 else 1555 return SetSoftwareBreakpoint(addr, size); 1556 } 1557 1558 Status NativeProcessLinux::RemoveBreakpoint(lldb::addr_t addr, bool hardware) { 1559 if (hardware) 1560 return RemoveHardwareBreakpoint(addr); 1561 else 1562 return NativeProcessProtocol::RemoveBreakpoint(addr); 1563 } 1564 1565 Status NativeProcessLinux::GetSoftwareBreakpointTrapOpcode( 1566 size_t trap_opcode_size_hint, size_t &actual_opcode_size, 1567 const uint8_t *&trap_opcode_bytes) { 1568 // FIXME put this behind a breakpoint protocol class that can be set per 1569 // architecture. Need MIPS support here. 1570 static const uint8_t g_aarch64_opcode[] = {0x00, 0x00, 0x20, 0xd4}; 1571 // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the 1572 // linux kernel does otherwise. 1573 static const uint8_t g_arm_breakpoint_opcode[] = {0xf0, 0x01, 0xf0, 0xe7}; 1574 static const uint8_t g_i386_opcode[] = {0xCC}; 1575 static const uint8_t g_mips64_opcode[] = {0x00, 0x00, 0x00, 0x0d}; 1576 static const uint8_t g_mips64el_opcode[] = {0x0d, 0x00, 0x00, 0x00}; 1577 static const uint8_t g_s390x_opcode[] = {0x00, 0x01}; 1578 static const uint8_t g_thumb_breakpoint_opcode[] = {0x01, 0xde}; 1579 static const uint8_t g_ppc64le_opcode[] = {0x08, 0x00, 0xe0, 0x7f}; // trap 1580 1581 switch (m_arch.GetMachine()) { 1582 case llvm::Triple::aarch64: 1583 trap_opcode_bytes = g_aarch64_opcode; 1584 actual_opcode_size = sizeof(g_aarch64_opcode); 1585 return Status(); 1586 1587 case llvm::Triple::arm: 1588 switch (trap_opcode_size_hint) { 1589 case 2: 1590 trap_opcode_bytes = g_thumb_breakpoint_opcode; 1591 actual_opcode_size = sizeof(g_thumb_breakpoint_opcode); 1592 return Status(); 1593 case 4: 1594 trap_opcode_bytes = g_arm_breakpoint_opcode; 1595 actual_opcode_size = sizeof(g_arm_breakpoint_opcode); 1596 return Status(); 1597 default: 1598 assert(false && "Unrecognised trap opcode size hint!"); 1599 return Status("Unrecognised trap opcode size hint!"); 1600 } 1601 1602 case llvm::Triple::x86: 1603 case llvm::Triple::x86_64: 1604 trap_opcode_bytes = g_i386_opcode; 1605 actual_opcode_size = sizeof(g_i386_opcode); 1606 return Status(); 1607 1608 case llvm::Triple::mips: 1609 case llvm::Triple::mips64: 1610 trap_opcode_bytes = g_mips64_opcode; 1611 actual_opcode_size = sizeof(g_mips64_opcode); 1612 return Status(); 1613 1614 case llvm::Triple::mipsel: 1615 case llvm::Triple::mips64el: 1616 trap_opcode_bytes = g_mips64el_opcode; 1617 actual_opcode_size = sizeof(g_mips64el_opcode); 1618 return Status(); 1619 1620 case llvm::Triple::systemz: 1621 trap_opcode_bytes = g_s390x_opcode; 1622 actual_opcode_size = sizeof(g_s390x_opcode); 1623 return Status(); 1624 1625 case llvm::Triple::ppc64le: 1626 trap_opcode_bytes = g_ppc64le_opcode; 1627 actual_opcode_size = sizeof(g_ppc64le_opcode); 1628 return Status(); 1629 1630 default: 1631 assert(false && "CPU type not supported!"); 1632 return Status("CPU type not supported"); 1633 } 1634 } 1635 1636 #if 0 1637 ProcessMessage::CrashReason 1638 NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info) 1639 { 1640 ProcessMessage::CrashReason reason; 1641 assert(info->si_signo == SIGSEGV); 1642 1643 reason = ProcessMessage::eInvalidCrashReason; 1644 1645 switch (info->si_code) 1646 { 1647 default: 1648 assert(false && "unexpected si_code for SIGSEGV"); 1649 break; 1650 case SI_KERNEL: 1651 // Linux will occasionally send spurious SI_KERNEL codes. 1652 // (this is poorly documented in sigaction) 1653 // One way to get this is via unaligned SIMD loads. 1654 reason = ProcessMessage::eInvalidAddress; // for lack of anything better 1655 break; 1656 case SEGV_MAPERR: 1657 reason = ProcessMessage::eInvalidAddress; 1658 break; 1659 case SEGV_ACCERR: 1660 reason = ProcessMessage::ePrivilegedAddress; 1661 break; 1662 } 1663 1664 return reason; 1665 } 1666 #endif 1667 1668 #if 0 1669 ProcessMessage::CrashReason 1670 NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info) 1671 { 1672 ProcessMessage::CrashReason reason; 1673 assert(info->si_signo == SIGILL); 1674 1675 reason = ProcessMessage::eInvalidCrashReason; 1676 1677 switch (info->si_code) 1678 { 1679 default: 1680 assert(false && "unexpected si_code for SIGILL"); 1681 break; 1682 case ILL_ILLOPC: 1683 reason = ProcessMessage::eIllegalOpcode; 1684 break; 1685 case ILL_ILLOPN: 1686 reason = ProcessMessage::eIllegalOperand; 1687 break; 1688 case ILL_ILLADR: 1689 reason = ProcessMessage::eIllegalAddressingMode; 1690 break; 1691 case ILL_ILLTRP: 1692 reason = ProcessMessage::eIllegalTrap; 1693 break; 1694 case ILL_PRVOPC: 1695 reason = ProcessMessage::ePrivilegedOpcode; 1696 break; 1697 case ILL_PRVREG: 1698 reason = ProcessMessage::ePrivilegedRegister; 1699 break; 1700 case ILL_COPROC: 1701 reason = ProcessMessage::eCoprocessorError; 1702 break; 1703 case ILL_BADSTK: 1704 reason = ProcessMessage::eInternalStackError; 1705 break; 1706 } 1707 1708 return reason; 1709 } 1710 #endif 1711 1712 #if 0 1713 ProcessMessage::CrashReason 1714 NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info) 1715 { 1716 ProcessMessage::CrashReason reason; 1717 assert(info->si_signo == SIGFPE); 1718 1719 reason = ProcessMessage::eInvalidCrashReason; 1720 1721 switch (info->si_code) 1722 { 1723 default: 1724 assert(false && "unexpected si_code for SIGFPE"); 1725 break; 1726 case FPE_INTDIV: 1727 reason = ProcessMessage::eIntegerDivideByZero; 1728 break; 1729 case FPE_INTOVF: 1730 reason = ProcessMessage::eIntegerOverflow; 1731 break; 1732 case FPE_FLTDIV: 1733 reason = ProcessMessage::eFloatDivideByZero; 1734 break; 1735 case FPE_FLTOVF: 1736 reason = ProcessMessage::eFloatOverflow; 1737 break; 1738 case FPE_FLTUND: 1739 reason = ProcessMessage::eFloatUnderflow; 1740 break; 1741 case FPE_FLTRES: 1742 reason = ProcessMessage::eFloatInexactResult; 1743 break; 1744 case FPE_FLTINV: 1745 reason = ProcessMessage::eFloatInvalidOperation; 1746 break; 1747 case FPE_FLTSUB: 1748 reason = ProcessMessage::eFloatSubscriptRange; 1749 break; 1750 } 1751 1752 return reason; 1753 } 1754 #endif 1755 1756 #if 0 1757 ProcessMessage::CrashReason 1758 NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info) 1759 { 1760 ProcessMessage::CrashReason reason; 1761 assert(info->si_signo == SIGBUS); 1762 1763 reason = ProcessMessage::eInvalidCrashReason; 1764 1765 switch (info->si_code) 1766 { 1767 default: 1768 assert(false && "unexpected si_code for SIGBUS"); 1769 break; 1770 case BUS_ADRALN: 1771 reason = ProcessMessage::eIllegalAlignment; 1772 break; 1773 case BUS_ADRERR: 1774 reason = ProcessMessage::eIllegalAddress; 1775 break; 1776 case BUS_OBJERR: 1777 reason = ProcessMessage::eHardwareError; 1778 break; 1779 } 1780 1781 return reason; 1782 } 1783 #endif 1784 1785 Status NativeProcessLinux::ReadMemory(lldb::addr_t addr, void *buf, size_t size, 1786 size_t &bytes_read) { 1787 if (ProcessVmReadvSupported()) { 1788 // The process_vm_readv path is about 50 times faster than ptrace api. We 1789 // want to use 1790 // this syscall if it is supported. 1791 1792 const ::pid_t pid = GetID(); 1793 1794 struct iovec local_iov, remote_iov; 1795 local_iov.iov_base = buf; 1796 local_iov.iov_len = size; 1797 remote_iov.iov_base = reinterpret_cast<void *>(addr); 1798 remote_iov.iov_len = size; 1799 1800 bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0); 1801 const bool success = bytes_read == size; 1802 1803 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 1804 LLDB_LOG(log, 1805 "using process_vm_readv to read {0} bytes from inferior " 1806 "address {1:x}: {2}", 1807 size, addr, success ? "Success" : llvm::sys::StrError(errno)); 1808 1809 if (success) 1810 return Status(); 1811 // else the call failed for some reason, let's retry the read using ptrace 1812 // api. 1813 } 1814 1815 unsigned char *dst = static_cast<unsigned char *>(buf); 1816 size_t remainder; 1817 long data; 1818 1819 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_MEMORY)); 1820 LLDB_LOG(log, "addr = {0}, buf = {1}, size = {2}", addr, buf, size); 1821 1822 for (bytes_read = 0; bytes_read < size; bytes_read += remainder) { 1823 Status error = NativeProcessLinux::PtraceWrapper( 1824 PTRACE_PEEKDATA, GetID(), (void *)addr, nullptr, 0, &data); 1825 if (error.Fail()) 1826 return error; 1827 1828 remainder = size - bytes_read; 1829 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder; 1830 1831 // Copy the data into our buffer 1832 memcpy(dst, &data, remainder); 1833 1834 LLDB_LOG(log, "[{0:x}]:{1:x}", addr, data); 1835 addr += k_ptrace_word_size; 1836 dst += k_ptrace_word_size; 1837 } 1838 return Status(); 1839 } 1840 1841 Status NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, 1842 size_t size, 1843 size_t &bytes_read) { 1844 Status error = ReadMemory(addr, buf, size, bytes_read); 1845 if (error.Fail()) 1846 return error; 1847 return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size); 1848 } 1849 1850 Status NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, 1851 size_t size, size_t &bytes_written) { 1852 const unsigned char *src = static_cast<const unsigned char *>(buf); 1853 size_t remainder; 1854 Status error; 1855 1856 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_MEMORY)); 1857 LLDB_LOG(log, "addr = {0}, buf = {1}, size = {2}", addr, buf, size); 1858 1859 for (bytes_written = 0; bytes_written < size; bytes_written += remainder) { 1860 remainder = size - bytes_written; 1861 remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder; 1862 1863 if (remainder == k_ptrace_word_size) { 1864 unsigned long data = 0; 1865 memcpy(&data, src, k_ptrace_word_size); 1866 1867 LLDB_LOG(log, "[{0:x}]:{1:x}", addr, data); 1868 error = NativeProcessLinux::PtraceWrapper(PTRACE_POKEDATA, GetID(), 1869 (void *)addr, (void *)data); 1870 if (error.Fail()) 1871 return error; 1872 } else { 1873 unsigned char buff[8]; 1874 size_t bytes_read; 1875 error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read); 1876 if (error.Fail()) 1877 return error; 1878 1879 memcpy(buff, src, remainder); 1880 1881 size_t bytes_written_rec; 1882 error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec); 1883 if (error.Fail()) 1884 return error; 1885 1886 LLDB_LOG(log, "[{0:x}]:{1:x} ({2:x})", addr, *(const unsigned long *)src, 1887 *(unsigned long *)buff); 1888 } 1889 1890 addr += k_ptrace_word_size; 1891 src += k_ptrace_word_size; 1892 } 1893 return error; 1894 } 1895 1896 Status NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) { 1897 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo); 1898 } 1899 1900 Status NativeProcessLinux::GetEventMessage(lldb::tid_t tid, 1901 unsigned long *message) { 1902 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message); 1903 } 1904 1905 Status NativeProcessLinux::Detach(lldb::tid_t tid) { 1906 if (tid == LLDB_INVALID_THREAD_ID) 1907 return Status(); 1908 1909 return PtraceWrapper(PTRACE_DETACH, tid); 1910 } 1911 1912 bool NativeProcessLinux::HasThreadNoLock(lldb::tid_t thread_id) { 1913 for (const auto &thread : m_threads) { 1914 assert(thread && "thread list should not contain NULL threads"); 1915 if (thread->GetID() == thread_id) { 1916 // We have this thread. 1917 return true; 1918 } 1919 } 1920 1921 // We don't have this thread. 1922 return false; 1923 } 1924 1925 bool NativeProcessLinux::StopTrackingThread(lldb::tid_t thread_id) { 1926 Log *const log = ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD); 1927 LLDB_LOG(log, "tid: {0})", thread_id); 1928 1929 bool found = false; 1930 for (auto it = m_threads.begin(); it != m_threads.end(); ++it) { 1931 if (*it && ((*it)->GetID() == thread_id)) { 1932 m_threads.erase(it); 1933 found = true; 1934 break; 1935 } 1936 } 1937 1938 if (found) 1939 StopTracingForThread(thread_id); 1940 SignalIfAllThreadsStopped(); 1941 return found; 1942 } 1943 1944 NativeThreadLinux &NativeProcessLinux::AddThread(lldb::tid_t thread_id) { 1945 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD)); 1946 LLDB_LOG(log, "pid {0} adding thread with tid {1}", GetID(), thread_id); 1947 1948 assert(!HasThreadNoLock(thread_id) && 1949 "attempted to add a thread by id that already exists"); 1950 1951 // If this is the first thread, save it as the current thread 1952 if (m_threads.empty()) 1953 SetCurrentThreadID(thread_id); 1954 1955 m_threads.push_back(llvm::make_unique<NativeThreadLinux>(*this, thread_id)); 1956 1957 if (m_pt_proces_trace_id != LLDB_INVALID_UID) { 1958 auto traceMonitor = ProcessorTraceMonitor::Create( 1959 GetID(), thread_id, m_pt_process_trace_config, true); 1960 if (traceMonitor) { 1961 m_pt_traced_thread_group.insert(thread_id); 1962 m_processor_trace_monitor.insert( 1963 std::make_pair(thread_id, std::move(*traceMonitor))); 1964 } else { 1965 LLDB_LOG(log, "failed to start trace on thread {0}", thread_id); 1966 Status error(traceMonitor.takeError()); 1967 LLDB_LOG(log, "error {0}", error); 1968 } 1969 } 1970 1971 return static_cast<NativeThreadLinux &>(*m_threads.back()); 1972 } 1973 1974 Status 1975 NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread) { 1976 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_BREAKPOINTS)); 1977 1978 Status error; 1979 1980 // Find out the size of a breakpoint (might depend on where we are in the 1981 // code). 1982 NativeRegisterContext &context = thread.GetRegisterContext(); 1983 1984 uint32_t breakpoint_size = 0; 1985 error = GetSoftwareBreakpointPCOffset(breakpoint_size); 1986 if (error.Fail()) { 1987 LLDB_LOG(log, "GetBreakpointSize() failed: {0}", error); 1988 return error; 1989 } else 1990 LLDB_LOG(log, "breakpoint size: {0}", breakpoint_size); 1991 1992 // First try probing for a breakpoint at a software breakpoint location: PC - 1993 // breakpoint size. 1994 const lldb::addr_t initial_pc_addr = context.GetPCfromBreakpointLocation(); 1995 lldb::addr_t breakpoint_addr = initial_pc_addr; 1996 if (breakpoint_size > 0) { 1997 // Do not allow breakpoint probe to wrap around. 1998 if (breakpoint_addr >= breakpoint_size) 1999 breakpoint_addr -= breakpoint_size; 2000 } 2001 2002 // Check if we stopped because of a breakpoint. 2003 NativeBreakpointSP breakpoint_sp; 2004 error = m_breakpoint_list.GetBreakpoint(breakpoint_addr, breakpoint_sp); 2005 if (!error.Success() || !breakpoint_sp) { 2006 // We didn't find one at a software probe location. Nothing to do. 2007 LLDB_LOG(log, 2008 "pid {0} no lldb breakpoint found at current pc with " 2009 "adjustment: {1}", 2010 GetID(), breakpoint_addr); 2011 return Status(); 2012 } 2013 2014 // If the breakpoint is not a software breakpoint, nothing to do. 2015 if (!breakpoint_sp->IsSoftwareBreakpoint()) { 2016 LLDB_LOG( 2017 log, 2018 "pid {0} breakpoint found at {1:x}, not software, nothing to adjust", 2019 GetID(), breakpoint_addr); 2020 return Status(); 2021 } 2022 2023 // 2024 // We have a software breakpoint and need to adjust the PC. 2025 // 2026 2027 // Sanity check. 2028 if (breakpoint_size == 0) { 2029 // Nothing to do! How did we get here? 2030 LLDB_LOG(log, 2031 "pid {0} breakpoint found at {1:x}, it is software, but the " 2032 "size is zero, nothing to do (unexpected)", 2033 GetID(), breakpoint_addr); 2034 return Status(); 2035 } 2036 2037 // Change the program counter. 2038 LLDB_LOG(log, "pid {0} tid {1}: changing PC from {2:x} to {3:x}", GetID(), 2039 thread.GetID(), initial_pc_addr, breakpoint_addr); 2040 2041 error = context.SetPC(breakpoint_addr); 2042 if (error.Fail()) { 2043 LLDB_LOG(log, "pid {0} tid {1}: failed to set PC: {2}", GetID(), 2044 thread.GetID(), error); 2045 return error; 2046 } 2047 2048 return error; 2049 } 2050 2051 Status NativeProcessLinux::GetLoadedModuleFileSpec(const char *module_path, 2052 FileSpec &file_spec) { 2053 Status error = PopulateMemoryRegionCache(); 2054 if (error.Fail()) 2055 return error; 2056 2057 FileSpec module_file_spec(module_path, true); 2058 2059 file_spec.Clear(); 2060 for (const auto &it : m_mem_region_cache) { 2061 if (it.second.GetFilename() == module_file_spec.GetFilename()) { 2062 file_spec = it.second; 2063 return Status(); 2064 } 2065 } 2066 return Status("Module file (%s) not found in /proc/%" PRIu64 "/maps file!", 2067 module_file_spec.GetFilename().AsCString(), GetID()); 2068 } 2069 2070 Status NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef &file_name, 2071 lldb::addr_t &load_addr) { 2072 load_addr = LLDB_INVALID_ADDRESS; 2073 Status error = PopulateMemoryRegionCache(); 2074 if (error.Fail()) 2075 return error; 2076 2077 FileSpec file(file_name, false); 2078 for (const auto &it : m_mem_region_cache) { 2079 if (it.second == file) { 2080 load_addr = it.first.GetRange().GetRangeBase(); 2081 return Status(); 2082 } 2083 } 2084 return Status("No load address found for specified file."); 2085 } 2086 2087 NativeThreadLinux *NativeProcessLinux::GetThreadByID(lldb::tid_t tid) { 2088 return static_cast<NativeThreadLinux *>( 2089 NativeProcessProtocol::GetThreadByID(tid)); 2090 } 2091 2092 Status NativeProcessLinux::ResumeThread(NativeThreadLinux &thread, 2093 lldb::StateType state, int signo) { 2094 Log *const log = ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD); 2095 LLDB_LOG(log, "tid: {0}", thread.GetID()); 2096 2097 // Before we do the resume below, first check if we have a pending 2098 // stop notification that is currently waiting for 2099 // all threads to stop. This is potentially a buggy situation since 2100 // we're ostensibly waiting for threads to stop before we send out the 2101 // pending notification, and here we are resuming one before we send 2102 // out the pending stop notification. 2103 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID) { 2104 LLDB_LOG(log, 2105 "about to resume tid {0} per explicit request but we have a " 2106 "pending stop notification (tid {1}) that is actively " 2107 "waiting for this thread to stop. Valid sequence of events?", 2108 thread.GetID(), m_pending_notification_tid); 2109 } 2110 2111 // Request a resume. We expect this to be synchronous and the system 2112 // to reflect it is running after this completes. 2113 switch (state) { 2114 case eStateRunning: { 2115 const auto resume_result = thread.Resume(signo); 2116 if (resume_result.Success()) 2117 SetState(eStateRunning, true); 2118 return resume_result; 2119 } 2120 case eStateStepping: { 2121 const auto step_result = thread.SingleStep(signo); 2122 if (step_result.Success()) 2123 SetState(eStateRunning, true); 2124 return step_result; 2125 } 2126 default: 2127 LLDB_LOG(log, "Unhandled state {0}.", state); 2128 llvm_unreachable("Unhandled state for resume"); 2129 } 2130 } 2131 2132 //===----------------------------------------------------------------------===// 2133 2134 void NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) { 2135 Log *const log = ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD); 2136 LLDB_LOG(log, "about to process event: (triggering_tid: {0})", 2137 triggering_tid); 2138 2139 m_pending_notification_tid = triggering_tid; 2140 2141 // Request a stop for all the thread stops that need to be stopped 2142 // and are not already known to be stopped. 2143 for (const auto &thread : m_threads) { 2144 if (StateIsRunningState(thread->GetState())) 2145 static_cast<NativeThreadLinux *>(thread.get())->RequestStop(); 2146 } 2147 2148 SignalIfAllThreadsStopped(); 2149 LLDB_LOG(log, "event processing done"); 2150 } 2151 2152 void NativeProcessLinux::SignalIfAllThreadsStopped() { 2153 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID) 2154 return; // No pending notification. Nothing to do. 2155 2156 for (const auto &thread_sp : m_threads) { 2157 if (StateIsRunningState(thread_sp->GetState())) 2158 return; // Some threads are still running. Don't signal yet. 2159 } 2160 2161 // We have a pending notification and all threads have stopped. 2162 Log *log( 2163 GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 2164 2165 // Clear any temporary breakpoints we used to implement software single 2166 // stepping. 2167 for (const auto &thread_info : m_threads_stepping_with_breakpoint) { 2168 Status error = RemoveBreakpoint(thread_info.second); 2169 if (error.Fail()) 2170 LLDB_LOG(log, "pid = {0} remove stepping breakpoint: {1}", 2171 thread_info.first, error); 2172 } 2173 m_threads_stepping_with_breakpoint.clear(); 2174 2175 // Notify the delegate about the stop 2176 SetCurrentThreadID(m_pending_notification_tid); 2177 SetState(StateType::eStateStopped, true); 2178 m_pending_notification_tid = LLDB_INVALID_THREAD_ID; 2179 } 2180 2181 void NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread) { 2182 Log *const log = ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_THREAD); 2183 LLDB_LOG(log, "tid: {0}", thread.GetID()); 2184 2185 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && 2186 StateIsRunningState(thread.GetState())) { 2187 // We will need to wait for this new thread to stop as well before firing 2188 // the 2189 // notification. 2190 thread.RequestStop(); 2191 } 2192 } 2193 2194 void NativeProcessLinux::SigchldHandler() { 2195 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PROCESS)); 2196 // Process all pending waitpid notifications. 2197 while (true) { 2198 int status = -1; 2199 ::pid_t wait_pid = llvm::sys::RetryAfterSignal(-1, ::waitpid, -1, &status, 2200 __WALL | __WNOTHREAD | WNOHANG); 2201 2202 if (wait_pid == 0) 2203 break; // We are done. 2204 2205 if (wait_pid == -1) { 2206 Status error(errno, eErrorTypePOSIX); 2207 LLDB_LOG(log, "waitpid (-1, &status, _) failed: {0}", error); 2208 break; 2209 } 2210 2211 WaitStatus wait_status = WaitStatus::Decode(status); 2212 bool exited = wait_status.type == WaitStatus::Exit || 2213 (wait_status.type == WaitStatus::Signal && 2214 wait_pid == static_cast<::pid_t>(GetID())); 2215 2216 LLDB_LOG( 2217 log, 2218 "waitpid (-1, &status, _) => pid = {0}, status = {1}, exited = {2}", 2219 wait_pid, wait_status, exited); 2220 2221 MonitorCallback(wait_pid, exited, wait_status); 2222 } 2223 } 2224 2225 // Wrapper for ptrace to catch errors and log calls. 2226 // Note that ptrace sets errno on error because -1 can be a valid result (i.e. 2227 // for PTRACE_PEEK*) 2228 Status NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr, 2229 void *data, size_t data_size, 2230 long *result) { 2231 Status error; 2232 long int ret; 2233 2234 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2235 2236 PtraceDisplayBytes(req, data, data_size); 2237 2238 errno = 0; 2239 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET) 2240 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid), 2241 *(unsigned int *)addr, data); 2242 else 2243 ret = ptrace(static_cast<__ptrace_request>(req), static_cast<::pid_t>(pid), 2244 addr, data); 2245 2246 if (ret == -1) 2247 error.SetErrorToErrno(); 2248 2249 if (result) 2250 *result = ret; 2251 2252 LLDB_LOG(log, "ptrace({0}, {1}, {2}, {3}, {4})={5:x}", req, pid, addr, data, 2253 data_size, ret); 2254 2255 PtraceDisplayBytes(req, data, data_size); 2256 2257 if (error.Fail()) 2258 LLDB_LOG(log, "ptrace() failed: {0}", error); 2259 2260 return error; 2261 } 2262 2263 llvm::Expected<ProcessorTraceMonitor &> 2264 NativeProcessLinux::LookupProcessorTraceInstance(lldb::user_id_t traceid, 2265 lldb::tid_t thread) { 2266 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2267 if (thread == LLDB_INVALID_THREAD_ID && traceid == m_pt_proces_trace_id) { 2268 LLDB_LOG(log, "thread not specified: {0}", traceid); 2269 return Status("tracing not active thread not specified").ToError(); 2270 } 2271 2272 for (auto& iter : m_processor_trace_monitor) { 2273 if (traceid == iter.second->GetTraceID() && 2274 (thread == iter.first || thread == LLDB_INVALID_THREAD_ID)) 2275 return *(iter.second); 2276 } 2277 2278 LLDB_LOG(log, "traceid not being traced: {0}", traceid); 2279 return Status("tracing not active for this thread").ToError(); 2280 } 2281 2282 Status NativeProcessLinux::GetMetaData(lldb::user_id_t traceid, 2283 lldb::tid_t thread, 2284 llvm::MutableArrayRef<uint8_t> &buffer, 2285 size_t offset) { 2286 TraceOptions trace_options; 2287 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2288 Status error; 2289 2290 LLDB_LOG(log, "traceid {0}", traceid); 2291 2292 auto perf_monitor = LookupProcessorTraceInstance(traceid, thread); 2293 if (!perf_monitor) { 2294 LLDB_LOG(log, "traceid not being traced: {0}", traceid); 2295 buffer = buffer.slice(buffer.size()); 2296 error = perf_monitor.takeError(); 2297 return error; 2298 } 2299 return (*perf_monitor).ReadPerfTraceData(buffer, offset); 2300 } 2301 2302 Status NativeProcessLinux::GetData(lldb::user_id_t traceid, lldb::tid_t thread, 2303 llvm::MutableArrayRef<uint8_t> &buffer, 2304 size_t offset) { 2305 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2306 Status error; 2307 2308 LLDB_LOG(log, "traceid {0}", traceid); 2309 2310 auto perf_monitor = LookupProcessorTraceInstance(traceid, thread); 2311 if (!perf_monitor) { 2312 LLDB_LOG(log, "traceid not being traced: {0}", traceid); 2313 buffer = buffer.slice(buffer.size()); 2314 error = perf_monitor.takeError(); 2315 return error; 2316 } 2317 return (*perf_monitor).ReadPerfTraceAux(buffer, offset); 2318 } 2319 2320 Status NativeProcessLinux::GetTraceConfig(lldb::user_id_t traceid, 2321 TraceOptions &config) { 2322 Status error; 2323 if (config.getThreadID() == LLDB_INVALID_THREAD_ID && 2324 m_pt_proces_trace_id == traceid) { 2325 if (m_pt_proces_trace_id == LLDB_INVALID_UID) { 2326 error.SetErrorString("tracing not active for this process"); 2327 return error; 2328 } 2329 config = m_pt_process_trace_config; 2330 } else { 2331 auto perf_monitor = 2332 LookupProcessorTraceInstance(traceid, config.getThreadID()); 2333 if (!perf_monitor) { 2334 error = perf_monitor.takeError(); 2335 return error; 2336 } 2337 error = (*perf_monitor).GetTraceConfig(config); 2338 } 2339 return error; 2340 } 2341 2342 lldb::user_id_t 2343 NativeProcessLinux::StartTraceGroup(const TraceOptions &config, 2344 Status &error) { 2345 2346 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2347 if (config.getType() != TraceType::eTraceTypeProcessorTrace) 2348 return LLDB_INVALID_UID; 2349 2350 if (m_pt_proces_trace_id != LLDB_INVALID_UID) { 2351 error.SetErrorString("tracing already active on this process"); 2352 return m_pt_proces_trace_id; 2353 } 2354 2355 for (const auto &thread_sp : m_threads) { 2356 if (auto traceInstance = ProcessorTraceMonitor::Create( 2357 GetID(), thread_sp->GetID(), config, true)) { 2358 m_pt_traced_thread_group.insert(thread_sp->GetID()); 2359 m_processor_trace_monitor.insert( 2360 std::make_pair(thread_sp->GetID(), std::move(*traceInstance))); 2361 } 2362 } 2363 2364 m_pt_process_trace_config = config; 2365 error = ProcessorTraceMonitor::GetCPUType(m_pt_process_trace_config); 2366 2367 // Trace on Complete process will have traceid of 0 2368 m_pt_proces_trace_id = 0; 2369 2370 LLDB_LOG(log, "Process Trace ID {0}", m_pt_proces_trace_id); 2371 return m_pt_proces_trace_id; 2372 } 2373 2374 lldb::user_id_t NativeProcessLinux::StartTrace(const TraceOptions &config, 2375 Status &error) { 2376 if (config.getType() != TraceType::eTraceTypeProcessorTrace) 2377 return NativeProcessProtocol::StartTrace(config, error); 2378 2379 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2380 2381 lldb::tid_t threadid = config.getThreadID(); 2382 2383 if (threadid == LLDB_INVALID_THREAD_ID) 2384 return StartTraceGroup(config, error); 2385 2386 auto thread_sp = GetThreadByID(threadid); 2387 if (!thread_sp) { 2388 // Thread not tracked by lldb so don't trace. 2389 error.SetErrorString("invalid thread id"); 2390 return LLDB_INVALID_UID; 2391 } 2392 2393 const auto &iter = m_processor_trace_monitor.find(threadid); 2394 if (iter != m_processor_trace_monitor.end()) { 2395 LLDB_LOG(log, "Thread already being traced"); 2396 error.SetErrorString("tracing already active on this thread"); 2397 return LLDB_INVALID_UID; 2398 } 2399 2400 auto traceMonitor = 2401 ProcessorTraceMonitor::Create(GetID(), threadid, config, false); 2402 if (!traceMonitor) { 2403 error = traceMonitor.takeError(); 2404 LLDB_LOG(log, "error {0}", error); 2405 return LLDB_INVALID_UID; 2406 } 2407 lldb::user_id_t ret_trace_id = (*traceMonitor)->GetTraceID(); 2408 m_processor_trace_monitor.insert( 2409 std::make_pair(threadid, std::move(*traceMonitor))); 2410 return ret_trace_id; 2411 } 2412 2413 Status NativeProcessLinux::StopTracingForThread(lldb::tid_t thread) { 2414 Status error; 2415 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2416 LLDB_LOG(log, "Thread {0}", thread); 2417 2418 const auto& iter = m_processor_trace_monitor.find(thread); 2419 if (iter == m_processor_trace_monitor.end()) { 2420 error.SetErrorString("tracing not active for this thread"); 2421 return error; 2422 } 2423 2424 if (iter->second->GetTraceID() == m_pt_proces_trace_id) { 2425 // traceid maps to the whole process so we have to erase it from the 2426 // thread group. 2427 LLDB_LOG(log, "traceid maps to process"); 2428 m_pt_traced_thread_group.erase(thread); 2429 } 2430 m_processor_trace_monitor.erase(iter); 2431 2432 return error; 2433 } 2434 2435 Status NativeProcessLinux::StopTrace(lldb::user_id_t traceid, 2436 lldb::tid_t thread) { 2437 Status error; 2438 2439 TraceOptions trace_options; 2440 trace_options.setThreadID(thread); 2441 error = NativeProcessLinux::GetTraceConfig(traceid, trace_options); 2442 2443 if (error.Fail()) 2444 return error; 2445 2446 switch (trace_options.getType()) { 2447 case lldb::TraceType::eTraceTypeProcessorTrace: 2448 if (traceid == m_pt_proces_trace_id && 2449 thread == LLDB_INVALID_THREAD_ID) 2450 StopProcessorTracingOnProcess(); 2451 else 2452 error = StopProcessorTracingOnThread(traceid, thread); 2453 break; 2454 default: 2455 error.SetErrorString("trace not supported"); 2456 break; 2457 } 2458 2459 return error; 2460 } 2461 2462 void NativeProcessLinux::StopProcessorTracingOnProcess() { 2463 for (auto thread_id_iter : m_pt_traced_thread_group) 2464 m_processor_trace_monitor.erase(thread_id_iter); 2465 m_pt_traced_thread_group.clear(); 2466 m_pt_proces_trace_id = LLDB_INVALID_UID; 2467 } 2468 2469 Status NativeProcessLinux::StopProcessorTracingOnThread(lldb::user_id_t traceid, 2470 lldb::tid_t thread) { 2471 Status error; 2472 Log *log(ProcessPOSIXLog::GetLogIfAllCategoriesSet(POSIX_LOG_PTRACE)); 2473 2474 if (thread == LLDB_INVALID_THREAD_ID) { 2475 for (auto& iter : m_processor_trace_monitor) { 2476 if (iter.second->GetTraceID() == traceid) { 2477 // Stopping a trace instance for an individual thread 2478 // hence there will only be one traceid that can match. 2479 m_processor_trace_monitor.erase(iter.first); 2480 return error; 2481 } 2482 LLDB_LOG(log, "Trace ID {0}", iter.second->GetTraceID()); 2483 } 2484 2485 LLDB_LOG(log, "Invalid TraceID"); 2486 error.SetErrorString("invalid trace id"); 2487 return error; 2488 } 2489 2490 // thread is specified so we can use find function on the map. 2491 const auto& iter = m_processor_trace_monitor.find(thread); 2492 if (iter == m_processor_trace_monitor.end()) { 2493 // thread not found in our map. 2494 LLDB_LOG(log, "thread not being traced"); 2495 error.SetErrorString("tracing not active for this thread"); 2496 return error; 2497 } 2498 if (iter->second->GetTraceID() != traceid) { 2499 // traceid did not match so it has to be invalid. 2500 LLDB_LOG(log, "Invalid TraceID"); 2501 error.SetErrorString("invalid trace id"); 2502 return error; 2503 } 2504 2505 LLDB_LOG(log, "UID - {0} , Thread -{1}", traceid, thread); 2506 2507 if (traceid == m_pt_proces_trace_id) { 2508 // traceid maps to the whole process so we have to erase it from the 2509 // thread group. 2510 LLDB_LOG(log, "traceid maps to process"); 2511 m_pt_traced_thread_group.erase(thread); 2512 } 2513 m_processor_trace_monitor.erase(iter); 2514 2515 return error; 2516 } 2517