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 <string.h> 15 #include <stdint.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/Error.h" 28 #include "lldb/Core/ModuleSpec.h" 29 #include "lldb/Core/RegisterValue.h" 30 #include "lldb/Core/State.h" 31 #include "lldb/Host/Host.h" 32 #include "lldb/Host/HostProcess.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/ProcessLauncherLinux.h" 37 #include "lldb/Symbol/ObjectFile.h" 38 #include "lldb/Target/Process.h" 39 #include "lldb/Target/ProcessLaunchInfo.h" 40 #include "lldb/Target/Target.h" 41 #include "lldb/Utility/LLDBAssert.h" 42 #include "lldb/Utility/PseudoTerminal.h" 43 #include "lldb/Utility/StringExtractor.h" 44 45 #include "Plugins/Process/POSIX/ProcessPOSIXLog.h" 46 #include "NativeThreadLinux.h" 47 #include "ProcFileReader.h" 48 #include "Procfs.h" 49 50 // 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> 53 #include <sys/socket.h> 54 55 #include <sys/syscall.h> 56 #include <sys/types.h> 57 #include <sys/user.h> 58 #include <sys/wait.h> 59 60 #include "lldb/Host/linux/Personality.h" 61 #include "lldb/Host/linux/Ptrace.h" 62 #include "lldb/Host/linux/Uio.h" 63 64 // Support hardware breakpoints in case it has not been defined 65 #ifndef TRAP_HWBKPT 66 #define TRAP_HWBKPT 4 67 #endif 68 69 using namespace lldb; 70 using namespace lldb_private; 71 using namespace lldb_private::process_linux; 72 using namespace llvm; 73 74 // Private bits we only need internally. 75 76 static 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 109 namespace 110 { 111 void 112 MaybeLogLaunchInfo(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 138 void 139 DisplayBytes(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++) 144 { 145 s.Printf("[%x]", *ptr); 146 ptr++; 147 } 148 } 149 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 211 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"); 213 } // end of anonymous namespace 214 215 // Simple helper function to ensure flags are enabled on the given file 216 // descriptor. 217 static Error 218 EnsureFDFlags(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 238 // ----------------------------------------------------------------------------- 239 // Public Static Methods 240 // ----------------------------------------------------------------------------- 241 242 Error 243 NativeProcessProtocol::Launch ( 244 ProcessLaunchInfo &launch_info, 245 NativeProcessProtocol::NativeDelegate &native_delegate, 246 MainLoop &mainloop, 247 NativeProcessProtocolSP &native_process_sp) 248 { 249 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 250 251 Error error; 252 253 // Verify the working directory is valid if one was specified. 254 FileSpec working_dir{launch_info.GetWorkingDirectory()}; 255 if (working_dir && 256 (!working_dir.ResolvePath() || 257 working_dir.GetFileType() != FileSpec::eFileTypeDirectory)) 258 { 259 error.SetErrorStringWithFormat ("No such file or directory: %s", 260 working_dir.GetCString()); 261 return error; 262 } 263 264 // Create the NativeProcessLinux in launch mode. 265 native_process_sp.reset (new NativeProcessLinux ()); 266 267 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 274 error = std::static_pointer_cast<NativeProcessLinux>(native_process_sp)->LaunchInferior(mainloop, launch_info); 275 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 289 Error 290 NativeProcessProtocol::Attach ( 291 lldb::pid_t pid, 292 NativeProcessProtocol::NativeDelegate &native_delegate, 293 MainLoop &mainloop, 294 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 300 // Retrieve the architecture for the running process. 301 ArchSpec process_arch; 302 Error error = ResolveProcessArchitecture(pid, process_arch); 303 if (!error.Success ()) 304 return error; 305 306 std::shared_ptr<NativeProcessLinux> native_process_linux_sp (new NativeProcessLinux ()); 307 308 if (!native_process_linux_sp->RegisterNativeDelegate (native_delegate)) 309 { 310 error.SetErrorStringWithFormat ("failed to register the native delegate"); 311 return error; 312 } 313 314 native_process_linux_sp->AttachToInferior (mainloop, pid, error); 315 if (!error.Success ()) 316 return error; 317 318 native_process_sp = native_process_linux_sp; 319 return error; 320 } 321 322 // ----------------------------------------------------------------------------- 323 // Public Instance Methods 324 // ----------------------------------------------------------------------------- 325 326 NativeProcessLinux::NativeProcessLinux () : 327 NativeProcessProtocol (LLDB_INVALID_PROCESS_ID), 328 m_arch (), 329 m_supports_mem_region (eLazyBoolCalculate), 330 m_mem_region_cache (), 331 m_pending_notification_tid(LLDB_INVALID_THREAD_ID) 332 { 333 } 334 335 void 336 NativeProcessLinux::AttachToInferior (MainLoop &mainloop, lldb::pid_t pid, Error &error) 337 { 338 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 339 if (log) 340 log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__, pid); 341 342 m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD, 343 [this] (MainLoopBase &) { SigchldHandler(); }, error); 344 if (! m_sigchld_handle) 345 return; 346 347 error = ResolveProcessArchitecture(pid, m_arch); 348 if (!error.Success()) 349 return; 350 351 // Set the architecture to the exe architecture. 352 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 358 Attach(pid, error); 359 } 360 361 Error 362 NativeProcessLinux::LaunchInferior(MainLoop &mainloop, ProcessLaunchInfo &launch_info) 363 { 364 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); 370 371 MaybeLogLaunchInfo(launch_info); 372 373 ::pid_t pid = ProcessLauncherLinux().LaunchProcess(launch_info, error).GetProcessId(); 374 if (error.Fail()) 375 return error; 376 377 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 378 379 // 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 { 384 error.SetErrorToErrno(); 385 if (log) 386 log->Printf ("NativeProcessLinux::%s waitpid for inferior failed with %s", 387 __FUNCTION__, error.AsCString ()); 388 389 // Mark the inferior as invalid. 390 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 391 SetState (StateType::eStateInvalid); 392 393 return error; 394 } 395 assert(WIFSTOPPED(status) && (wpid == static_cast< ::pid_t> (pid)) && 396 "Could not sync with inferior process."); 397 398 if (log) 399 log->Printf ("NativeProcessLinux::%s inferior started, now in stopped state", __FUNCTION__); 400 401 error = SetDefaultPtraceOpts(pid); 402 if (error.Fail()) 403 { 404 if (log) 405 log->Printf ("NativeProcessLinux::%s inferior failed to set default ptrace options: %s", 406 __FUNCTION__, error.AsCString ()); 407 408 // Mark the inferior as invalid. 409 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 410 SetState (StateType::eStateInvalid); 411 412 return error; 413 } 414 415 // Release the master terminal descriptor and pass it off to the 416 // NativeProcessLinux instance. Similarly stash the inferior pid. 417 m_terminal_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor(); 418 m_pid = pid; 419 launch_info.SetProcessID(pid); 420 421 if (m_terminal_fd != -1) 422 { 423 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()); 430 431 // Mark the inferior as invalid. 432 // FIXME this could really use a new state - eStateLaunchFailure. For now, using eStateInvalid. 433 SetState(StateType::eStateInvalid); 434 435 return error; 436 } 437 } 438 439 if (log) 440 log->Printf("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__, uint64_t(pid)); 441 442 ResolveProcessArchitecture(m_pid, m_arch); 443 NativeThreadLinuxSP thread_sp = AddThread(pid); 444 assert (thread_sp && "AddThread() returned a nullptr thread"); 445 thread_sp->SetStoppedBySignal(SIGSTOP); 446 ThreadWasCreated(*thread_sp); 447 448 // Let our process instance know the thread has stopped. 449 SetCurrentThreadID (thread_sp->GetID ()); 450 SetState (StateType::eStateStopped); 451 452 if (log) 453 { 454 if (error.Success ()) 455 log->Printf("NativeProcessLinux::%s inferior launching succeeded", __FUNCTION__); 456 else 457 log->Printf("NativeProcessLinux::%s inferior launching failed: %s", __FUNCTION__, error.AsCString()); 458 } 459 return error; 460 } 461 462 ::pid_t 463 NativeProcessLinux::Attach(lldb::pid_t pid, Error &error) 464 { 465 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 { 471 error.SetErrorToGenericError(); 472 error.SetErrorString("Attaching to process 1 is not allowed."); 473 return -1; 474 } 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. 487 error = PtraceWrapper(PTRACE_ATTACH, tid); 488 if (error.Fail()) 489 { 490 // No such thread. The thread may have exited. 491 // More error handling may be needed. 492 if (error.GetError() == ESRCH) 493 { 494 it = tids_to_attach.erase(it); 495 continue; 496 } 497 else 498 return -1; 499 } 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 { 515 error.SetErrorToErrno(); 516 return -1; 517 } 518 } 519 520 error = SetDefaultPtraceOpts(tid); 521 if (error.Fail()) 522 return -1; 523 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. 530 NativeThreadLinuxSP thread_sp (AddThread(static_cast<lldb::tid_t>(tid))); 531 assert (thread_sp && "AddThread() returned a nullptr"); 532 533 // This will notify this is a new thread and tell the system it is stopped. 534 thread_sp->SetStoppedBySignal(SIGSTOP); 535 ThreadWasCreated(*thread_sp); 536 SetCurrentThreadID (thread_sp->GetID ()); 537 } 538 539 // move the loop forward 540 ++it; 541 } 542 } 543 544 if (tids_to_attach.size() > 0) 545 { 546 m_pid = pid; 547 // Let our process instance know the thread has stopped. 548 SetState (StateType::eStateStopped); 549 } 550 else 551 { 552 error.SetErrorToGenericError(); 553 error.SetErrorString("No such process."); 554 return -1; 555 } 556 557 return pid; 558 } 559 560 Error 561 NativeProcessLinux::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 578 return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void*)ptrace_opts); 579 } 580 581 static 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 596 static 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 611 // Handles all waitpid events from the inferior process. 612 void 613 NativeProcessLinux::MonitorCallback(lldb::pid_t pid, 614 bool exited, 615 int signal, 616 int status) 617 { 618 Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 619 620 // Certain activities differ based on whether the pid is the tid of the main thread. 621 const bool is_main_thread = (pid == GetID ()); 622 623 // Handle when the thread exits. 624 if (exited) 625 { 626 if (log) 627 log->Printf ("NativeProcessLinux::%s() got exit signal(%d) , tid = %" PRIu64 " (%s main thread)", __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not"); 628 629 // This is a thread that exited. Ensure we're not tracking it anymore. 630 const bool thread_found = StopTrackingThread (pid); 631 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. 637 const bool already_notified = (GetState() == StateType::eStateExited) || (GetState () == StateType::eStateCrashed); 638 if (!already_notified) 639 { 640 if (log) 641 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 ())); 642 // The main thread exited. We're done monitoring. Report to delegate. 643 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true); 644 645 // Notify delegate that our process has exited. 646 SetState (StateType::eStateExited, true); 647 } 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 } 653 } 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"); 661 } 662 return; 663 } 664 665 siginfo_t info; 666 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()) 696 { 697 // We have retrieved the signal info. Dispatch appropriately. 698 if (info.si_signo == SIGTRAP) 699 MonitorSIGTRAP(info, *thread_sp); 700 else 701 MonitorSignal(info, *thread_sp, exited); 702 } 703 else 704 { 705 if (info_err.GetError() == EINVAL) 706 { 707 // This is a group stop reception for this tid. 708 // 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. 715 if (log) 716 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); 717 ResumeThread(*thread_sp, thread_sp->GetState(), LLDB_INVALID_SIGNAL_NUMBER); 718 } 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 727 // Stop tracking the metadata for the thread since it's entirely off the system now. 728 const bool thread_found = StopTrackingThread (pid); 729 730 if (log) 731 log->Printf ("NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d (%s, %s, %s)", 732 __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"); 733 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? 738 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true); 739 SetState (StateType::eStateExited, true); 740 } 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) 745 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); 746 } 747 } 748 } 749 } 750 751 void 752 NativeProcessLinux::WaitForNewThread(::pid_t tid) 753 { 754 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 755 756 NativeThreadLinuxSP new_thread_sp = GetThreadByID(tid); 757 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 814 new_thread_sp = AddThread(tid); 815 ResumeThread(*new_thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER); 816 ThreadWasCreated(*new_thread_sp); 817 } 818 819 void 820 NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thread) 821 { 822 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 823 const bool is_main_thread = (thread.GetID() == GetID ()); 824 825 assert(info.si_signo == SIGTRAP && "Unexpected child signal!"); 826 827 switch (info.si_code) 828 { 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 { 835 // This is the notification on the parent thread which informs us of new thread 836 // 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. 840 841 unsigned long event_message = 0; 842 if (GetEventMessage(thread.GetID(), &event_message).Fail()) 843 { 844 if (log) 845 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " received thread creation event but GetEventMessage failed so we don't know the new tid", __FUNCTION__, thread.GetID()); 846 } else 847 WaitForNewThread(event_message); 848 849 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER); 850 break; 851 } 852 853 case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)): 854 { 855 NativeThreadLinuxSP main_thread_sp; 856 if (log) 857 log->Printf ("NativeProcessLinux::%s() received exec event, code = %d", __FUNCTION__, info.si_code ^ SIGTRAP); 858 859 // Exec clears any pending notifications. 860 m_pending_notification_tid = LLDB_INVALID_THREAD_ID; 861 862 // Remove all but the main thread here. Linux fork creates a new process which only copies the main thread. 863 if (log) 864 log->Printf ("NativeProcessLinux::%s exec received, stop tracking all but main thread", __FUNCTION__); 865 866 for (auto thread_sp : m_threads) 867 { 868 const bool is_main_thread = thread_sp && thread_sp->GetID () == GetID (); 869 if (is_main_thread) 870 { 871 main_thread_sp = std::static_pointer_cast<NativeThreadLinux>(thread_sp); 872 if (log) 873 log->Printf ("NativeProcessLinux::%s found main thread with tid %" PRIu64 ", keeping", __FUNCTION__, main_thread_sp->GetID ()); 874 } 875 else 876 { 877 if (log) 878 log->Printf ("NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64 " due to exec", __FUNCTION__, thread_sp->GetID ()); 879 } 880 } 881 882 m_threads.clear (); 883 884 if (main_thread_sp) 885 { 886 m_threads.push_back (main_thread_sp); 887 SetCurrentThreadID (main_thread_sp->GetID ()); 888 main_thread_sp->SetStoppedByExec(); 889 } 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 897 // Tell coordinator about about the "new" (since exec) stopped main thread. 898 ThreadWasCreated(*main_thread_sp); 899 900 // 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"); 905 906 // Let the process know we're stopped. 907 StopRunningThreads(main_thread_sp->GetID()); 908 909 break; 910 } 911 912 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)): 913 { 914 // The inferior process or one of its threads is about to exit. 915 // 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. 918 919 unsigned long data = 0; 920 if (GetEventMessage(thread.GetID(), &data).Fail()) 921 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", 928 thread.GetID(), 929 is_main_thread ? "is main thread" : "not main thread"); 930 } 931 932 if (is_main_thread) 933 { 934 SetExitStatus (convert_pid_status_to_exit_type (data), convert_pid_status_to_return_code (data), nullptr, true); 935 } 936 937 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); 947 948 break; 949 } 950 951 case 0: 952 case TRAP_TRACE: // We receive this on single stepping. 953 case TRAP_HWBKPT: // We receive this on watchpoint hit 954 { 955 // If a watchpoint was hit, report it 956 uint32_t wp_index; 957 Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, (uintptr_t)info.si_addr); 958 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) 964 { 965 MonitorWatchpoint(thread, wp_index); 966 break; 967 } 968 969 // Otherwise, report step over 970 MonitorTrace(thread); 971 break; 972 } 973 974 case SI_KERNEL: 975 #if defined __mips__ 976 // For mips there is no special signal for watchpoint 977 // So we check for watchpoint in kernel trap 978 { 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", 986 __FUNCTION__, thread.GetID(), error.AsCString()); 987 if (wp_index != LLDB_INVALID_INDEX32) 988 { 989 MonitorWatchpoint(thread, wp_index); 990 break; 991 } 992 } 993 // NO BREAK 994 #endif 995 case TRAP_BRKPT: 996 MonitorBreakpoint(thread); 997 break; 998 999 case SIGTRAP: 1000 case (SIGTRAP | 0x80): 1001 if (log) 1002 log->Printf ("NativeProcessLinux::%s() received unknown SIGTRAP system call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming", __FUNCTION__, GetID (), thread.GetID()); 1003 1004 // Ignore these signals until we know more about them. 1005 ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER); 1006 break; 1007 1008 default: 1009 assert(false && "Unexpected SIGTRAP code!"); 1010 if (log) 1011 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64 " received unhandled SIGTRAP code: 0x%d", 1012 __FUNCTION__, GetID(), thread.GetID(), info.si_code); 1013 break; 1014 1015 } 1016 } 1017 1018 void 1019 NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread) 1020 { 1021 Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 1022 if (log) 1023 log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64 " (single stepping)", 1024 __FUNCTION__, thread.GetID()); 1025 1026 // This thread is currently stopped. 1027 thread.SetStoppedByTrace(); 1028 1029 StopRunningThreads(thread.GetID()); 1030 } 1031 1032 void 1033 NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread) 1034 { 1035 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 1036 if (log) 1037 log->Printf("NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64, 1038 __FUNCTION__, thread.GetID()); 1039 1040 // Mark the thread as stopped at breakpoint. 1041 thread.SetStoppedByBreakpoint(); 1042 Error error = FixupBreakpointPCAsNeeded(thread); 1043 if (error.Fail()) 1044 if (log) 1045 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s", 1046 __FUNCTION__, thread.GetID(), error.AsCString()); 1047 1048 if (m_threads_stepping_with_breakpoint.find(thread.GetID()) != m_threads_stepping_with_breakpoint.end()) 1049 thread.SetStoppedByTrace(); 1050 1051 StopRunningThreads(thread.GetID()); 1052 } 1053 1054 void 1055 NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread, uint32_t wp_index) 1056 { 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, 1061 __FUNCTION__, thread.GetID(), wp_index); 1062 1063 // Mark the thread as stopped at watchpoint. 1064 // The address is at (lldb::addr_t)info->si_addr if we need it. 1065 thread.SetStoppedByWatchpoint(wp_index); 1066 1067 // We need to tell all other running threads before we notify the delegate about this stop. 1068 StopRunningThreads(thread.GetID()); 1069 } 1070 1071 void 1072 NativeProcessLinux::MonitorSignal(const siginfo_t &info, NativeThreadLinux &thread, bool exited) 1073 { 1074 const int signo = info.si_signo; 1075 const bool is_from_llgs = info.si_pid == getpid (); 1076 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 1088 // Handle the signal. 1089 if (info.si_code == SI_TKILL || info.si_code == SI_USER) 1090 { 1091 if (log) 1092 log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")", 1093 __FUNCTION__, 1094 Host::GetSignalAsCString(signo), 1095 signo, 1096 (info.si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"), 1097 info.si_pid, 1098 is_from_llgs ? "from llgs" : "not from llgs", 1099 thread.GetID()); 1100 } 1101 1102 // Check for thread stop notification. 1103 if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP)) 1104 { 1105 // This is a tgkill()-based stop. 1106 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)) 1120 { 1121 // 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) 1129 { 1130 if (m_pending_notification_tid == thread.GetID()) 1131 thread.SetStoppedBySignal(SIGSTOP, &info); 1132 else 1133 thread.SetStoppedWithNoReason(); 1134 1135 SetCurrentThreadID (thread.GetID ()); 1136 SignalIfAllThreadsStopped(); 1137 } 1138 else 1139 { 1140 // 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) 1144 { 1145 log->Printf("NativeProcessLinux::%s failed to resume thread tid %" PRIu64 ": %s", 1146 __FUNCTION__, thread.GetID(), error.AsCString()); 1147 } 1148 } 1149 } 1150 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 } 1171 1172 // Done handling. 1173 return; 1174 } 1175 1176 if (log) 1177 log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, Host::GetSignalAsCString(signo)); 1178 1179 // This thread is stopped. 1180 thread.SetStoppedBySignal(signo, &info); 1181 1182 // Send a stop to the debugger after we get all other threads to stop. 1183 StopRunningThreads(thread.GetID()); 1184 } 1185 1186 namespace { 1187 1188 struct EmulatorBaton 1189 { 1190 NativeProcessLinux* m_process; 1191 NativeRegisterContext* m_reg_context; 1192 1193 // eRegisterKindDWARF -> RegsiterValue 1194 std::unordered_map<uint32_t, RegisterValue> m_register_values; 1195 1196 EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) : 1197 m_process(process), m_reg_context(reg_context) {} 1198 }; 1199 1200 } // anonymous namespace 1201 1202 static size_t 1203 ReadMemoryCallback (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 1212 size_t bytes_read; 1213 emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read); 1214 return bytes_read; 1215 } 1216 1217 static bool 1218 ReadRegisterCallback (EmulateInstruction *instruction, 1219 void *baton, 1220 const RegisterInfo *reg_info, 1221 RegisterValue ®_value) 1222 { 1223 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 1224 1225 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 1232 // 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); 1239 if (error.Success()) 1240 return true; 1241 1242 return false; 1243 } 1244 1245 static bool 1246 WriteRegisterCallback (EmulateInstruction *instruction, 1247 void *baton, 1248 const EmulateInstruction::Context &context, 1249 const RegisterInfo *reg_info, 1250 const RegisterValue ®_value) 1251 { 1252 EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton); 1253 emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value; 1254 return true; 1255 } 1256 1257 static size_t 1258 WriteMemoryCallback (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 1268 static lldb::addr_t 1269 ReadFlags (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 1276 Error 1277 NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadLinux &thread) 1278 { 1279 Error error; 1280 NativeRegisterContextSP register_context_sp = thread.GetRegisterContext(); 1281 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 1298 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 1306 lldb::addr_t next_pc; 1307 lldb::addr_t next_flags; 1308 if (emulation_result) 1309 { 1310 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(); 1315 else 1316 next_flags = ReadFlags (register_context_sp.get()); 1317 } 1318 else if (pc_it == baton.m_register_values.end()) 1319 { 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 } 1348 else if (m_arch.GetMachine() == llvm::Triple::mips64 1349 || m_arch.GetMachine() == llvm::Triple::mips64el 1350 || m_arch.GetMachine() == llvm::Triple::mips 1351 || m_arch.GetMachine() == llvm::Triple::mipsel) 1352 error = SetSoftwareBreakpoint(next_pc, 4); 1353 else 1354 { 1355 // No size hint is given for the next breakpoint 1356 error = SetSoftwareBreakpoint(next_pc, 0); 1357 } 1358 1359 if (error.Fail()) 1360 return error; 1361 1362 m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc}); 1363 1364 return Error(); 1365 } 1366 1367 bool 1368 NativeProcessLinux::SupportHardwareSingleStepping() const 1369 { 1370 if (m_arch.GetMachine() == llvm::Triple::arm 1371 || 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) 1373 return false; 1374 return true; 1375 } 1376 1377 Error 1378 NativeProcessLinux::Resume (const ResumeActionList &resume_actions) 1379 { 1380 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD)); 1381 if (log) 1382 log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ()); 1383 1384 bool software_single_step = !SupportHardwareSingleStepping(); 1385 1386 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 { 1398 Error error = SetupSoftwareSingleStepping(static_cast<NativeThreadLinux &>(*thread_sp)); 1399 if (error.Fail()) 1400 return error; 1401 } 1402 } 1403 } 1404 1405 for (auto thread_sp : m_threads) 1406 { 1407 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) 1412 { 1413 if (log) 1414 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64, 1415 __FUNCTION__, GetID (), thread_sp->GetID ()); 1416 continue; 1417 } 1418 1419 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 } 1424 1425 switch (action->state) 1426 { 1427 case eStateRunning: 1428 case eStateStepping: 1429 { 1430 // Run the thread, possibly feeding it the signal. 1431 const int signo = action->signal; 1432 ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state, signo); 1433 break; 1434 } 1435 1436 case eStateSuspended: 1437 case eStateStopped: 1438 lldbassert(0 && "Unexpected state"); 1439 1440 default: 1441 return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64, 1442 __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ()); 1443 } 1444 } 1445 1446 return Error(); 1447 } 1448 1449 Error 1450 NativeProcessLinux::Halt () 1451 { 1452 Error error; 1453 1454 if (kill (GetID (), SIGSTOP) != 0) 1455 error.SetErrorToErrno (); 1456 1457 return error; 1458 } 1459 1460 Error 1461 NativeProcessLinux::Detach () 1462 { 1463 Error error; 1464 1465 // Stop monitoring the inferior. 1466 m_sigchld_handle.reset(); 1467 1468 // 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 1479 return error; 1480 } 1481 1482 Error 1483 NativeProcessLinux::Signal (int signo) 1484 { 1485 Error error; 1486 1487 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1488 if (log) 1489 log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64, 1490 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID()); 1491 1492 if (kill(GetID(), signo)) 1493 error.SetErrorToErrno(); 1494 1495 return error; 1496 } 1497 1498 Error 1499 NativeProcessLinux::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. 1503 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1504 1505 NativeThreadProtocolSP running_thread_sp; 1506 NativeThreadProtocolSP stopped_thread_sp; 1507 1508 if (log) 1509 log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__); 1510 1511 for (auto thread_sp : m_threads) 1512 { 1513 // The thread shouldn't be null but lets just cover that here. 1514 if (!thread_sp) 1515 continue; 1516 1517 // If we have a running or stepping thread, we'll call that the 1518 // target of the interrupt. 1519 const auto thread_state = thread_sp->GetState (); 1520 if (thread_state == eStateRunning || 1521 thread_state == eStateStepping) 1522 { 1523 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; 1530 } 1531 } 1532 1533 if (!running_thread_sp && !stopped_thread_sp) 1534 { 1535 Error error("found no running/stepping or live stopped threads as target for interrupt"); 1536 if (log) 1537 log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ()); 1538 1539 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 1551 StopRunningThreads(deferred_signal_thread_sp->GetID()); 1552 1553 return Error(); 1554 } 1555 1556 Error 1557 NativeProcessLinux::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 1597 static Error 1598 ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info) 1599 { 1600 memory_region_info.Clear(); 1601 1602 StringExtractor line_extractor (maps_line.c_str ()); 1603 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 1625 // Any memory region in /proc/{pid}/maps is by definition mapped into the process. 1626 memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes); 1627 1628 // 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); 1636 else if (read_perm_char == '-') 1637 memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 1638 else 1639 return Error ("unexpected /proc/{pid}/maps read permission char"); 1640 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); 1645 else if (write_perm_char == '-') 1646 memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 1647 else 1648 return Error ("unexpected /proc/{pid}/maps write permission char"); 1649 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); 1654 else if (exec_perm_char == '-') 1655 memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 1656 else 1657 return Error ("unexpected /proc/{pid}/maps exec permission char"); 1658 1659 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(); 1669 const char* name = line_extractor.Peek(); 1670 if (name) 1671 memory_region_info.SetName(name); 1672 1673 return Error (); 1674 } 1675 1676 Error 1677 NativeProcessLinux::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. 1685 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); 1767 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo); 1768 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 1781 // 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); 1785 range_info.GetRange ().SetRangeEnd(LLDB_INVALID_ADDRESS); 1786 range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo); 1787 range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo); 1788 range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo); 1789 range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo); 1790 return error; 1791 } 1792 1793 void 1794 NativeProcessLinux::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 1800 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 (); 1803 } 1804 1805 Error 1806 NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr) 1807 { 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 1838 Error 1839 NativeProcessLinux::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 1846 lldb::addr_t 1847 NativeProcessLinux::GetSharedLibraryInfoAddress () 1848 { 1849 // punt on this for now 1850 return LLDB_INVALID_ADDRESS; 1851 } 1852 1853 size_t 1854 NativeProcessLinux::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. 1860 return m_threads.size (); 1861 } 1862 1863 bool 1864 NativeProcessLinux::GetArchitecture (ArchSpec &arch) const 1865 { 1866 arch = m_arch; 1867 return true; 1868 } 1869 1870 Error 1871 NativeProcessLinux::GetSoftwareBreakpointPCOffset(uint32_t &actual_opcode_size) 1872 { 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 }; 1876 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 }; 1877 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 1885 case llvm::Triple::systemz: 1886 actual_opcode_size = static_cast<uint32_t> (sizeof(g_s390x_opcode)); 1887 return Error (); 1888 1889 case llvm::Triple::arm: 1890 case llvm::Triple::aarch64: 1891 case llvm::Triple::mips64: 1892 case llvm::Triple::mips64el: 1893 case llvm::Triple::mips: 1894 case llvm::Triple::mipsel: 1895 // On these architectures the PC don't get updated for breakpoint hits 1896 actual_opcode_size = 0; 1897 return Error (); 1898 1899 default: 1900 assert(false && "CPU type not supported!"); 1901 return Error ("CPU type not supported"); 1902 } 1903 } 1904 1905 Error 1906 NativeProcessLinux::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 1914 Error 1915 NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint, 1916 size_t &actual_opcode_size, 1917 const uint8_t *&trap_opcode_bytes) 1918 { 1919 // FIXME put this behind a breakpoint protocol class that can be set per 1920 // architecture. Need MIPS support here. 1921 static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 }; 1922 // 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 }; 1925 static const uint8_t g_i386_opcode [] = { 0xCC }; 1926 static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d }; 1927 static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 }; 1928 static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 }; 1929 static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde }; 1930 1931 switch (m_arch.GetMachine ()) 1932 { 1933 case llvm::Triple::aarch64: 1934 trap_opcode_bytes = g_aarch64_opcode; 1935 actual_opcode_size = sizeof(g_aarch64_opcode); 1936 return Error (); 1937 1938 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 1954 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 1960 case llvm::Triple::mips: 1961 case llvm::Triple::mips64: 1962 trap_opcode_bytes = g_mips64_opcode; 1963 actual_opcode_size = sizeof(g_mips64_opcode); 1964 return Error (); 1965 1966 case llvm::Triple::mipsel: 1967 case llvm::Triple::mips64el: 1968 trap_opcode_bytes = g_mips64el_opcode; 1969 actual_opcode_size = sizeof(g_mips64el_opcode); 1970 return Error (); 1971 1972 case llvm::Triple::systemz: 1973 trap_opcode_bytes = g_s390x_opcode; 1974 actual_opcode_size = sizeof(g_s390x_opcode); 1975 return Error (); 1976 1977 default: 1978 assert(false && "CPU type not supported!"); 1979 return Error ("CPU type not supported"); 1980 } 1981 } 1982 1983 #if 0 1984 ProcessMessage::CrashReason 1985 NativeProcessLinux::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 2017 ProcessMessage::CrashReason 2018 NativeProcessLinux::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 2061 ProcessMessage::CrashReason 2062 NativeProcessLinux::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 2105 ProcessMessage::CrashReason 2106 NativeProcessLinux::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 2133 Error 2134 NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read) 2135 { 2136 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 2162 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 2186 memcpy(dst, &data, remainder); 2187 2188 if (log && ProcessPOSIXLog::AtTopNestLevel() && 2189 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) || 2190 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) && 2191 size <= POSIX_LOG_MEMORY_SHORT_BYTES))) 2192 { 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); 2197 log->Printf ("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64 " (0x%" PRIx64 ")", 2198 __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data)); 2199 } 2200 addr += k_ptrace_word_size; 2201 dst += k_ptrace_word_size; 2202 } 2203 2204 if (log) 2205 ProcessPOSIXLog::DecNestLevel(); 2206 return Error(); 2207 } 2208 2209 Error 2210 NativeProcessLinux::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 2217 Error 2218 NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written) 2219 { 2220 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)) 2228 log->Printf ("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__, addr, buf, size); 2229 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; 2238 memcpy(&data, src, k_ptrace_word_size); 2239 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; 2292 } 2293 2294 Error 2295 NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo) 2296 { 2297 return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo); 2298 } 2299 2300 Error 2301 NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message) 2302 { 2303 return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message); 2304 } 2305 2306 Error 2307 NativeProcessLinux::Detach(lldb::tid_t tid) 2308 { 2309 if (tid == LLDB_INVALID_THREAD_ID) 2310 return Error(); 2311 2312 return PtraceWrapper(PTRACE_DETACH, tid); 2313 } 2314 2315 bool 2316 NativeProcessLinux::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 2332 bool 2333 NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id) 2334 { 2335 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 2342 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); 2347 found = true; 2348 break; 2349 } 2350 } 2351 2352 SignalIfAllThreadsStopped(); 2353 2354 return found; 2355 } 2356 2357 NativeThreadLinuxSP 2358 NativeProcessLinux::AddThread (lldb::tid_t thread_id) 2359 { 2360 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD)); 2361 2362 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 2376 auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id); 2377 m_threads.push_back (thread_sp); 2378 return thread_sp; 2379 } 2380 2381 Error 2382 NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread) 2383 { 2384 Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 2385 2386 Error error; 2387 2388 // Find out the size of a breakpoint (might depend on where we are in the code). 2389 NativeRegisterContextSP context_sp = thread.GetRegisterContext(); 2390 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; 2399 error = GetSoftwareBreakpointPCOffset(breakpoint_size); 2400 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. 2413 const lldb::addr_t initial_pc_addr = context_sp->GetPCfromBreakpointLocation (); 2414 lldb::addr_t breakpoint_addr = initial_pc_addr; 2415 if (breakpoint_size > 0) 2416 { 2417 // Do not allow breakpoint probe to wrap around. 2418 if (breakpoint_addr >= breakpoint_size) 2419 breakpoint_addr -= breakpoint_size; 2420 } 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) 2456 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); 2457 2458 error = context_sp->SetPC (breakpoint_addr); 2459 if (error.Fail ()) 2460 { 2461 if (log) 2462 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID(), thread.GetID(), error.AsCString ()); 2463 return error; 2464 } 2465 2466 return error; 2467 } 2468 2469 Error 2470 NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec) 2471 { 2472 FileSpec module_file_spec(module_path, true); 2473 2474 bool found = false; 2475 file_spec.Clear(); 2476 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(); 2498 } 2499 2500 Error 2501 NativeProcessLinux::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 2533 NativeThreadLinuxSP 2534 NativeProcessLinux::GetThreadByID(lldb::tid_t tid) 2535 { 2536 return std::static_pointer_cast<NativeThreadLinux>(NativeProcessProtocol::GetThreadByID(tid)); 2537 } 2538 2539 Error 2540 NativeProcessLinux::ResumeThread(NativeThreadLinux &thread, lldb::StateType state, int signo) 2541 { 2542 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 2543 2544 if (log) 2545 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", 2546 __FUNCTION__, thread.GetID()); 2547 2548 // Before we do the resume below, first check if we have a pending 2549 // stop notification that is currently waiting for 2550 // all threads to stop. This is potentially a buggy situation since 2551 // 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. 2554 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log) 2555 { 2556 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); 2557 } 2558 2559 // Request a resume. We expect this to be synchronous and the system 2560 // to reflect it is running after this completes. 2561 switch (state) 2562 { 2563 case eStateRunning: 2564 { 2565 const auto resume_result = thread.Resume(signo); 2566 if (resume_result.Success()) 2567 SetState(eStateRunning, true); 2568 return resume_result; 2569 } 2570 case eStateStepping: 2571 { 2572 const auto step_result = thread.SingleStep(signo); 2573 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 } 2583 } 2584 2585 //===----------------------------------------------------------------------===// 2586 2587 void 2588 NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid) 2589 { 2590 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 2591 2592 if (log) 2593 { 2594 log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")", 2595 __FUNCTION__, triggering_tid); 2596 } 2597 2598 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(); 2609 2610 if (log) 2611 { 2612 log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__); 2613 } 2614 } 2615 2616 void 2617 NativeProcessLinux::SignalIfAllThreadsStopped() 2618 { 2619 if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID) 2620 return; // No pending notification. Nothing to do. 2621 2622 for (const auto &thread_sp: m_threads) 2623 { 2624 if (StateIsRunningState(thread_sp->GetState())) 2625 return; // Some threads are still running. Don't signal yet. 2626 } 2627 2628 // We have a pending notification and all threads have stopped. 2629 Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS)); 2630 2631 // Clear any temporary breakpoints we used to implement software single stepping. 2632 for (const auto &thread_info: m_threads_stepping_with_breakpoint) 2633 { 2634 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()); 2639 } 2640 m_threads_stepping_with_breakpoint.clear(); 2641 2642 // 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; 2646 } 2647 2648 void 2649 NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread) 2650 { 2651 Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD); 2652 2653 if (log) 2654 log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread.GetID()); 2655 2656 if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && StateIsRunningState(thread.GetState())) 2657 { 2658 // We will need to wait for this new thread to stop as well before firing the 2659 // notification. 2660 thread.RequestStop(); 2661 } 2662 } 2663 2664 void 2665 NativeProcessLinux::SigchldHandler() 2666 { 2667 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"; 2708 if (wait_pid == static_cast< ::pid_t>(GetID())) { 2709 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 } 2723 } 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*) 2727 Error 2728 NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, long *result) 2729 { 2730 Error error; 2731 long int ret; 2732 2733 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE)); 2734 2735 PtraceDisplayBytes(req, data, data_size); 2736 2737 errno = 0; 2738 if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET) 2739 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data); 2740 else 2741 ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data); 2742 2743 if (ret == -1) 2744 error.SetErrorToErrno(); 2745 2746 if (result) 2747 *result = ret; 2748 2749 if (log) 2750 log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr, data, data_size, ret); 2751 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 2768 return error; 2769 } 2770