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