1 //===-- Process.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 "lldb/lldb-python.h" 11 12 #include "lldb/Target/Process.h" 13 14 #include "lldb/lldb-private-log.h" 15 16 #include "lldb/Breakpoint/StoppointCallbackContext.h" 17 #include "lldb/Breakpoint/BreakpointLocation.h" 18 #include "lldb/Core/Event.h" 19 #include "lldb/Core/ConnectionFileDescriptor.h" 20 #include "lldb/Core/Debugger.h" 21 #include "lldb/Core/InputReader.h" 22 #include "lldb/Core/Log.h" 23 #include "lldb/Core/Module.h" 24 #include "lldb/Core/PluginManager.h" 25 #include "lldb/Core/State.h" 26 #include "lldb/Expression/ClangUserExpression.h" 27 #include "lldb/Interpreter/CommandInterpreter.h" 28 #include "lldb/Host/Host.h" 29 #include "lldb/Target/ABI.h" 30 #include "lldb/Target/DynamicLoader.h" 31 #include "lldb/Target/OperatingSystem.h" 32 #include "lldb/Target/LanguageRuntime.h" 33 #include "lldb/Target/CPPLanguageRuntime.h" 34 #include "lldb/Target/ObjCLanguageRuntime.h" 35 #include "lldb/Target/Platform.h" 36 #include "lldb/Target/RegisterContext.h" 37 #include "lldb/Target/StopInfo.h" 38 #include "lldb/Target/SystemRuntime.h" 39 #include "lldb/Target/Target.h" 40 #include "lldb/Target/TargetList.h" 41 #include "lldb/Target/Thread.h" 42 #include "lldb/Target/ThreadPlan.h" 43 #include "lldb/Target/ThreadPlanBase.h" 44 45 #ifndef LLDB_DISABLE_POSIX 46 #include <spawn.h> 47 #endif 48 49 using namespace lldb; 50 using namespace lldb_private; 51 52 53 // Comment out line below to disable memory caching, overriding the process setting 54 // target.process.disable-memory-cache 55 #define ENABLE_MEMORY_CACHING 56 57 #ifdef ENABLE_MEMORY_CACHING 58 #define DISABLE_MEM_CACHE_DEFAULT false 59 #else 60 #define DISABLE_MEM_CACHE_DEFAULT true 61 #endif 62 63 class ProcessOptionValueProperties : public OptionValueProperties 64 { 65 public: 66 ProcessOptionValueProperties (const ConstString &name) : 67 OptionValueProperties (name) 68 { 69 } 70 71 // This constructor is used when creating ProcessOptionValueProperties when it 72 // is part of a new lldb_private::Process instance. It will copy all current 73 // global property values as needed 74 ProcessOptionValueProperties (ProcessProperties *global_properties) : 75 OptionValueProperties(*global_properties->GetValueProperties()) 76 { 77 } 78 79 virtual const Property * 80 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const 81 { 82 // When gettings the value for a key from the process options, we will always 83 // try and grab the setting from the current process if there is one. Else we just 84 // use the one from this instance. 85 if (exe_ctx) 86 { 87 Process *process = exe_ctx->GetProcessPtr(); 88 if (process) 89 { 90 ProcessOptionValueProperties *instance_properties = static_cast<ProcessOptionValueProperties *>(process->GetValueProperties().get()); 91 if (this != instance_properties) 92 return instance_properties->ProtectedGetPropertyAtIndex (idx); 93 } 94 } 95 return ProtectedGetPropertyAtIndex (idx); 96 } 97 }; 98 99 static PropertyDefinition 100 g_properties[] = 101 { 102 { "disable-memory-cache" , OptionValue::eTypeBoolean, false, DISABLE_MEM_CACHE_DEFAULT, NULL, NULL, "Disable reading and caching of memory in fixed-size units." }, 103 { "extra-startup-command", OptionValue::eTypeArray , false, OptionValue::eTypeString, NULL, NULL, "A list containing extra commands understood by the particular process plugin used. " 104 "For instance, to turn on debugserver logging set this to \"QSetLogging:bitmask=LOG_DEFAULT;\"" }, 105 { "ignore-breakpoints-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, breakpoints will be ignored during expression evaluation." }, 106 { "unwind-on-error-in-expressions", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, errors in expression evaluation will unwind the stack back to the state before the call." }, 107 { "python-os-plugin-path", OptionValue::eTypeFileSpec, false, true, NULL, NULL, "A path to a python OS plug-in module file that contains a OperatingSystemPlugIn class." }, 108 { "stop-on-sharedlibrary-events" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, stop when a shared library is loaded or unloaded." }, 109 { "detach-keeps-stopped" , OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, detach will attempt to keep the process stopped." }, 110 { NULL , OptionValue::eTypeInvalid, false, 0, NULL, NULL, NULL } 111 }; 112 113 enum { 114 ePropertyDisableMemCache, 115 ePropertyExtraStartCommand, 116 ePropertyIgnoreBreakpointsInExpressions, 117 ePropertyUnwindOnErrorInExpressions, 118 ePropertyPythonOSPluginPath, 119 ePropertyStopOnSharedLibraryEvents, 120 ePropertyDetachKeepsStopped 121 }; 122 123 ProcessProperties::ProcessProperties (bool is_global) : 124 Properties () 125 { 126 if (is_global) 127 { 128 m_collection_sp.reset (new ProcessOptionValueProperties(ConstString("process"))); 129 m_collection_sp->Initialize(g_properties); 130 m_collection_sp->AppendProperty(ConstString("thread"), 131 ConstString("Settings specific to threads."), 132 true, 133 Thread::GetGlobalProperties()->GetValueProperties()); 134 } 135 else 136 m_collection_sp.reset (new ProcessOptionValueProperties(Process::GetGlobalProperties().get())); 137 } 138 139 ProcessProperties::~ProcessProperties() 140 { 141 } 142 143 bool 144 ProcessProperties::GetDisableMemoryCache() const 145 { 146 const uint32_t idx = ePropertyDisableMemCache; 147 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 148 } 149 150 Args 151 ProcessProperties::GetExtraStartupCommands () const 152 { 153 Args args; 154 const uint32_t idx = ePropertyExtraStartCommand; 155 m_collection_sp->GetPropertyAtIndexAsArgs(NULL, idx, args); 156 return args; 157 } 158 159 void 160 ProcessProperties::SetExtraStartupCommands (const Args &args) 161 { 162 const uint32_t idx = ePropertyExtraStartCommand; 163 m_collection_sp->SetPropertyAtIndexFromArgs(NULL, idx, args); 164 } 165 166 FileSpec 167 ProcessProperties::GetPythonOSPluginPath () const 168 { 169 const uint32_t idx = ePropertyPythonOSPluginPath; 170 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx); 171 } 172 173 void 174 ProcessProperties::SetPythonOSPluginPath (const FileSpec &file) 175 { 176 const uint32_t idx = ePropertyPythonOSPluginPath; 177 m_collection_sp->SetPropertyAtIndexAsFileSpec(NULL, idx, file); 178 } 179 180 181 bool 182 ProcessProperties::GetIgnoreBreakpointsInExpressions () const 183 { 184 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions; 185 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 186 } 187 188 void 189 ProcessProperties::SetIgnoreBreakpointsInExpressions (bool ignore) 190 { 191 const uint32_t idx = ePropertyIgnoreBreakpointsInExpressions; 192 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore); 193 } 194 195 bool 196 ProcessProperties::GetUnwindOnErrorInExpressions () const 197 { 198 const uint32_t idx = ePropertyUnwindOnErrorInExpressions; 199 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 200 } 201 202 void 203 ProcessProperties::SetUnwindOnErrorInExpressions (bool ignore) 204 { 205 const uint32_t idx = ePropertyUnwindOnErrorInExpressions; 206 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, ignore); 207 } 208 209 bool 210 ProcessProperties::GetStopOnSharedLibraryEvents () const 211 { 212 const uint32_t idx = ePropertyStopOnSharedLibraryEvents; 213 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 214 } 215 216 void 217 ProcessProperties::SetStopOnSharedLibraryEvents (bool stop) 218 { 219 const uint32_t idx = ePropertyStopOnSharedLibraryEvents; 220 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop); 221 } 222 223 bool 224 ProcessProperties::GetDetachKeepsStopped () const 225 { 226 const uint32_t idx = ePropertyDetachKeepsStopped; 227 return m_collection_sp->GetPropertyAtIndexAsBoolean(NULL, idx, g_properties[idx].default_uint_value != 0); 228 } 229 230 void 231 ProcessProperties::SetDetachKeepsStopped (bool stop) 232 { 233 const uint32_t idx = ePropertyDetachKeepsStopped; 234 m_collection_sp->SetPropertyAtIndexAsBoolean(NULL, idx, stop); 235 } 236 237 void 238 ProcessInstanceInfo::Dump (Stream &s, Platform *platform) const 239 { 240 const char *cstr; 241 if (m_pid != LLDB_INVALID_PROCESS_ID) 242 s.Printf (" pid = %" PRIu64 "\n", m_pid); 243 244 if (m_parent_pid != LLDB_INVALID_PROCESS_ID) 245 s.Printf (" parent = %" PRIu64 "\n", m_parent_pid); 246 247 if (m_executable) 248 { 249 s.Printf (" name = %s\n", m_executable.GetFilename().GetCString()); 250 s.PutCString (" file = "); 251 m_executable.Dump(&s); 252 s.EOL(); 253 } 254 const uint32_t argc = m_arguments.GetArgumentCount(); 255 if (argc > 0) 256 { 257 for (uint32_t i=0; i<argc; i++) 258 { 259 const char *arg = m_arguments.GetArgumentAtIndex(i); 260 if (i < 10) 261 s.Printf (" arg[%u] = %s\n", i, arg); 262 else 263 s.Printf ("arg[%u] = %s\n", i, arg); 264 } 265 } 266 267 const uint32_t envc = m_environment.GetArgumentCount(); 268 if (envc > 0) 269 { 270 for (uint32_t i=0; i<envc; i++) 271 { 272 const char *env = m_environment.GetArgumentAtIndex(i); 273 if (i < 10) 274 s.Printf (" env[%u] = %s\n", i, env); 275 else 276 s.Printf ("env[%u] = %s\n", i, env); 277 } 278 } 279 280 if (m_arch.IsValid()) 281 s.Printf (" arch = %s\n", m_arch.GetTriple().str().c_str()); 282 283 if (m_uid != UINT32_MAX) 284 { 285 cstr = platform->GetUserName (m_uid); 286 s.Printf (" uid = %-5u (%s)\n", m_uid, cstr ? cstr : ""); 287 } 288 if (m_gid != UINT32_MAX) 289 { 290 cstr = platform->GetGroupName (m_gid); 291 s.Printf (" gid = %-5u (%s)\n", m_gid, cstr ? cstr : ""); 292 } 293 if (m_euid != UINT32_MAX) 294 { 295 cstr = platform->GetUserName (m_euid); 296 s.Printf (" euid = %-5u (%s)\n", m_euid, cstr ? cstr : ""); 297 } 298 if (m_egid != UINT32_MAX) 299 { 300 cstr = platform->GetGroupName (m_egid); 301 s.Printf (" egid = %-5u (%s)\n", m_egid, cstr ? cstr : ""); 302 } 303 } 304 305 void 306 ProcessInstanceInfo::DumpTableHeader (Stream &s, Platform *platform, bool show_args, bool verbose) 307 { 308 const char *label; 309 if (show_args || verbose) 310 label = "ARGUMENTS"; 311 else 312 label = "NAME"; 313 314 if (verbose) 315 { 316 s.Printf ("PID PARENT USER GROUP EFF USER EFF GROUP TRIPLE %s\n", label); 317 s.PutCString ("====== ====== ========== ========== ========== ========== ======================== ============================\n"); 318 } 319 else 320 { 321 s.Printf ("PID PARENT USER ARCH %s\n", label); 322 s.PutCString ("====== ====== ========== ======= ============================\n"); 323 } 324 } 325 326 void 327 ProcessInstanceInfo::DumpAsTableRow (Stream &s, Platform *platform, bool show_args, bool verbose) const 328 { 329 if (m_pid != LLDB_INVALID_PROCESS_ID) 330 { 331 const char *cstr; 332 s.Printf ("%-6" PRIu64 " %-6" PRIu64 " ", m_pid, m_parent_pid); 333 334 335 if (verbose) 336 { 337 cstr = platform->GetUserName (m_uid); 338 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 339 s.Printf ("%-10s ", cstr); 340 else 341 s.Printf ("%-10u ", m_uid); 342 343 cstr = platform->GetGroupName (m_gid); 344 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 345 s.Printf ("%-10s ", cstr); 346 else 347 s.Printf ("%-10u ", m_gid); 348 349 cstr = platform->GetUserName (m_euid); 350 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 351 s.Printf ("%-10s ", cstr); 352 else 353 s.Printf ("%-10u ", m_euid); 354 355 cstr = platform->GetGroupName (m_egid); 356 if (cstr && cstr[0]) // Watch for empty string that indicates lookup failed 357 s.Printf ("%-10s ", cstr); 358 else 359 s.Printf ("%-10u ", m_egid); 360 s.Printf ("%-24s ", m_arch.IsValid() ? m_arch.GetTriple().str().c_str() : ""); 361 } 362 else 363 { 364 s.Printf ("%-10s %-7d %s ", 365 platform->GetUserName (m_euid), 366 (int)m_arch.GetTriple().getArchName().size(), 367 m_arch.GetTriple().getArchName().data()); 368 } 369 370 if (verbose || show_args) 371 { 372 const uint32_t argc = m_arguments.GetArgumentCount(); 373 if (argc > 0) 374 { 375 for (uint32_t i=0; i<argc; i++) 376 { 377 if (i > 0) 378 s.PutChar (' '); 379 s.PutCString (m_arguments.GetArgumentAtIndex(i)); 380 } 381 } 382 } 383 else 384 { 385 s.PutCString (GetName()); 386 } 387 388 s.EOL(); 389 } 390 } 391 392 393 void 394 ProcessInfo::SetArguments (char const **argv, bool first_arg_is_executable) 395 { 396 m_arguments.SetArguments (argv); 397 398 // Is the first argument the executable? 399 if (first_arg_is_executable) 400 { 401 const char *first_arg = m_arguments.GetArgumentAtIndex (0); 402 if (first_arg) 403 { 404 // Yes the first argument is an executable, set it as the executable 405 // in the launch options. Don't resolve the file path as the path 406 // could be a remote platform path 407 const bool resolve = false; 408 m_executable.SetFile(first_arg, resolve); 409 } 410 } 411 } 412 void 413 ProcessInfo::SetArguments (const Args& args, bool first_arg_is_executable) 414 { 415 // Copy all arguments 416 m_arguments = args; 417 418 // Is the first argument the executable? 419 if (first_arg_is_executable) 420 { 421 const char *first_arg = m_arguments.GetArgumentAtIndex (0); 422 if (first_arg) 423 { 424 // Yes the first argument is an executable, set it as the executable 425 // in the launch options. Don't resolve the file path as the path 426 // could be a remote platform path 427 const bool resolve = false; 428 m_executable.SetFile(first_arg, resolve); 429 } 430 } 431 } 432 433 void 434 ProcessLaunchInfo::FinalizeFileActions (Target *target, bool default_to_use_pty) 435 { 436 // If notthing was specified, then check the process for any default 437 // settings that were set with "settings set" 438 if (m_file_actions.empty()) 439 { 440 if (m_flags.Test(eLaunchFlagDisableSTDIO)) 441 { 442 AppendSuppressFileAction (STDIN_FILENO , true, false); 443 AppendSuppressFileAction (STDOUT_FILENO, false, true); 444 AppendSuppressFileAction (STDERR_FILENO, false, true); 445 } 446 else 447 { 448 // Check for any values that might have gotten set with any of: 449 // (lldb) settings set target.input-path 450 // (lldb) settings set target.output-path 451 // (lldb) settings set target.error-path 452 FileSpec in_path; 453 FileSpec out_path; 454 FileSpec err_path; 455 if (target) 456 { 457 in_path = target->GetStandardInputPath(); 458 out_path = target->GetStandardOutputPath(); 459 err_path = target->GetStandardErrorPath(); 460 } 461 462 if (in_path || out_path || err_path) 463 { 464 char path[PATH_MAX]; 465 if (in_path && in_path.GetPath(path, sizeof(path))) 466 AppendOpenFileAction(STDIN_FILENO, path, true, false); 467 468 if (out_path && out_path.GetPath(path, sizeof(path))) 469 AppendOpenFileAction(STDOUT_FILENO, path, false, true); 470 471 if (err_path && err_path.GetPath(path, sizeof(path))) 472 AppendOpenFileAction(STDERR_FILENO, path, false, true); 473 } 474 else if (default_to_use_pty) 475 { 476 if (m_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0)) 477 { 478 const char *slave_path = m_pty.GetSlaveName (NULL, 0); 479 AppendOpenFileAction(STDIN_FILENO, slave_path, true, false); 480 AppendOpenFileAction(STDOUT_FILENO, slave_path, false, true); 481 AppendOpenFileAction(STDERR_FILENO, slave_path, false, true); 482 } 483 } 484 } 485 } 486 } 487 488 489 bool 490 ProcessLaunchInfo::ConvertArgumentsForLaunchingInShell (Error &error, 491 bool localhost, 492 bool will_debug, 493 bool first_arg_is_full_shell_command, 494 int32_t num_resumes) 495 { 496 error.Clear(); 497 498 if (GetFlags().Test (eLaunchFlagLaunchInShell)) 499 { 500 const char *shell_executable = GetShell(); 501 if (shell_executable) 502 { 503 char shell_resolved_path[PATH_MAX]; 504 505 if (localhost) 506 { 507 FileSpec shell_filespec (shell_executable, true); 508 509 if (!shell_filespec.Exists()) 510 { 511 // Resolve the path in case we just got "bash", "sh" or "tcsh" 512 if (!shell_filespec.ResolveExecutableLocation ()) 513 { 514 error.SetErrorStringWithFormat("invalid shell path '%s'", shell_executable); 515 return false; 516 } 517 } 518 shell_filespec.GetPath (shell_resolved_path, sizeof(shell_resolved_path)); 519 shell_executable = shell_resolved_path; 520 } 521 522 const char **argv = GetArguments().GetConstArgumentVector (); 523 if (argv == NULL || argv[0] == NULL) 524 return false; 525 Args shell_arguments; 526 std::string safe_arg; 527 shell_arguments.AppendArgument (shell_executable); 528 shell_arguments.AppendArgument ("-c"); 529 StreamString shell_command; 530 if (will_debug) 531 { 532 // Add a modified PATH environment variable in case argv[0] 533 // is a relative path 534 const char *argv0 = argv[0]; 535 if (argv0 && (argv0[0] != '/' && argv0[0] != '~')) 536 { 537 // We have a relative path to our executable which may not work if 538 // we just try to run "a.out" (without it being converted to "./a.out") 539 const char *working_dir = GetWorkingDirectory(); 540 // Be sure to put quotes around PATH's value in case any paths have spaces... 541 std::string new_path("PATH=\""); 542 const size_t empty_path_len = new_path.size(); 543 544 if (working_dir && working_dir[0]) 545 { 546 new_path += working_dir; 547 } 548 else 549 { 550 char current_working_dir[PATH_MAX]; 551 const char *cwd = getcwd(current_working_dir, sizeof(current_working_dir)); 552 if (cwd && cwd[0]) 553 new_path += cwd; 554 } 555 const char *curr_path = getenv("PATH"); 556 if (curr_path) 557 { 558 if (new_path.size() > empty_path_len) 559 new_path += ':'; 560 new_path += curr_path; 561 } 562 new_path += "\" "; 563 shell_command.PutCString(new_path.c_str()); 564 } 565 566 shell_command.PutCString ("exec"); 567 568 // Only Apple supports /usr/bin/arch being able to specify the architecture 569 if (GetArchitecture().IsValid()) 570 { 571 shell_command.Printf(" /usr/bin/arch -arch %s", GetArchitecture().GetArchitectureName()); 572 // Set the resume count to 2: 573 // 1 - stop in shell 574 // 2 - stop in /usr/bin/arch 575 // 3 - then we will stop in our program 576 SetResumeCount(num_resumes + 1); 577 } 578 else 579 { 580 // Set the resume count to 1: 581 // 1 - stop in shell 582 // 2 - then we will stop in our program 583 SetResumeCount(num_resumes); 584 } 585 } 586 587 if (first_arg_is_full_shell_command) 588 { 589 // There should only be one argument that is the shell command itself to be used as is 590 if (argv[0] && !argv[1]) 591 shell_command.Printf("%s", argv[0]); 592 else 593 return false; 594 } 595 else 596 { 597 for (size_t i=0; argv[i] != NULL; ++i) 598 { 599 const char *arg = Args::GetShellSafeArgument (argv[i], safe_arg); 600 shell_command.Printf(" %s", arg); 601 } 602 } 603 shell_arguments.AppendArgument (shell_command.GetString().c_str()); 604 m_executable.SetFile(shell_executable, false); 605 m_arguments = shell_arguments; 606 return true; 607 } 608 else 609 { 610 error.SetErrorString ("invalid shell path"); 611 } 612 } 613 else 614 { 615 error.SetErrorString ("not launching in shell"); 616 } 617 return false; 618 } 619 620 621 bool 622 ProcessLaunchInfo::FileAction::Open (int fd, const char *path, bool read, bool write) 623 { 624 if ((read || write) && fd >= 0 && path && path[0]) 625 { 626 m_action = eFileActionOpen; 627 m_fd = fd; 628 if (read && write) 629 m_arg = O_NOCTTY | O_CREAT | O_RDWR; 630 else if (read) 631 m_arg = O_NOCTTY | O_RDONLY; 632 else 633 m_arg = O_NOCTTY | O_CREAT | O_WRONLY; 634 m_path.assign (path); 635 return true; 636 } 637 else 638 { 639 Clear(); 640 } 641 return false; 642 } 643 644 bool 645 ProcessLaunchInfo::FileAction::Close (int fd) 646 { 647 Clear(); 648 if (fd >= 0) 649 { 650 m_action = eFileActionClose; 651 m_fd = fd; 652 } 653 return m_fd >= 0; 654 } 655 656 657 bool 658 ProcessLaunchInfo::FileAction::Duplicate (int fd, int dup_fd) 659 { 660 Clear(); 661 if (fd >= 0 && dup_fd >= 0) 662 { 663 m_action = eFileActionDuplicate; 664 m_fd = fd; 665 m_arg = dup_fd; 666 } 667 return m_fd >= 0; 668 } 669 670 671 672 #ifndef LLDB_DISABLE_POSIX 673 bool 674 ProcessLaunchInfo::FileAction::AddPosixSpawnFileAction (void *_file_actions, 675 const FileAction *info, 676 Log *log, 677 Error& error) 678 { 679 if (info == NULL) 680 return false; 681 682 posix_spawn_file_actions_t *file_actions = reinterpret_cast<posix_spawn_file_actions_t *>(_file_actions); 683 684 switch (info->m_action) 685 { 686 case eFileActionNone: 687 error.Clear(); 688 break; 689 690 case eFileActionClose: 691 if (info->m_fd == -1) 692 error.SetErrorString ("invalid fd for posix_spawn_file_actions_addclose(...)"); 693 else 694 { 695 error.SetError (::posix_spawn_file_actions_addclose (file_actions, info->m_fd), 696 eErrorTypePOSIX); 697 if (log && (error.Fail() || log)) 698 error.PutToLog(log, "posix_spawn_file_actions_addclose (action=%p, fd=%i)", 699 file_actions, info->m_fd); 700 } 701 break; 702 703 case eFileActionDuplicate: 704 if (info->m_fd == -1) 705 error.SetErrorString ("invalid fd for posix_spawn_file_actions_adddup2(...)"); 706 else if (info->m_arg == -1) 707 error.SetErrorString ("invalid duplicate fd for posix_spawn_file_actions_adddup2(...)"); 708 else 709 { 710 error.SetError (::posix_spawn_file_actions_adddup2 (file_actions, info->m_fd, info->m_arg), 711 eErrorTypePOSIX); 712 if (log && (error.Fail() || log)) 713 error.PutToLog(log, "posix_spawn_file_actions_adddup2 (action=%p, fd=%i, dup_fd=%i)", 714 file_actions, info->m_fd, info->m_arg); 715 } 716 break; 717 718 case eFileActionOpen: 719 if (info->m_fd == -1) 720 error.SetErrorString ("invalid fd in posix_spawn_file_actions_addopen(...)"); 721 else 722 { 723 int oflag = info->m_arg; 724 725 mode_t mode = 0; 726 727 if (oflag & O_CREAT) 728 mode = 0640; 729 730 error.SetError (::posix_spawn_file_actions_addopen (file_actions, 731 info->m_fd, 732 info->m_path.c_str(), 733 oflag, 734 mode), 735 eErrorTypePOSIX); 736 if (error.Fail() || log) 737 error.PutToLog(log, 738 "posix_spawn_file_actions_addopen (action=%p, fd=%i, path='%s', oflag=%i, mode=%i)", 739 file_actions, info->m_fd, info->m_path.c_str(), oflag, mode); 740 } 741 break; 742 } 743 return error.Success(); 744 } 745 #endif 746 747 Error 748 ProcessLaunchCommandOptions::SetOptionValue (uint32_t option_idx, const char *option_arg) 749 { 750 Error error; 751 const int short_option = m_getopt_table[option_idx].val; 752 753 switch (short_option) 754 { 755 case 's': // Stop at program entry point 756 launch_info.GetFlags().Set (eLaunchFlagStopAtEntry); 757 break; 758 759 case 'i': // STDIN for read only 760 { 761 ProcessLaunchInfo::FileAction action; 762 if (action.Open (STDIN_FILENO, option_arg, true, false)) 763 launch_info.AppendFileAction (action); 764 } 765 break; 766 767 case 'o': // Open STDOUT for write only 768 { 769 ProcessLaunchInfo::FileAction action; 770 if (action.Open (STDOUT_FILENO, option_arg, false, true)) 771 launch_info.AppendFileAction (action); 772 } 773 break; 774 775 case 'e': // STDERR for write only 776 { 777 ProcessLaunchInfo::FileAction action; 778 if (action.Open (STDERR_FILENO, option_arg, false, true)) 779 launch_info.AppendFileAction (action); 780 } 781 break; 782 783 784 case 'p': // Process plug-in name 785 launch_info.SetProcessPluginName (option_arg); 786 break; 787 788 case 'n': // Disable STDIO 789 { 790 ProcessLaunchInfo::FileAction action; 791 if (action.Open (STDIN_FILENO, "/dev/null", true, false)) 792 launch_info.AppendFileAction (action); 793 if (action.Open (STDOUT_FILENO, "/dev/null", false, true)) 794 launch_info.AppendFileAction (action); 795 if (action.Open (STDERR_FILENO, "/dev/null", false, true)) 796 launch_info.AppendFileAction (action); 797 } 798 break; 799 800 case 'w': 801 launch_info.SetWorkingDirectory (option_arg); 802 break; 803 804 case 't': // Open process in new terminal window 805 launch_info.GetFlags().Set (eLaunchFlagLaunchInTTY); 806 break; 807 808 case 'a': 809 if (!launch_info.GetArchitecture().SetTriple (option_arg, m_interpreter.GetPlatform(true).get())) 810 launch_info.GetArchitecture().SetTriple (option_arg); 811 break; 812 813 case 'A': 814 launch_info.GetFlags().Set (eLaunchFlagDisableASLR); 815 break; 816 817 case 'c': 818 if (option_arg && option_arg[0]) 819 launch_info.SetShell (option_arg); 820 else 821 launch_info.SetShell (LLDB_DEFAULT_SHELL); 822 break; 823 824 case 'v': 825 launch_info.GetEnvironmentEntries().AppendArgument(option_arg); 826 break; 827 828 default: 829 error.SetErrorStringWithFormat("unrecognized short option character '%c'", short_option); 830 break; 831 832 } 833 return error; 834 } 835 836 OptionDefinition 837 ProcessLaunchCommandOptions::g_option_table[] = 838 { 839 { LLDB_OPT_SET_ALL, false, "stop-at-entry", 's', OptionParser::eNoArgument, NULL, 0, eArgTypeNone, "Stop at the entry point of the program when launching a process."}, 840 { LLDB_OPT_SET_ALL, false, "disable-aslr", 'A', OptionParser::eNoArgument, NULL, 0, eArgTypeNone, "Disable address space layout randomization when launching a process."}, 841 { LLDB_OPT_SET_ALL, false, "plugin", 'p', OptionParser::eRequiredArgument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."}, 842 { LLDB_OPT_SET_ALL, false, "working-dir", 'w', OptionParser::eRequiredArgument, NULL, 0, eArgTypeDirectoryName, "Set the current working directory to <path> when running the inferior."}, 843 { LLDB_OPT_SET_ALL, false, "arch", 'a', OptionParser::eRequiredArgument, NULL, 0, eArgTypeArchitecture, "Set the architecture for the process to launch when ambiguous."}, 844 { LLDB_OPT_SET_ALL, false, "environment", 'v', OptionParser::eRequiredArgument, NULL, 0, eArgTypeNone, "Specify an environment variable name/value string (--environment NAME=VALUE). Can be specified multiple times for subsequent environment entries."}, 845 { LLDB_OPT_SET_ALL, false, "shell", 'c', OptionParser::eOptionalArgument, NULL, 0, eArgTypeFilename, "Run the process in a shell (not supported on all platforms)."}, 846 847 { LLDB_OPT_SET_1 , false, "stdin", 'i', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename, "Redirect stdin for the process to <filename>."}, 848 { LLDB_OPT_SET_1 , false, "stdout", 'o', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename, "Redirect stdout for the process to <filename>."}, 849 { LLDB_OPT_SET_1 , false, "stderr", 'e', OptionParser::eRequiredArgument, NULL, 0, eArgTypeFilename, "Redirect stderr for the process to <filename>."}, 850 851 { LLDB_OPT_SET_2 , false, "tty", 't', OptionParser::eNoArgument, NULL, 0, eArgTypeNone, "Start the process in a terminal (not supported on all platforms)."}, 852 853 { LLDB_OPT_SET_3 , false, "no-stdio", 'n', OptionParser::eNoArgument, NULL, 0, eArgTypeNone, "Do not set up for terminal I/O to go to running process."}, 854 855 { 0 , false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 856 }; 857 858 859 860 bool 861 ProcessInstanceInfoMatch::NameMatches (const char *process_name) const 862 { 863 if (m_name_match_type == eNameMatchIgnore || process_name == NULL) 864 return true; 865 const char *match_name = m_match_info.GetName(); 866 if (!match_name) 867 return true; 868 869 return lldb_private::NameMatches (process_name, m_name_match_type, match_name); 870 } 871 872 bool 873 ProcessInstanceInfoMatch::Matches (const ProcessInstanceInfo &proc_info) const 874 { 875 if (!NameMatches (proc_info.GetName())) 876 return false; 877 878 if (m_match_info.ProcessIDIsValid() && 879 m_match_info.GetProcessID() != proc_info.GetProcessID()) 880 return false; 881 882 if (m_match_info.ParentProcessIDIsValid() && 883 m_match_info.GetParentProcessID() != proc_info.GetParentProcessID()) 884 return false; 885 886 if (m_match_info.UserIDIsValid () && 887 m_match_info.GetUserID() != proc_info.GetUserID()) 888 return false; 889 890 if (m_match_info.GroupIDIsValid () && 891 m_match_info.GetGroupID() != proc_info.GetGroupID()) 892 return false; 893 894 if (m_match_info.EffectiveUserIDIsValid () && 895 m_match_info.GetEffectiveUserID() != proc_info.GetEffectiveUserID()) 896 return false; 897 898 if (m_match_info.EffectiveGroupIDIsValid () && 899 m_match_info.GetEffectiveGroupID() != proc_info.GetEffectiveGroupID()) 900 return false; 901 902 if (m_match_info.GetArchitecture().IsValid() && 903 !m_match_info.GetArchitecture().IsCompatibleMatch(proc_info.GetArchitecture())) 904 return false; 905 return true; 906 } 907 908 bool 909 ProcessInstanceInfoMatch::MatchAllProcesses () const 910 { 911 if (m_name_match_type != eNameMatchIgnore) 912 return false; 913 914 if (m_match_info.ProcessIDIsValid()) 915 return false; 916 917 if (m_match_info.ParentProcessIDIsValid()) 918 return false; 919 920 if (m_match_info.UserIDIsValid ()) 921 return false; 922 923 if (m_match_info.GroupIDIsValid ()) 924 return false; 925 926 if (m_match_info.EffectiveUserIDIsValid ()) 927 return false; 928 929 if (m_match_info.EffectiveGroupIDIsValid ()) 930 return false; 931 932 if (m_match_info.GetArchitecture().IsValid()) 933 return false; 934 935 if (m_match_all_users) 936 return false; 937 938 return true; 939 940 } 941 942 void 943 ProcessInstanceInfoMatch::Clear() 944 { 945 m_match_info.Clear(); 946 m_name_match_type = eNameMatchIgnore; 947 m_match_all_users = false; 948 } 949 950 ProcessSP 951 Process::FindPlugin (Target &target, const char *plugin_name, Listener &listener, const FileSpec *crash_file_path) 952 { 953 static uint32_t g_process_unique_id = 0; 954 955 ProcessSP process_sp; 956 ProcessCreateInstance create_callback = NULL; 957 if (plugin_name) 958 { 959 ConstString const_plugin_name(plugin_name); 960 create_callback = PluginManager::GetProcessCreateCallbackForPluginName (const_plugin_name); 961 if (create_callback) 962 { 963 process_sp = create_callback(target, listener, crash_file_path); 964 if (process_sp) 965 { 966 if (process_sp->CanDebug(target, true)) 967 { 968 process_sp->m_process_unique_id = ++g_process_unique_id; 969 } 970 else 971 process_sp.reset(); 972 } 973 } 974 } 975 else 976 { 977 for (uint32_t idx = 0; (create_callback = PluginManager::GetProcessCreateCallbackAtIndex(idx)) != NULL; ++idx) 978 { 979 process_sp = create_callback(target, listener, crash_file_path); 980 if (process_sp) 981 { 982 if (process_sp->CanDebug(target, false)) 983 { 984 process_sp->m_process_unique_id = ++g_process_unique_id; 985 break; 986 } 987 else 988 process_sp.reset(); 989 } 990 } 991 } 992 return process_sp; 993 } 994 995 ConstString & 996 Process::GetStaticBroadcasterClass () 997 { 998 static ConstString class_name ("lldb.process"); 999 return class_name; 1000 } 1001 1002 //---------------------------------------------------------------------- 1003 // Process constructor 1004 //---------------------------------------------------------------------- 1005 Process::Process(Target &target, Listener &listener) : 1006 ProcessProperties (false), 1007 UserID (LLDB_INVALID_PROCESS_ID), 1008 Broadcaster (&(target.GetDebugger()), "lldb.process"), 1009 m_target (target), 1010 m_public_state (eStateUnloaded), 1011 m_private_state (eStateUnloaded), 1012 m_private_state_broadcaster (NULL, "lldb.process.internal_state_broadcaster"), 1013 m_private_state_control_broadcaster (NULL, "lldb.process.internal_state_control_broadcaster"), 1014 m_private_state_listener ("lldb.process.internal_state_listener"), 1015 m_private_state_control_wait(), 1016 m_private_state_thread (LLDB_INVALID_HOST_THREAD), 1017 m_mod_id (), 1018 m_process_unique_id(0), 1019 m_thread_index_id (0), 1020 m_queue_index_id (0), 1021 m_thread_id_to_index_id_map (), 1022 m_queue_id_to_index_id_map (), 1023 m_exit_status (-1), 1024 m_exit_string (), 1025 m_thread_mutex (Mutex::eMutexTypeRecursive), 1026 m_thread_list_real (this), 1027 m_thread_list (this), 1028 m_extended_thread_list (this), 1029 m_extended_thread_stop_id (0), 1030 m_queue_list (this), 1031 m_queue_list_stop_id (0), 1032 m_notifications (), 1033 m_image_tokens (), 1034 m_listener (listener), 1035 m_breakpoint_site_list (), 1036 m_dynamic_checkers_ap (), 1037 m_unix_signals (), 1038 m_abi_sp (), 1039 m_process_input_reader (), 1040 m_stdio_communication ("process.stdio"), 1041 m_stdio_communication_mutex (Mutex::eMutexTypeRecursive), 1042 m_stdout_data (), 1043 m_stderr_data (), 1044 m_profile_data_comm_mutex (Mutex::eMutexTypeRecursive), 1045 m_profile_data (), 1046 m_memory_cache (*this), 1047 m_allocated_memory_cache (*this), 1048 m_should_detach (false), 1049 m_next_event_action_ap(), 1050 m_public_run_lock (), 1051 m_private_run_lock (), 1052 m_currently_handling_event(false), 1053 m_finalize_called(false), 1054 m_clear_thread_plans_on_stop (false), 1055 m_last_broadcast_state (eStateInvalid), 1056 m_destroy_in_process (false), 1057 m_can_jit(eCanJITDontKnow) 1058 { 1059 CheckInWithManager (); 1060 1061 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 1062 if (log) 1063 log->Printf ("%p Process::Process()", this); 1064 1065 SetEventName (eBroadcastBitStateChanged, "state-changed"); 1066 SetEventName (eBroadcastBitInterrupt, "interrupt"); 1067 SetEventName (eBroadcastBitSTDOUT, "stdout-available"); 1068 SetEventName (eBroadcastBitSTDERR, "stderr-available"); 1069 SetEventName (eBroadcastBitProfileData, "profile-data-available"); 1070 1071 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlStop , "control-stop" ); 1072 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlPause , "control-pause" ); 1073 m_private_state_control_broadcaster.SetEventName (eBroadcastInternalStateControlResume, "control-resume"); 1074 1075 listener.StartListeningForEvents (this, 1076 eBroadcastBitStateChanged | 1077 eBroadcastBitInterrupt | 1078 eBroadcastBitSTDOUT | 1079 eBroadcastBitSTDERR | 1080 eBroadcastBitProfileData); 1081 1082 m_private_state_listener.StartListeningForEvents(&m_private_state_broadcaster, 1083 eBroadcastBitStateChanged | 1084 eBroadcastBitInterrupt); 1085 1086 m_private_state_listener.StartListeningForEvents(&m_private_state_control_broadcaster, 1087 eBroadcastInternalStateControlStop | 1088 eBroadcastInternalStateControlPause | 1089 eBroadcastInternalStateControlResume); 1090 } 1091 1092 //---------------------------------------------------------------------- 1093 // Destructor 1094 //---------------------------------------------------------------------- 1095 Process::~Process() 1096 { 1097 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 1098 if (log) 1099 log->Printf ("%p Process::~Process()", this); 1100 StopPrivateStateThread(); 1101 } 1102 1103 const ProcessPropertiesSP & 1104 Process::GetGlobalProperties() 1105 { 1106 static ProcessPropertiesSP g_settings_sp; 1107 if (!g_settings_sp) 1108 g_settings_sp.reset (new ProcessProperties (true)); 1109 return g_settings_sp; 1110 } 1111 1112 void 1113 Process::Finalize() 1114 { 1115 switch (GetPrivateState()) 1116 { 1117 case eStateConnected: 1118 case eStateAttaching: 1119 case eStateLaunching: 1120 case eStateStopped: 1121 case eStateRunning: 1122 case eStateStepping: 1123 case eStateCrashed: 1124 case eStateSuspended: 1125 if (GetShouldDetach()) 1126 { 1127 // FIXME: This will have to be a process setting: 1128 bool keep_stopped = false; 1129 Detach(keep_stopped); 1130 } 1131 else 1132 Destroy(); 1133 break; 1134 1135 case eStateInvalid: 1136 case eStateUnloaded: 1137 case eStateDetached: 1138 case eStateExited: 1139 break; 1140 } 1141 1142 // Clear our broadcaster before we proceed with destroying 1143 Broadcaster::Clear(); 1144 1145 // Do any cleanup needed prior to being destructed... Subclasses 1146 // that override this method should call this superclass method as well. 1147 1148 // We need to destroy the loader before the derived Process class gets destroyed 1149 // since it is very likely that undoing the loader will require access to the real process. 1150 m_dynamic_checkers_ap.reset(); 1151 m_abi_sp.reset(); 1152 m_os_ap.reset(); 1153 m_system_runtime_ap.reset(); 1154 m_dyld_ap.reset(); 1155 m_thread_list_real.Destroy(); 1156 m_thread_list.Destroy(); 1157 m_extended_thread_list.Destroy(); 1158 m_queue_list.Clear(); 1159 m_queue_list_stop_id = 0; 1160 std::vector<Notifications> empty_notifications; 1161 m_notifications.swap(empty_notifications); 1162 m_image_tokens.clear(); 1163 m_memory_cache.Clear(); 1164 m_allocated_memory_cache.Clear(); 1165 m_language_runtimes.clear(); 1166 m_next_event_action_ap.reset(); 1167 //#ifdef LLDB_CONFIGURATION_DEBUG 1168 // StreamFile s(stdout, false); 1169 // EventSP event_sp; 1170 // while (m_private_state_listener.GetNextEvent(event_sp)) 1171 // { 1172 // event_sp->Dump (&s); 1173 // s.EOL(); 1174 // } 1175 //#endif 1176 // We have to be very careful here as the m_private_state_listener might 1177 // contain events that have ProcessSP values in them which can keep this 1178 // process around forever. These events need to be cleared out. 1179 m_private_state_listener.Clear(); 1180 m_public_run_lock.TrySetRunning(); // This will do nothing if already locked 1181 m_public_run_lock.SetStopped(); 1182 m_private_run_lock.TrySetRunning(); // This will do nothing if already locked 1183 m_private_run_lock.SetStopped(); 1184 m_finalize_called = true; 1185 } 1186 1187 void 1188 Process::RegisterNotificationCallbacks (const Notifications& callbacks) 1189 { 1190 m_notifications.push_back(callbacks); 1191 if (callbacks.initialize != NULL) 1192 callbacks.initialize (callbacks.baton, this); 1193 } 1194 1195 bool 1196 Process::UnregisterNotificationCallbacks(const Notifications& callbacks) 1197 { 1198 std::vector<Notifications>::iterator pos, end = m_notifications.end(); 1199 for (pos = m_notifications.begin(); pos != end; ++pos) 1200 { 1201 if (pos->baton == callbacks.baton && 1202 pos->initialize == callbacks.initialize && 1203 pos->process_state_changed == callbacks.process_state_changed) 1204 { 1205 m_notifications.erase(pos); 1206 return true; 1207 } 1208 } 1209 return false; 1210 } 1211 1212 void 1213 Process::SynchronouslyNotifyStateChanged (StateType state) 1214 { 1215 std::vector<Notifications>::iterator notification_pos, notification_end = m_notifications.end(); 1216 for (notification_pos = m_notifications.begin(); notification_pos != notification_end; ++notification_pos) 1217 { 1218 if (notification_pos->process_state_changed) 1219 notification_pos->process_state_changed (notification_pos->baton, this, state); 1220 } 1221 } 1222 1223 // FIXME: We need to do some work on events before the general Listener sees them. 1224 // For instance if we are continuing from a breakpoint, we need to ensure that we do 1225 // the little "insert real insn, step & stop" trick. But we can't do that when the 1226 // event is delivered by the broadcaster - since that is done on the thread that is 1227 // waiting for new events, so if we needed more than one event for our handling, we would 1228 // stall. So instead we do it when we fetch the event off of the queue. 1229 // 1230 1231 StateType 1232 Process::GetNextEvent (EventSP &event_sp) 1233 { 1234 StateType state = eStateInvalid; 1235 1236 if (m_listener.GetNextEventForBroadcaster (this, event_sp) && event_sp) 1237 state = Process::ProcessEventData::GetStateFromEvent (event_sp.get()); 1238 1239 return state; 1240 } 1241 1242 1243 StateType 1244 Process::WaitForProcessToStop (const TimeValue *timeout, lldb::EventSP *event_sp_ptr, bool wait_always) 1245 { 1246 // We can't just wait for a "stopped" event, because the stopped event may have restarted the target. 1247 // We have to actually check each event, and in the case of a stopped event check the restarted flag 1248 // on the event. 1249 if (event_sp_ptr) 1250 event_sp_ptr->reset(); 1251 StateType state = GetState(); 1252 // If we are exited or detached, we won't ever get back to any 1253 // other valid state... 1254 if (state == eStateDetached || state == eStateExited) 1255 return state; 1256 1257 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1258 if (log) 1259 log->Printf ("Process::%s (timeout = %p)", __FUNCTION__, timeout); 1260 1261 if (!wait_always && 1262 StateIsStoppedState(state, true) && 1263 StateIsStoppedState(GetPrivateState(), true)) { 1264 if (log) 1265 log->Printf("Process::%s returning without waiting for events; process private and public states are already 'stopped'.", 1266 __FUNCTION__); 1267 return state; 1268 } 1269 1270 while (state != eStateInvalid) 1271 { 1272 EventSP event_sp; 1273 state = WaitForStateChangedEvents (timeout, event_sp); 1274 if (event_sp_ptr && event_sp) 1275 *event_sp_ptr = event_sp; 1276 1277 switch (state) 1278 { 1279 case eStateCrashed: 1280 case eStateDetached: 1281 case eStateExited: 1282 case eStateUnloaded: 1283 return state; 1284 case eStateStopped: 1285 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 1286 continue; 1287 else 1288 return state; 1289 default: 1290 continue; 1291 } 1292 } 1293 return state; 1294 } 1295 1296 1297 StateType 1298 Process::WaitForState 1299 ( 1300 const TimeValue *timeout, 1301 const StateType *match_states, const uint32_t num_match_states 1302 ) 1303 { 1304 EventSP event_sp; 1305 uint32_t i; 1306 StateType state = GetState(); 1307 while (state != eStateInvalid) 1308 { 1309 // If we are exited or detached, we won't ever get back to any 1310 // other valid state... 1311 if (state == eStateDetached || state == eStateExited) 1312 return state; 1313 1314 state = WaitForStateChangedEvents (timeout, event_sp); 1315 1316 for (i=0; i<num_match_states; ++i) 1317 { 1318 if (match_states[i] == state) 1319 return state; 1320 } 1321 } 1322 return state; 1323 } 1324 1325 bool 1326 Process::HijackProcessEvents (Listener *listener) 1327 { 1328 if (listener != NULL) 1329 { 1330 return HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt); 1331 } 1332 else 1333 return false; 1334 } 1335 1336 void 1337 Process::RestoreProcessEvents () 1338 { 1339 RestoreBroadcaster(); 1340 } 1341 1342 bool 1343 Process::HijackPrivateProcessEvents (Listener *listener) 1344 { 1345 if (listener != NULL) 1346 { 1347 return m_private_state_broadcaster.HijackBroadcaster(listener, eBroadcastBitStateChanged | eBroadcastBitInterrupt); 1348 } 1349 else 1350 return false; 1351 } 1352 1353 void 1354 Process::RestorePrivateProcessEvents () 1355 { 1356 m_private_state_broadcaster.RestoreBroadcaster(); 1357 } 1358 1359 StateType 1360 Process::WaitForStateChangedEvents (const TimeValue *timeout, EventSP &event_sp) 1361 { 1362 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1363 1364 if (log) 1365 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 1366 1367 StateType state = eStateInvalid; 1368 if (m_listener.WaitForEventForBroadcasterWithType (timeout, 1369 this, 1370 eBroadcastBitStateChanged | eBroadcastBitInterrupt, 1371 event_sp)) 1372 { 1373 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged) 1374 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 1375 else if (log) 1376 log->Printf ("Process::%s got no event or was interrupted.", __FUNCTION__); 1377 } 1378 1379 if (log) 1380 log->Printf ("Process::%s (timeout = %p, event_sp) => %s", 1381 __FUNCTION__, 1382 timeout, 1383 StateAsCString(state)); 1384 return state; 1385 } 1386 1387 Event * 1388 Process::PeekAtStateChangedEvents () 1389 { 1390 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1391 1392 if (log) 1393 log->Printf ("Process::%s...", __FUNCTION__); 1394 1395 Event *event_ptr; 1396 event_ptr = m_listener.PeekAtNextEventForBroadcasterWithType (this, 1397 eBroadcastBitStateChanged); 1398 if (log) 1399 { 1400 if (event_ptr) 1401 { 1402 log->Printf ("Process::%s (event_ptr) => %s", 1403 __FUNCTION__, 1404 StateAsCString(ProcessEventData::GetStateFromEvent (event_ptr))); 1405 } 1406 else 1407 { 1408 log->Printf ("Process::%s no events found", 1409 __FUNCTION__); 1410 } 1411 } 1412 return event_ptr; 1413 } 1414 1415 StateType 1416 Process::WaitForStateChangedEventsPrivate (const TimeValue *timeout, EventSP &event_sp) 1417 { 1418 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1419 1420 if (log) 1421 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 1422 1423 StateType state = eStateInvalid; 1424 if (m_private_state_listener.WaitForEventForBroadcasterWithType (timeout, 1425 &m_private_state_broadcaster, 1426 eBroadcastBitStateChanged | eBroadcastBitInterrupt, 1427 event_sp)) 1428 if (event_sp && event_sp->GetType() == eBroadcastBitStateChanged) 1429 state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 1430 1431 // This is a bit of a hack, but when we wait here we could very well return 1432 // to the command-line, and that could disable the log, which would render the 1433 // log we got above invalid. 1434 if (log) 1435 { 1436 if (state == eStateInvalid) 1437 log->Printf ("Process::%s (timeout = %p, event_sp) => TIMEOUT", __FUNCTION__, timeout); 1438 else 1439 log->Printf ("Process::%s (timeout = %p, event_sp) => %s", __FUNCTION__, timeout, StateAsCString(state)); 1440 } 1441 return state; 1442 } 1443 1444 bool 1445 Process::WaitForEventsPrivate (const TimeValue *timeout, EventSP &event_sp, bool control_only) 1446 { 1447 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 1448 1449 if (log) 1450 log->Printf ("Process::%s (timeout = %p, event_sp)...", __FUNCTION__, timeout); 1451 1452 if (control_only) 1453 return m_private_state_listener.WaitForEventForBroadcaster(timeout, &m_private_state_control_broadcaster, event_sp); 1454 else 1455 return m_private_state_listener.WaitForEvent(timeout, event_sp); 1456 } 1457 1458 bool 1459 Process::IsRunning () const 1460 { 1461 return StateIsRunningState (m_public_state.GetValue()); 1462 } 1463 1464 int 1465 Process::GetExitStatus () 1466 { 1467 if (m_public_state.GetValue() == eStateExited) 1468 return m_exit_status; 1469 return -1; 1470 } 1471 1472 1473 const char * 1474 Process::GetExitDescription () 1475 { 1476 if (m_public_state.GetValue() == eStateExited && !m_exit_string.empty()) 1477 return m_exit_string.c_str(); 1478 return NULL; 1479 } 1480 1481 bool 1482 Process::SetExitStatus (int status, const char *cstr) 1483 { 1484 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1485 if (log) 1486 log->Printf("Process::SetExitStatus (status=%i (0x%8.8x), description=%s%s%s)", 1487 status, status, 1488 cstr ? "\"" : "", 1489 cstr ? cstr : "NULL", 1490 cstr ? "\"" : ""); 1491 1492 // We were already in the exited state 1493 if (m_private_state.GetValue() == eStateExited) 1494 { 1495 if (log) 1496 log->Printf("Process::SetExitStatus () ignoring exit status because state was already set to eStateExited"); 1497 return false; 1498 } 1499 1500 m_exit_status = status; 1501 if (cstr) 1502 m_exit_string = cstr; 1503 else 1504 m_exit_string.clear(); 1505 1506 DidExit (); 1507 1508 SetPrivateState (eStateExited); 1509 return true; 1510 } 1511 1512 // This static callback can be used to watch for local child processes on 1513 // the current host. The the child process exits, the process will be 1514 // found in the global target list (we want to be completely sure that the 1515 // lldb_private::Process doesn't go away before we can deliver the signal. 1516 bool 1517 Process::SetProcessExitStatus (void *callback_baton, 1518 lldb::pid_t pid, 1519 bool exited, 1520 int signo, // Zero for no signal 1521 int exit_status // Exit value of process if signal is zero 1522 ) 1523 { 1524 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS)); 1525 if (log) 1526 log->Printf ("Process::SetProcessExitStatus (baton=%p, pid=%" PRIu64 ", exited=%i, signal=%i, exit_status=%i)\n", 1527 callback_baton, 1528 pid, 1529 exited, 1530 signo, 1531 exit_status); 1532 1533 if (exited) 1534 { 1535 TargetSP target_sp(Debugger::FindTargetWithProcessID (pid)); 1536 if (target_sp) 1537 { 1538 ProcessSP process_sp (target_sp->GetProcessSP()); 1539 if (process_sp) 1540 { 1541 const char *signal_cstr = NULL; 1542 if (signo) 1543 signal_cstr = process_sp->GetUnixSignals().GetSignalAsCString (signo); 1544 1545 process_sp->SetExitStatus (exit_status, signal_cstr); 1546 } 1547 } 1548 return true; 1549 } 1550 return false; 1551 } 1552 1553 1554 void 1555 Process::UpdateThreadListIfNeeded () 1556 { 1557 const uint32_t stop_id = GetStopID(); 1558 if (m_thread_list.GetSize(false) == 0 || stop_id != m_thread_list.GetStopID()) 1559 { 1560 const StateType state = GetPrivateState(); 1561 if (StateIsStoppedState (state, true)) 1562 { 1563 Mutex::Locker locker (m_thread_list.GetMutex ()); 1564 // m_thread_list does have its own mutex, but we need to 1565 // hold onto the mutex between the call to UpdateThreadList(...) 1566 // and the os->UpdateThreadList(...) so it doesn't change on us 1567 ThreadList &old_thread_list = m_thread_list; 1568 ThreadList real_thread_list(this); 1569 ThreadList new_thread_list(this); 1570 // Always update the thread list with the protocol specific 1571 // thread list, but only update if "true" is returned 1572 if (UpdateThreadList (m_thread_list_real, real_thread_list)) 1573 { 1574 // Don't call into the OperatingSystem to update the thread list if we are shutting down, since 1575 // that may call back into the SBAPI's, requiring the API lock which is already held by whoever is 1576 // shutting us down, causing a deadlock. 1577 if (!m_destroy_in_process) 1578 { 1579 OperatingSystem *os = GetOperatingSystem (); 1580 if (os) 1581 { 1582 // Clear any old backing threads where memory threads might have been 1583 // backed by actual threads from the lldb_private::Process subclass 1584 size_t num_old_threads = old_thread_list.GetSize(false); 1585 for (size_t i=0; i<num_old_threads; ++i) 1586 old_thread_list.GetThreadAtIndex(i, false)->ClearBackingThread(); 1587 1588 // Now let the OperatingSystem plug-in update the thread list 1589 os->UpdateThreadList (old_thread_list, // Old list full of threads created by OS plug-in 1590 real_thread_list, // The actual thread list full of threads created by each lldb_private::Process subclass 1591 new_thread_list); // The new thread list that we will show to the user that gets filled in 1592 } 1593 else 1594 { 1595 // No OS plug-in, the new thread list is the same as the real thread list 1596 new_thread_list = real_thread_list; 1597 } 1598 } 1599 1600 m_thread_list_real.Update(real_thread_list); 1601 m_thread_list.Update (new_thread_list); 1602 m_thread_list.SetStopID (stop_id); 1603 1604 if (GetLastNaturalStopID () != m_extended_thread_stop_id) 1605 { 1606 // Clear any extended threads that we may have accumulated previously 1607 m_extended_thread_list.Clear(); 1608 m_extended_thread_stop_id = GetLastNaturalStopID (); 1609 1610 m_queue_list.Clear(); 1611 m_queue_list_stop_id = GetLastNaturalStopID (); 1612 } 1613 } 1614 } 1615 } 1616 } 1617 1618 void 1619 Process::UpdateQueueListIfNeeded () 1620 { 1621 if (m_system_runtime_ap.get()) 1622 { 1623 if (m_queue_list.GetSize() == 0 || m_queue_list_stop_id != GetLastNaturalStopID()) 1624 { 1625 const StateType state = GetPrivateState(); 1626 if (StateIsStoppedState (state, true)) 1627 { 1628 m_system_runtime_ap->PopulateQueueList (m_queue_list); 1629 m_queue_list_stop_id = GetLastNaturalStopID(); 1630 } 1631 } 1632 } 1633 } 1634 1635 ThreadSP 1636 Process::CreateOSPluginThread (lldb::tid_t tid, lldb::addr_t context) 1637 { 1638 OperatingSystem *os = GetOperatingSystem (); 1639 if (os) 1640 return os->CreateThread(tid, context); 1641 return ThreadSP(); 1642 } 1643 1644 uint32_t 1645 Process::GetNextThreadIndexID (uint64_t thread_id) 1646 { 1647 return AssignIndexIDToThread(thread_id); 1648 } 1649 1650 bool 1651 Process::HasAssignedIndexIDToThread(uint64_t thread_id) 1652 { 1653 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id); 1654 if (iterator == m_thread_id_to_index_id_map.end()) 1655 { 1656 return false; 1657 } 1658 else 1659 { 1660 return true; 1661 } 1662 } 1663 1664 uint32_t 1665 Process::AssignIndexIDToThread(uint64_t thread_id) 1666 { 1667 uint32_t result = 0; 1668 std::map<uint64_t, uint32_t>::iterator iterator = m_thread_id_to_index_id_map.find(thread_id); 1669 if (iterator == m_thread_id_to_index_id_map.end()) 1670 { 1671 result = ++m_thread_index_id; 1672 m_thread_id_to_index_id_map[thread_id] = result; 1673 } 1674 else 1675 { 1676 result = iterator->second; 1677 } 1678 1679 return result; 1680 } 1681 1682 bool 1683 Process::HasAssignedIndexIDToQueue(queue_id_t queue_id) 1684 { 1685 std::map<uint64_t, uint32_t>::iterator iterator = m_queue_id_to_index_id_map.find(queue_id); 1686 if (iterator == m_queue_id_to_index_id_map.end()) 1687 { 1688 return false; 1689 } 1690 else 1691 { 1692 return true; 1693 } 1694 } 1695 1696 uint32_t 1697 Process::AssignIndexIDToQueue(queue_id_t queue_id) 1698 { 1699 uint32_t result = 0; 1700 std::map<uint64_t, uint32_t>::iterator iterator = m_queue_id_to_index_id_map.find(queue_id); 1701 if (iterator == m_queue_id_to_index_id_map.end()) 1702 { 1703 result = ++m_queue_index_id; 1704 m_queue_id_to_index_id_map[queue_id] = result; 1705 } 1706 else 1707 { 1708 result = iterator->second; 1709 } 1710 1711 return result; 1712 } 1713 1714 1715 StateType 1716 Process::GetState() 1717 { 1718 // If any other threads access this we will need a mutex for it 1719 return m_public_state.GetValue (); 1720 } 1721 1722 void 1723 Process::SetPublicState (StateType new_state, bool restarted) 1724 { 1725 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1726 if (log) 1727 log->Printf("Process::SetPublicState (state = %s, restarted = %i)", StateAsCString(new_state), restarted); 1728 const StateType old_state = m_public_state.GetValue(); 1729 m_public_state.SetValue (new_state); 1730 1731 // On the transition from Run to Stopped, we unlock the writer end of the 1732 // run lock. The lock gets locked in Resume, which is the public API 1733 // to tell the program to run. 1734 if (!IsHijackedForEvent(eBroadcastBitStateChanged)) 1735 { 1736 if (new_state == eStateDetached) 1737 { 1738 if (log) 1739 log->Printf("Process::SetPublicState (%s) -- unlocking run lock for detach", StateAsCString(new_state)); 1740 m_public_run_lock.SetStopped(); 1741 } 1742 else 1743 { 1744 const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 1745 const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 1746 if ((old_state_is_stopped != new_state_is_stopped)) 1747 { 1748 if (new_state_is_stopped && !restarted) 1749 { 1750 if (log) 1751 log->Printf("Process::SetPublicState (%s) -- unlocking run lock", StateAsCString(new_state)); 1752 m_public_run_lock.SetStopped(); 1753 } 1754 } 1755 } 1756 } 1757 } 1758 1759 Error 1760 Process::Resume () 1761 { 1762 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1763 if (log) 1764 log->Printf("Process::Resume -- locking run lock"); 1765 if (!m_public_run_lock.TrySetRunning()) 1766 { 1767 Error error("Resume request failed - process still running."); 1768 if (log) 1769 log->Printf ("Process::Resume: -- TrySetRunning failed, not resuming."); 1770 return error; 1771 } 1772 return PrivateResume(); 1773 } 1774 1775 StateType 1776 Process::GetPrivateState () 1777 { 1778 return m_private_state.GetValue(); 1779 } 1780 1781 void 1782 Process::SetPrivateState (StateType new_state) 1783 { 1784 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STATE | LIBLLDB_LOG_PROCESS)); 1785 bool state_changed = false; 1786 1787 if (log) 1788 log->Printf("Process::SetPrivateState (%s)", StateAsCString(new_state)); 1789 1790 Mutex::Locker thread_locker(m_thread_list.GetMutex()); 1791 Mutex::Locker locker(m_private_state.GetMutex()); 1792 1793 const StateType old_state = m_private_state.GetValueNoLock (); 1794 state_changed = old_state != new_state; 1795 1796 const bool old_state_is_stopped = StateIsStoppedState(old_state, false); 1797 const bool new_state_is_stopped = StateIsStoppedState(new_state, false); 1798 if (old_state_is_stopped != new_state_is_stopped) 1799 { 1800 if (new_state_is_stopped) 1801 m_private_run_lock.SetStopped(); 1802 else 1803 m_private_run_lock.SetRunning(); 1804 } 1805 1806 if (state_changed) 1807 { 1808 m_private_state.SetValueNoLock (new_state); 1809 if (StateIsStoppedState(new_state, false)) 1810 { 1811 // Note, this currently assumes that all threads in the list 1812 // stop when the process stops. In the future we will want to 1813 // support a debugging model where some threads continue to run 1814 // while others are stopped. When that happens we will either need 1815 // a way for the thread list to identify which threads are stopping 1816 // or create a special thread list containing only threads which 1817 // actually stopped. 1818 // 1819 // The process plugin is responsible for managing the actual 1820 // behavior of the threads and should have stopped any threads 1821 // that are going to stop before we get here. 1822 m_thread_list.DidStop(); 1823 1824 m_mod_id.BumpStopID(); 1825 m_memory_cache.Clear(); 1826 if (log) 1827 log->Printf("Process::SetPrivateState (%s) stop_id = %u", StateAsCString(new_state), m_mod_id.GetStopID()); 1828 } 1829 // Use our target to get a shared pointer to ourselves... 1830 if (m_finalize_called && PrivateStateThreadIsValid() == false) 1831 BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state)); 1832 else 1833 m_private_state_broadcaster.BroadcastEvent (eBroadcastBitStateChanged, new ProcessEventData (shared_from_this(), new_state)); 1834 } 1835 else 1836 { 1837 if (log) 1838 log->Printf("Process::SetPrivateState (%s) state didn't change. Ignoring...", StateAsCString(new_state)); 1839 } 1840 } 1841 1842 void 1843 Process::SetRunningUserExpression (bool on) 1844 { 1845 m_mod_id.SetRunningUserExpression (on); 1846 } 1847 1848 addr_t 1849 Process::GetImageInfoAddress() 1850 { 1851 return LLDB_INVALID_ADDRESS; 1852 } 1853 1854 //---------------------------------------------------------------------- 1855 // LoadImage 1856 // 1857 // This function provides a default implementation that works for most 1858 // unix variants. Any Process subclasses that need to do shared library 1859 // loading differently should override LoadImage and UnloadImage and 1860 // do what is needed. 1861 //---------------------------------------------------------------------- 1862 uint32_t 1863 Process::LoadImage (const FileSpec &image_spec, Error &error) 1864 { 1865 char path[PATH_MAX]; 1866 image_spec.GetPath(path, sizeof(path)); 1867 1868 DynamicLoader *loader = GetDynamicLoader(); 1869 if (loader) 1870 { 1871 error = loader->CanLoadImage(); 1872 if (error.Fail()) 1873 return LLDB_INVALID_IMAGE_TOKEN; 1874 } 1875 1876 if (error.Success()) 1877 { 1878 ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 1879 1880 if (thread_sp) 1881 { 1882 StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 1883 1884 if (frame_sp) 1885 { 1886 ExecutionContext exe_ctx; 1887 frame_sp->CalculateExecutionContext (exe_ctx); 1888 EvaluateExpressionOptions expr_options; 1889 expr_options.SetUnwindOnError(true); 1890 expr_options.SetIgnoreBreakpoints(true); 1891 expr_options.SetExecutionPolicy(eExecutionPolicyAlways); 1892 StreamString expr; 1893 expr.Printf("dlopen (\"%s\", 2)", path); 1894 const char *prefix = "extern \"C\" void* dlopen (const char *path, int mode);\n"; 1895 lldb::ValueObjectSP result_valobj_sp; 1896 Error expr_error; 1897 ClangUserExpression::Evaluate (exe_ctx, 1898 expr_options, 1899 expr.GetData(), 1900 prefix, 1901 result_valobj_sp, 1902 expr_error); 1903 if (expr_error.Success()) 1904 { 1905 error = result_valobj_sp->GetError(); 1906 if (error.Success()) 1907 { 1908 Scalar scalar; 1909 if (result_valobj_sp->ResolveValue (scalar)) 1910 { 1911 addr_t image_ptr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1912 if (image_ptr != 0 && image_ptr != LLDB_INVALID_ADDRESS) 1913 { 1914 uint32_t image_token = m_image_tokens.size(); 1915 m_image_tokens.push_back (image_ptr); 1916 return image_token; 1917 } 1918 } 1919 } 1920 } 1921 } 1922 } 1923 } 1924 if (!error.AsCString()) 1925 error.SetErrorStringWithFormat("unable to load '%s'", path); 1926 return LLDB_INVALID_IMAGE_TOKEN; 1927 } 1928 1929 //---------------------------------------------------------------------- 1930 // UnloadImage 1931 // 1932 // This function provides a default implementation that works for most 1933 // unix variants. Any Process subclasses that need to do shared library 1934 // loading differently should override LoadImage and UnloadImage and 1935 // do what is needed. 1936 //---------------------------------------------------------------------- 1937 Error 1938 Process::UnloadImage (uint32_t image_token) 1939 { 1940 Error error; 1941 if (image_token < m_image_tokens.size()) 1942 { 1943 const addr_t image_addr = m_image_tokens[image_token]; 1944 if (image_addr == LLDB_INVALID_ADDRESS) 1945 { 1946 error.SetErrorString("image already unloaded"); 1947 } 1948 else 1949 { 1950 DynamicLoader *loader = GetDynamicLoader(); 1951 if (loader) 1952 error = loader->CanLoadImage(); 1953 1954 if (error.Success()) 1955 { 1956 ThreadSP thread_sp(GetThreadList ().GetSelectedThread()); 1957 1958 if (thread_sp) 1959 { 1960 StackFrameSP frame_sp (thread_sp->GetStackFrameAtIndex (0)); 1961 1962 if (frame_sp) 1963 { 1964 ExecutionContext exe_ctx; 1965 frame_sp->CalculateExecutionContext (exe_ctx); 1966 EvaluateExpressionOptions expr_options; 1967 expr_options.SetUnwindOnError(true); 1968 expr_options.SetIgnoreBreakpoints(true); 1969 expr_options.SetExecutionPolicy(eExecutionPolicyAlways); 1970 StreamString expr; 1971 expr.Printf("dlclose ((void *)0x%" PRIx64 ")", image_addr); 1972 const char *prefix = "extern \"C\" int dlclose(void* handle);\n"; 1973 lldb::ValueObjectSP result_valobj_sp; 1974 Error expr_error; 1975 ClangUserExpression::Evaluate (exe_ctx, 1976 expr_options, 1977 expr.GetData(), 1978 prefix, 1979 result_valobj_sp, 1980 expr_error); 1981 if (result_valobj_sp->GetError().Success()) 1982 { 1983 Scalar scalar; 1984 if (result_valobj_sp->ResolveValue (scalar)) 1985 { 1986 if (scalar.UInt(1)) 1987 { 1988 error.SetErrorStringWithFormat("expression failed: \"%s\"", expr.GetData()); 1989 } 1990 else 1991 { 1992 m_image_tokens[image_token] = LLDB_INVALID_ADDRESS; 1993 } 1994 } 1995 } 1996 else 1997 { 1998 error = result_valobj_sp->GetError(); 1999 } 2000 } 2001 } 2002 } 2003 } 2004 } 2005 else 2006 { 2007 error.SetErrorString("invalid image token"); 2008 } 2009 return error; 2010 } 2011 2012 const lldb::ABISP & 2013 Process::GetABI() 2014 { 2015 if (!m_abi_sp) 2016 m_abi_sp = ABI::FindPlugin(m_target.GetArchitecture()); 2017 return m_abi_sp; 2018 } 2019 2020 LanguageRuntime * 2021 Process::GetLanguageRuntime(lldb::LanguageType language, bool retry_if_null) 2022 { 2023 LanguageRuntimeCollection::iterator pos; 2024 pos = m_language_runtimes.find (language); 2025 if (pos == m_language_runtimes.end() || (retry_if_null && !(*pos).second)) 2026 { 2027 lldb::LanguageRuntimeSP runtime_sp(LanguageRuntime::FindPlugin(this, language)); 2028 2029 m_language_runtimes[language] = runtime_sp; 2030 return runtime_sp.get(); 2031 } 2032 else 2033 return (*pos).second.get(); 2034 } 2035 2036 CPPLanguageRuntime * 2037 Process::GetCPPLanguageRuntime (bool retry_if_null) 2038 { 2039 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeC_plus_plus, retry_if_null); 2040 if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeC_plus_plus) 2041 return static_cast<CPPLanguageRuntime *> (runtime); 2042 return NULL; 2043 } 2044 2045 ObjCLanguageRuntime * 2046 Process::GetObjCLanguageRuntime (bool retry_if_null) 2047 { 2048 LanguageRuntime *runtime = GetLanguageRuntime(eLanguageTypeObjC, retry_if_null); 2049 if (runtime != NULL && runtime->GetLanguageType() == eLanguageTypeObjC) 2050 return static_cast<ObjCLanguageRuntime *> (runtime); 2051 return NULL; 2052 } 2053 2054 bool 2055 Process::IsPossibleDynamicValue (ValueObject& in_value) 2056 { 2057 if (in_value.IsDynamic()) 2058 return false; 2059 LanguageType known_type = in_value.GetObjectRuntimeLanguage(); 2060 2061 if (known_type != eLanguageTypeUnknown && known_type != eLanguageTypeC) 2062 { 2063 LanguageRuntime *runtime = GetLanguageRuntime (known_type); 2064 return runtime ? runtime->CouldHaveDynamicValue(in_value) : false; 2065 } 2066 2067 LanguageRuntime *cpp_runtime = GetLanguageRuntime (eLanguageTypeC_plus_plus); 2068 if (cpp_runtime && cpp_runtime->CouldHaveDynamicValue(in_value)) 2069 return true; 2070 2071 LanguageRuntime *objc_runtime = GetLanguageRuntime (eLanguageTypeObjC); 2072 return objc_runtime ? objc_runtime->CouldHaveDynamicValue(in_value) : false; 2073 } 2074 2075 BreakpointSiteList & 2076 Process::GetBreakpointSiteList() 2077 { 2078 return m_breakpoint_site_list; 2079 } 2080 2081 const BreakpointSiteList & 2082 Process::GetBreakpointSiteList() const 2083 { 2084 return m_breakpoint_site_list; 2085 } 2086 2087 2088 void 2089 Process::DisableAllBreakpointSites () 2090 { 2091 m_breakpoint_site_list.ForEach([this](BreakpointSite *bp_site) -> void { 2092 // bp_site->SetEnabled(true); 2093 DisableBreakpointSite(bp_site); 2094 }); 2095 } 2096 2097 Error 2098 Process::ClearBreakpointSiteByID (lldb::user_id_t break_id) 2099 { 2100 Error error (DisableBreakpointSiteByID (break_id)); 2101 2102 if (error.Success()) 2103 m_breakpoint_site_list.Remove(break_id); 2104 2105 return error; 2106 } 2107 2108 Error 2109 Process::DisableBreakpointSiteByID (lldb::user_id_t break_id) 2110 { 2111 Error error; 2112 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 2113 if (bp_site_sp) 2114 { 2115 if (bp_site_sp->IsEnabled()) 2116 error = DisableBreakpointSite (bp_site_sp.get()); 2117 } 2118 else 2119 { 2120 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id); 2121 } 2122 2123 return error; 2124 } 2125 2126 Error 2127 Process::EnableBreakpointSiteByID (lldb::user_id_t break_id) 2128 { 2129 Error error; 2130 BreakpointSiteSP bp_site_sp = m_breakpoint_site_list.FindByID (break_id); 2131 if (bp_site_sp) 2132 { 2133 if (!bp_site_sp->IsEnabled()) 2134 error = EnableBreakpointSite (bp_site_sp.get()); 2135 } 2136 else 2137 { 2138 error.SetErrorStringWithFormat("invalid breakpoint site ID: %" PRIu64, break_id); 2139 } 2140 return error; 2141 } 2142 2143 lldb::break_id_t 2144 Process::CreateBreakpointSite (const BreakpointLocationSP &owner, bool use_hardware) 2145 { 2146 const addr_t load_addr = owner->GetAddress().GetOpcodeLoadAddress (&m_target); 2147 if (load_addr != LLDB_INVALID_ADDRESS) 2148 { 2149 BreakpointSiteSP bp_site_sp; 2150 2151 // Look up this breakpoint site. If it exists, then add this new owner, otherwise 2152 // create a new breakpoint site and add it. 2153 2154 bp_site_sp = m_breakpoint_site_list.FindByAddress (load_addr); 2155 2156 if (bp_site_sp) 2157 { 2158 bp_site_sp->AddOwner (owner); 2159 owner->SetBreakpointSite (bp_site_sp); 2160 return bp_site_sp->GetID(); 2161 } 2162 else 2163 { 2164 bp_site_sp.reset (new BreakpointSite (&m_breakpoint_site_list, owner, load_addr, use_hardware)); 2165 if (bp_site_sp) 2166 { 2167 Error error = EnableBreakpointSite (bp_site_sp.get()); 2168 if (error.Success()) 2169 { 2170 owner->SetBreakpointSite (bp_site_sp); 2171 return m_breakpoint_site_list.Add (bp_site_sp); 2172 } 2173 else 2174 { 2175 bool show_error = true; 2176 switch (GetState()) 2177 { 2178 case eStateInvalid: 2179 case eStateUnloaded: 2180 case eStateConnected: 2181 case eStateAttaching: 2182 case eStateLaunching: 2183 case eStateDetached: 2184 case eStateExited: 2185 show_error = false; 2186 break; 2187 2188 case eStateStopped: 2189 case eStateRunning: 2190 case eStateStepping: 2191 case eStateCrashed: 2192 case eStateSuspended: 2193 show_error = IsAlive(); 2194 break; 2195 } 2196 2197 if (show_error) 2198 { 2199 // Report error for setting breakpoint... 2200 m_target.GetDebugger().GetErrorFile().Printf ("warning: failed to set breakpoint site at 0x%" PRIx64 " for breakpoint %i.%i: %s\n", 2201 load_addr, 2202 owner->GetBreakpoint().GetID(), 2203 owner->GetID(), 2204 error.AsCString() ? error.AsCString() : "unkown error"); 2205 } 2206 } 2207 } 2208 } 2209 } 2210 // We failed to enable the breakpoint 2211 return LLDB_INVALID_BREAK_ID; 2212 2213 } 2214 2215 void 2216 Process::RemoveOwnerFromBreakpointSite (lldb::user_id_t owner_id, lldb::user_id_t owner_loc_id, BreakpointSiteSP &bp_site_sp) 2217 { 2218 uint32_t num_owners = bp_site_sp->RemoveOwner (owner_id, owner_loc_id); 2219 if (num_owners == 0) 2220 { 2221 // Don't try to disable the site if we don't have a live process anymore. 2222 if (IsAlive()) 2223 DisableBreakpointSite (bp_site_sp.get()); 2224 m_breakpoint_site_list.RemoveByAddress(bp_site_sp->GetLoadAddress()); 2225 } 2226 } 2227 2228 2229 size_t 2230 Process::RemoveBreakpointOpcodesFromBuffer (addr_t bp_addr, size_t size, uint8_t *buf) const 2231 { 2232 size_t bytes_removed = 0; 2233 BreakpointSiteList bp_sites_in_range; 2234 2235 if (m_breakpoint_site_list.FindInRange (bp_addr, bp_addr + size, bp_sites_in_range)) 2236 { 2237 bp_sites_in_range.ForEach([bp_addr, size, buf, &bytes_removed](BreakpointSite *bp_site) -> void { 2238 if (bp_site->GetType() == BreakpointSite::eSoftware) 2239 { 2240 addr_t intersect_addr; 2241 size_t intersect_size; 2242 size_t opcode_offset; 2243 if (bp_site->IntersectsRange(bp_addr, size, &intersect_addr, &intersect_size, &opcode_offset)) 2244 { 2245 assert(bp_addr <= intersect_addr && intersect_addr < bp_addr + size); 2246 assert(bp_addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= bp_addr + size); 2247 assert(opcode_offset + intersect_size <= bp_site->GetByteSize()); 2248 size_t buf_offset = intersect_addr - bp_addr; 2249 ::memcpy(buf + buf_offset, bp_site->GetSavedOpcodeBytes() + opcode_offset, intersect_size); 2250 } 2251 } 2252 }); 2253 } 2254 return bytes_removed; 2255 } 2256 2257 2258 2259 size_t 2260 Process::GetSoftwareBreakpointTrapOpcode (BreakpointSite* bp_site) 2261 { 2262 PlatformSP platform_sp (m_target.GetPlatform()); 2263 if (platform_sp) 2264 return platform_sp->GetSoftwareBreakpointTrapOpcode (m_target, bp_site); 2265 return 0; 2266 } 2267 2268 Error 2269 Process::EnableSoftwareBreakpoint (BreakpointSite *bp_site) 2270 { 2271 Error error; 2272 assert (bp_site != NULL); 2273 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 2274 const addr_t bp_addr = bp_site->GetLoadAddress(); 2275 if (log) 2276 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64, bp_site->GetID(), (uint64_t)bp_addr); 2277 if (bp_site->IsEnabled()) 2278 { 2279 if (log) 2280 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already enabled", bp_site->GetID(), (uint64_t)bp_addr); 2281 return error; 2282 } 2283 2284 if (bp_addr == LLDB_INVALID_ADDRESS) 2285 { 2286 error.SetErrorString("BreakpointSite contains an invalid load address."); 2287 return error; 2288 } 2289 // Ask the lldb::Process subclass to fill in the correct software breakpoint 2290 // trap for the breakpoint site 2291 const size_t bp_opcode_size = GetSoftwareBreakpointTrapOpcode(bp_site); 2292 2293 if (bp_opcode_size == 0) 2294 { 2295 error.SetErrorStringWithFormat ("Process::GetSoftwareBreakpointTrapOpcode() returned zero, unable to get breakpoint trap for address 0x%" PRIx64, bp_addr); 2296 } 2297 else 2298 { 2299 const uint8_t * const bp_opcode_bytes = bp_site->GetTrapOpcodeBytes(); 2300 2301 if (bp_opcode_bytes == NULL) 2302 { 2303 error.SetErrorString ("BreakpointSite doesn't contain a valid breakpoint trap opcode."); 2304 return error; 2305 } 2306 2307 // Save the original opcode by reading it 2308 if (DoReadMemory(bp_addr, bp_site->GetSavedOpcodeBytes(), bp_opcode_size, error) == bp_opcode_size) 2309 { 2310 // Write a software breakpoint in place of the original opcode 2311 if (DoWriteMemory(bp_addr, bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 2312 { 2313 uint8_t verify_bp_opcode_bytes[64]; 2314 if (DoReadMemory(bp_addr, verify_bp_opcode_bytes, bp_opcode_size, error) == bp_opcode_size) 2315 { 2316 if (::memcmp(bp_opcode_bytes, verify_bp_opcode_bytes, bp_opcode_size) == 0) 2317 { 2318 bp_site->SetEnabled(true); 2319 bp_site->SetType (BreakpointSite::eSoftware); 2320 if (log) 2321 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", 2322 bp_site->GetID(), 2323 (uint64_t)bp_addr); 2324 } 2325 else 2326 error.SetErrorString("failed to verify the breakpoint trap in memory."); 2327 } 2328 else 2329 error.SetErrorString("Unable to read memory to verify breakpoint trap."); 2330 } 2331 else 2332 error.SetErrorString("Unable to write breakpoint trap to memory."); 2333 } 2334 else 2335 error.SetErrorString("Unable to read memory at breakpoint address."); 2336 } 2337 if (log && error.Fail()) 2338 log->Printf ("Process::EnableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s", 2339 bp_site->GetID(), 2340 (uint64_t)bp_addr, 2341 error.AsCString()); 2342 return error; 2343 } 2344 2345 Error 2346 Process::DisableSoftwareBreakpoint (BreakpointSite *bp_site) 2347 { 2348 Error error; 2349 assert (bp_site != NULL); 2350 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 2351 addr_t bp_addr = bp_site->GetLoadAddress(); 2352 lldb::user_id_t breakID = bp_site->GetID(); 2353 if (log) 2354 log->Printf ("Process::DisableSoftwareBreakpoint (breakID = %" PRIu64 ") addr = 0x%" PRIx64, breakID, (uint64_t)bp_addr); 2355 2356 if (bp_site->IsHardware()) 2357 { 2358 error.SetErrorString("Breakpoint site is a hardware breakpoint."); 2359 } 2360 else if (bp_site->IsEnabled()) 2361 { 2362 const size_t break_op_size = bp_site->GetByteSize(); 2363 const uint8_t * const break_op = bp_site->GetTrapOpcodeBytes(); 2364 if (break_op_size > 0) 2365 { 2366 // Clear a software breakoint instruction 2367 uint8_t curr_break_op[8]; 2368 assert (break_op_size <= sizeof(curr_break_op)); 2369 bool break_op_found = false; 2370 2371 // Read the breakpoint opcode 2372 if (DoReadMemory (bp_addr, curr_break_op, break_op_size, error) == break_op_size) 2373 { 2374 bool verify = false; 2375 // Make sure we have the a breakpoint opcode exists at this address 2376 if (::memcmp (curr_break_op, break_op, break_op_size) == 0) 2377 { 2378 break_op_found = true; 2379 // We found a valid breakpoint opcode at this address, now restore 2380 // the saved opcode. 2381 if (DoWriteMemory (bp_addr, bp_site->GetSavedOpcodeBytes(), break_op_size, error) == break_op_size) 2382 { 2383 verify = true; 2384 } 2385 else 2386 error.SetErrorString("Memory write failed when restoring original opcode."); 2387 } 2388 else 2389 { 2390 error.SetErrorString("Original breakpoint trap is no longer in memory."); 2391 // Set verify to true and so we can check if the original opcode has already been restored 2392 verify = true; 2393 } 2394 2395 if (verify) 2396 { 2397 uint8_t verify_opcode[8]; 2398 assert (break_op_size < sizeof(verify_opcode)); 2399 // Verify that our original opcode made it back to the inferior 2400 if (DoReadMemory (bp_addr, verify_opcode, break_op_size, error) == break_op_size) 2401 { 2402 // compare the memory we just read with the original opcode 2403 if (::memcmp (bp_site->GetSavedOpcodeBytes(), verify_opcode, break_op_size) == 0) 2404 { 2405 // SUCCESS 2406 bp_site->SetEnabled(false); 2407 if (log) 2408 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- SUCCESS", bp_site->GetID(), (uint64_t)bp_addr); 2409 return error; 2410 } 2411 else 2412 { 2413 if (break_op_found) 2414 error.SetErrorString("Failed to restore original opcode."); 2415 } 2416 } 2417 else 2418 error.SetErrorString("Failed to read memory to verify that breakpoint trap was restored."); 2419 } 2420 } 2421 else 2422 error.SetErrorString("Unable to read memory that should contain the breakpoint trap."); 2423 } 2424 } 2425 else 2426 { 2427 if (log) 2428 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- already disabled", bp_site->GetID(), (uint64_t)bp_addr); 2429 return error; 2430 } 2431 2432 if (log) 2433 log->Printf ("Process::DisableSoftwareBreakpoint (site_id = %d) addr = 0x%" PRIx64 " -- FAILED: %s", 2434 bp_site->GetID(), 2435 (uint64_t)bp_addr, 2436 error.AsCString()); 2437 return error; 2438 2439 } 2440 2441 // Uncomment to verify memory caching works after making changes to caching code 2442 //#define VERIFY_MEMORY_READS 2443 2444 size_t 2445 Process::ReadMemory (addr_t addr, void *buf, size_t size, Error &error) 2446 { 2447 error.Clear(); 2448 if (!GetDisableMemoryCache()) 2449 { 2450 #if defined (VERIFY_MEMORY_READS) 2451 // Memory caching is enabled, with debug verification 2452 2453 if (buf && size) 2454 { 2455 // Uncomment the line below to make sure memory caching is working. 2456 // I ran this through the test suite and got no assertions, so I am 2457 // pretty confident this is working well. If any changes are made to 2458 // memory caching, uncomment the line below and test your changes! 2459 2460 // Verify all memory reads by using the cache first, then redundantly 2461 // reading the same memory from the inferior and comparing to make sure 2462 // everything is exactly the same. 2463 std::string verify_buf (size, '\0'); 2464 assert (verify_buf.size() == size); 2465 const size_t cache_bytes_read = m_memory_cache.Read (this, addr, buf, size, error); 2466 Error verify_error; 2467 const size_t verify_bytes_read = ReadMemoryFromInferior (addr, const_cast<char *>(verify_buf.data()), verify_buf.size(), verify_error); 2468 assert (cache_bytes_read == verify_bytes_read); 2469 assert (memcmp(buf, verify_buf.data(), verify_buf.size()) == 0); 2470 assert (verify_error.Success() == error.Success()); 2471 return cache_bytes_read; 2472 } 2473 return 0; 2474 #else // !defined(VERIFY_MEMORY_READS) 2475 // Memory caching is enabled, without debug verification 2476 2477 return m_memory_cache.Read (addr, buf, size, error); 2478 #endif // defined (VERIFY_MEMORY_READS) 2479 } 2480 else 2481 { 2482 // Memory caching is disabled 2483 2484 return ReadMemoryFromInferior (addr, buf, size, error); 2485 } 2486 } 2487 2488 size_t 2489 Process::ReadCStringFromMemory (addr_t addr, std::string &out_str, Error &error) 2490 { 2491 char buf[256]; 2492 out_str.clear(); 2493 addr_t curr_addr = addr; 2494 while (1) 2495 { 2496 size_t length = ReadCStringFromMemory (curr_addr, buf, sizeof(buf), error); 2497 if (length == 0) 2498 break; 2499 out_str.append(buf, length); 2500 // If we got "length - 1" bytes, we didn't get the whole C string, we 2501 // need to read some more characters 2502 if (length == sizeof(buf) - 1) 2503 curr_addr += length; 2504 else 2505 break; 2506 } 2507 return out_str.size(); 2508 } 2509 2510 2511 size_t 2512 Process::ReadStringFromMemory (addr_t addr, char *dst, size_t max_bytes, Error &error, 2513 size_t type_width) 2514 { 2515 size_t total_bytes_read = 0; 2516 if (dst && max_bytes && type_width && max_bytes >= type_width) 2517 { 2518 // Ensure a null terminator independent of the number of bytes that is read. 2519 memset (dst, 0, max_bytes); 2520 size_t bytes_left = max_bytes - type_width; 2521 2522 const char terminator[4] = {'\0', '\0', '\0', '\0'}; 2523 assert(sizeof(terminator) >= type_width && 2524 "Attempting to validate a string with more than 4 bytes per character!"); 2525 2526 addr_t curr_addr = addr; 2527 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 2528 char *curr_dst = dst; 2529 2530 error.Clear(); 2531 while (bytes_left > 0 && error.Success()) 2532 { 2533 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 2534 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 2535 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 2536 2537 if (bytes_read == 0) 2538 break; 2539 2540 // Search for a null terminator of correct size and alignment in bytes_read 2541 size_t aligned_start = total_bytes_read - total_bytes_read % type_width; 2542 for (size_t i = aligned_start; i + type_width <= total_bytes_read + bytes_read; i += type_width) 2543 if (::strncmp(&dst[i], terminator, type_width) == 0) 2544 { 2545 error.Clear(); 2546 return i; 2547 } 2548 2549 total_bytes_read += bytes_read; 2550 curr_dst += bytes_read; 2551 curr_addr += bytes_read; 2552 bytes_left -= bytes_read; 2553 } 2554 } 2555 else 2556 { 2557 if (max_bytes) 2558 error.SetErrorString("invalid arguments"); 2559 } 2560 return total_bytes_read; 2561 } 2562 2563 // Deprecated in favor of ReadStringFromMemory which has wchar support and correct code to find 2564 // null terminators. 2565 size_t 2566 Process::ReadCStringFromMemory (addr_t addr, char *dst, size_t dst_max_len, Error &result_error) 2567 { 2568 size_t total_cstr_len = 0; 2569 if (dst && dst_max_len) 2570 { 2571 result_error.Clear(); 2572 // NULL out everything just to be safe 2573 memset (dst, 0, dst_max_len); 2574 Error error; 2575 addr_t curr_addr = addr; 2576 const size_t cache_line_size = m_memory_cache.GetMemoryCacheLineSize(); 2577 size_t bytes_left = dst_max_len - 1; 2578 char *curr_dst = dst; 2579 2580 while (bytes_left > 0) 2581 { 2582 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 2583 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 2584 size_t bytes_read = ReadMemory (curr_addr, curr_dst, bytes_to_read, error); 2585 2586 if (bytes_read == 0) 2587 { 2588 result_error = error; 2589 dst[total_cstr_len] = '\0'; 2590 break; 2591 } 2592 const size_t len = strlen(curr_dst); 2593 2594 total_cstr_len += len; 2595 2596 if (len < bytes_to_read) 2597 break; 2598 2599 curr_dst += bytes_read; 2600 curr_addr += bytes_read; 2601 bytes_left -= bytes_read; 2602 } 2603 } 2604 else 2605 { 2606 if (dst == NULL) 2607 result_error.SetErrorString("invalid arguments"); 2608 else 2609 result_error.Clear(); 2610 } 2611 return total_cstr_len; 2612 } 2613 2614 size_t 2615 Process::ReadMemoryFromInferior (addr_t addr, void *buf, size_t size, Error &error) 2616 { 2617 if (buf == NULL || size == 0) 2618 return 0; 2619 2620 size_t bytes_read = 0; 2621 uint8_t *bytes = (uint8_t *)buf; 2622 2623 while (bytes_read < size) 2624 { 2625 const size_t curr_size = size - bytes_read; 2626 const size_t curr_bytes_read = DoReadMemory (addr + bytes_read, 2627 bytes + bytes_read, 2628 curr_size, 2629 error); 2630 bytes_read += curr_bytes_read; 2631 if (curr_bytes_read == curr_size || curr_bytes_read == 0) 2632 break; 2633 } 2634 2635 // Replace any software breakpoint opcodes that fall into this range back 2636 // into "buf" before we return 2637 if (bytes_read > 0) 2638 RemoveBreakpointOpcodesFromBuffer (addr, bytes_read, (uint8_t *)buf); 2639 return bytes_read; 2640 } 2641 2642 uint64_t 2643 Process::ReadUnsignedIntegerFromMemory (lldb::addr_t vm_addr, size_t integer_byte_size, uint64_t fail_value, Error &error) 2644 { 2645 Scalar scalar; 2646 if (ReadScalarIntegerFromMemory(vm_addr, integer_byte_size, false, scalar, error)) 2647 return scalar.ULongLong(fail_value); 2648 return fail_value; 2649 } 2650 2651 addr_t 2652 Process::ReadPointerFromMemory (lldb::addr_t vm_addr, Error &error) 2653 { 2654 Scalar scalar; 2655 if (ReadScalarIntegerFromMemory(vm_addr, GetAddressByteSize(), false, scalar, error)) 2656 return scalar.ULongLong(LLDB_INVALID_ADDRESS); 2657 return LLDB_INVALID_ADDRESS; 2658 } 2659 2660 2661 bool 2662 Process::WritePointerToMemory (lldb::addr_t vm_addr, 2663 lldb::addr_t ptr_value, 2664 Error &error) 2665 { 2666 Scalar scalar; 2667 const uint32_t addr_byte_size = GetAddressByteSize(); 2668 if (addr_byte_size <= 4) 2669 scalar = (uint32_t)ptr_value; 2670 else 2671 scalar = ptr_value; 2672 return WriteScalarToMemory(vm_addr, scalar, addr_byte_size, error) == addr_byte_size; 2673 } 2674 2675 size_t 2676 Process::WriteMemoryPrivate (addr_t addr, const void *buf, size_t size, Error &error) 2677 { 2678 size_t bytes_written = 0; 2679 const uint8_t *bytes = (const uint8_t *)buf; 2680 2681 while (bytes_written < size) 2682 { 2683 const size_t curr_size = size - bytes_written; 2684 const size_t curr_bytes_written = DoWriteMemory (addr + bytes_written, 2685 bytes + bytes_written, 2686 curr_size, 2687 error); 2688 bytes_written += curr_bytes_written; 2689 if (curr_bytes_written == curr_size || curr_bytes_written == 0) 2690 break; 2691 } 2692 return bytes_written; 2693 } 2694 2695 size_t 2696 Process::WriteMemory (addr_t addr, const void *buf, size_t size, Error &error) 2697 { 2698 #if defined (ENABLE_MEMORY_CACHING) 2699 m_memory_cache.Flush (addr, size); 2700 #endif 2701 2702 if (buf == NULL || size == 0) 2703 return 0; 2704 2705 m_mod_id.BumpMemoryID(); 2706 2707 // We need to write any data that would go where any current software traps 2708 // (enabled software breakpoints) any software traps (breakpoints) that we 2709 // may have placed in our tasks memory. 2710 2711 BreakpointSiteList bp_sites_in_range; 2712 2713 if (m_breakpoint_site_list.FindInRange (addr, addr + size, bp_sites_in_range)) 2714 { 2715 // No breakpoint sites overlap 2716 if (bp_sites_in_range.IsEmpty()) 2717 return WriteMemoryPrivate (addr, buf, size, error); 2718 else 2719 { 2720 const uint8_t *ubuf = (const uint8_t *)buf; 2721 uint64_t bytes_written = 0; 2722 2723 bp_sites_in_range.ForEach([this, addr, size, &bytes_written, &ubuf, &error](BreakpointSite *bp) -> void { 2724 2725 if (error.Success()) 2726 { 2727 addr_t intersect_addr; 2728 size_t intersect_size; 2729 size_t opcode_offset; 2730 const bool intersects = bp->IntersectsRange(addr, size, &intersect_addr, &intersect_size, &opcode_offset); 2731 assert(intersects); 2732 assert(addr <= intersect_addr && intersect_addr < addr + size); 2733 assert(addr < intersect_addr + intersect_size && intersect_addr + intersect_size <= addr + size); 2734 assert(opcode_offset + intersect_size <= bp->GetByteSize()); 2735 2736 // Check for bytes before this breakpoint 2737 const addr_t curr_addr = addr + bytes_written; 2738 if (intersect_addr > curr_addr) 2739 { 2740 // There are some bytes before this breakpoint that we need to 2741 // just write to memory 2742 size_t curr_size = intersect_addr - curr_addr; 2743 size_t curr_bytes_written = WriteMemoryPrivate (curr_addr, 2744 ubuf + bytes_written, 2745 curr_size, 2746 error); 2747 bytes_written += curr_bytes_written; 2748 if (curr_bytes_written != curr_size) 2749 { 2750 // We weren't able to write all of the requested bytes, we 2751 // are done looping and will return the number of bytes that 2752 // we have written so far. 2753 if (error.Success()) 2754 error.SetErrorToGenericError(); 2755 } 2756 } 2757 // Now write any bytes that would cover up any software breakpoints 2758 // directly into the breakpoint opcode buffer 2759 ::memcpy(bp->GetSavedOpcodeBytes() + opcode_offset, ubuf + bytes_written, intersect_size); 2760 bytes_written += intersect_size; 2761 } 2762 }); 2763 2764 if (bytes_written < size) 2765 bytes_written += WriteMemoryPrivate (addr + bytes_written, 2766 ubuf + bytes_written, 2767 size - bytes_written, 2768 error); 2769 } 2770 } 2771 else 2772 { 2773 return WriteMemoryPrivate (addr, buf, size, error); 2774 } 2775 2776 // Write any remaining bytes after the last breakpoint if we have any left 2777 return 0; //bytes_written; 2778 } 2779 2780 size_t 2781 Process::WriteScalarToMemory (addr_t addr, const Scalar &scalar, size_t byte_size, Error &error) 2782 { 2783 if (byte_size == UINT32_MAX) 2784 byte_size = scalar.GetByteSize(); 2785 if (byte_size > 0) 2786 { 2787 uint8_t buf[32]; 2788 const size_t mem_size = scalar.GetAsMemoryData (buf, byte_size, GetByteOrder(), error); 2789 if (mem_size > 0) 2790 return WriteMemory(addr, buf, mem_size, error); 2791 else 2792 error.SetErrorString ("failed to get scalar as memory data"); 2793 } 2794 else 2795 { 2796 error.SetErrorString ("invalid scalar value"); 2797 } 2798 return 0; 2799 } 2800 2801 size_t 2802 Process::ReadScalarIntegerFromMemory (addr_t addr, 2803 uint32_t byte_size, 2804 bool is_signed, 2805 Scalar &scalar, 2806 Error &error) 2807 { 2808 uint64_t uval = 0; 2809 if (byte_size == 0) 2810 { 2811 error.SetErrorString ("byte size is zero"); 2812 } 2813 else if (byte_size & (byte_size - 1)) 2814 { 2815 error.SetErrorStringWithFormat ("byte size %u is not a power of 2", byte_size); 2816 } 2817 else if (byte_size <= sizeof(uval)) 2818 { 2819 const size_t bytes_read = ReadMemory (addr, &uval, byte_size, error); 2820 if (bytes_read == byte_size) 2821 { 2822 DataExtractor data (&uval, sizeof(uval), GetByteOrder(), GetAddressByteSize()); 2823 lldb::offset_t offset = 0; 2824 if (byte_size <= 4) 2825 scalar = data.GetMaxU32 (&offset, byte_size); 2826 else 2827 scalar = data.GetMaxU64 (&offset, byte_size); 2828 if (is_signed) 2829 scalar.SignExtend(byte_size * 8); 2830 return bytes_read; 2831 } 2832 } 2833 else 2834 { 2835 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 2836 } 2837 return 0; 2838 } 2839 2840 #define USE_ALLOCATE_MEMORY_CACHE 1 2841 addr_t 2842 Process::AllocateMemory(size_t size, uint32_t permissions, Error &error) 2843 { 2844 if (GetPrivateState() != eStateStopped) 2845 return LLDB_INVALID_ADDRESS; 2846 2847 #if defined (USE_ALLOCATE_MEMORY_CACHE) 2848 return m_allocated_memory_cache.AllocateMemory(size, permissions, error); 2849 #else 2850 addr_t allocated_addr = DoAllocateMemory (size, permissions, error); 2851 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2852 if (log) 2853 log->Printf("Process::AllocateMemory(size=%" PRIu64 ", permissions=%s) => 0x%16.16" PRIx64 " (m_stop_id = %u m_memory_id = %u)", 2854 (uint64_t)size, 2855 GetPermissionsAsCString (permissions), 2856 (uint64_t)allocated_addr, 2857 m_mod_id.GetStopID(), 2858 m_mod_id.GetMemoryID()); 2859 return allocated_addr; 2860 #endif 2861 } 2862 2863 bool 2864 Process::CanJIT () 2865 { 2866 if (m_can_jit == eCanJITDontKnow) 2867 { 2868 Error err; 2869 2870 uint64_t allocated_memory = AllocateMemory(8, 2871 ePermissionsReadable | ePermissionsWritable | ePermissionsExecutable, 2872 err); 2873 2874 if (err.Success()) 2875 m_can_jit = eCanJITYes; 2876 else 2877 m_can_jit = eCanJITNo; 2878 2879 DeallocateMemory (allocated_memory); 2880 } 2881 2882 return m_can_jit == eCanJITYes; 2883 } 2884 2885 void 2886 Process::SetCanJIT (bool can_jit) 2887 { 2888 m_can_jit = (can_jit ? eCanJITYes : eCanJITNo); 2889 } 2890 2891 Error 2892 Process::DeallocateMemory (addr_t ptr) 2893 { 2894 Error error; 2895 #if defined (USE_ALLOCATE_MEMORY_CACHE) 2896 if (!m_allocated_memory_cache.DeallocateMemory(ptr)) 2897 { 2898 error.SetErrorStringWithFormat ("deallocation of memory at 0x%" PRIx64 " failed.", (uint64_t)ptr); 2899 } 2900 #else 2901 error = DoDeallocateMemory (ptr); 2902 2903 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 2904 if (log) 2905 log->Printf("Process::DeallocateMemory(addr=0x%16.16" PRIx64 ") => err = %s (m_stop_id = %u, m_memory_id = %u)", 2906 ptr, 2907 error.AsCString("SUCCESS"), 2908 m_mod_id.GetStopID(), 2909 m_mod_id.GetMemoryID()); 2910 #endif 2911 return error; 2912 } 2913 2914 2915 ModuleSP 2916 Process::ReadModuleFromMemory (const FileSpec& file_spec, 2917 lldb::addr_t header_addr) 2918 { 2919 ModuleSP module_sp (new Module (file_spec, ArchSpec())); 2920 if (module_sp) 2921 { 2922 Error error; 2923 ObjectFile *objfile = module_sp->GetMemoryObjectFile (shared_from_this(), header_addr, error); 2924 if (objfile) 2925 return module_sp; 2926 } 2927 return ModuleSP(); 2928 } 2929 2930 Error 2931 Process::EnableWatchpoint (Watchpoint *watchpoint, bool notify) 2932 { 2933 Error error; 2934 error.SetErrorString("watchpoints are not supported"); 2935 return error; 2936 } 2937 2938 Error 2939 Process::DisableWatchpoint (Watchpoint *watchpoint, bool notify) 2940 { 2941 Error error; 2942 error.SetErrorString("watchpoints are not supported"); 2943 return error; 2944 } 2945 2946 StateType 2947 Process::WaitForProcessStopPrivate (const TimeValue *timeout, EventSP &event_sp) 2948 { 2949 StateType state; 2950 // Now wait for the process to launch and return control to us, and then 2951 // call DidLaunch: 2952 while (1) 2953 { 2954 event_sp.reset(); 2955 state = WaitForStateChangedEventsPrivate (timeout, event_sp); 2956 2957 if (StateIsStoppedState(state, false)) 2958 break; 2959 2960 // If state is invalid, then we timed out 2961 if (state == eStateInvalid) 2962 break; 2963 2964 if (event_sp) 2965 HandlePrivateEvent (event_sp); 2966 } 2967 return state; 2968 } 2969 2970 Error 2971 Process::Launch (ProcessLaunchInfo &launch_info) 2972 { 2973 Error error; 2974 m_abi_sp.reset(); 2975 m_dyld_ap.reset(); 2976 m_system_runtime_ap.reset(); 2977 m_os_ap.reset(); 2978 m_process_input_reader.reset(); 2979 2980 Module *exe_module = m_target.GetExecutableModulePointer(); 2981 if (exe_module) 2982 { 2983 char local_exec_file_path[PATH_MAX]; 2984 char platform_exec_file_path[PATH_MAX]; 2985 exe_module->GetFileSpec().GetPath(local_exec_file_path, sizeof(local_exec_file_path)); 2986 exe_module->GetPlatformFileSpec().GetPath(platform_exec_file_path, sizeof(platform_exec_file_path)); 2987 if (exe_module->GetFileSpec().Exists()) 2988 { 2989 // Install anything that might need to be installed prior to launching. 2990 // For host systems, this will do nothing, but if we are connected to a 2991 // remote platform it will install any needed binaries 2992 error = GetTarget().Install(&launch_info); 2993 if (error.Fail()) 2994 return error; 2995 2996 if (PrivateStateThreadIsValid ()) 2997 PausePrivateStateThread (); 2998 2999 error = WillLaunch (exe_module); 3000 if (error.Success()) 3001 { 3002 const bool restarted = false; 3003 SetPublicState (eStateLaunching, restarted); 3004 m_should_detach = false; 3005 3006 if (m_public_run_lock.TrySetRunning()) 3007 { 3008 // Now launch using these arguments. 3009 error = DoLaunch (exe_module, launch_info); 3010 } 3011 else 3012 { 3013 // This shouldn't happen 3014 error.SetErrorString("failed to acquire process run lock"); 3015 } 3016 3017 if (error.Fail()) 3018 { 3019 if (GetID() != LLDB_INVALID_PROCESS_ID) 3020 { 3021 SetID (LLDB_INVALID_PROCESS_ID); 3022 const char *error_string = error.AsCString(); 3023 if (error_string == NULL) 3024 error_string = "launch failed"; 3025 SetExitStatus (-1, error_string); 3026 } 3027 } 3028 else 3029 { 3030 EventSP event_sp; 3031 TimeValue timeout_time; 3032 timeout_time = TimeValue::Now(); 3033 timeout_time.OffsetWithSeconds(10); 3034 StateType state = WaitForProcessStopPrivate(&timeout_time, event_sp); 3035 3036 if (state == eStateInvalid || event_sp.get() == NULL) 3037 { 3038 // We were able to launch the process, but we failed to 3039 // catch the initial stop. 3040 SetExitStatus (0, "failed to catch stop after launch"); 3041 Destroy(); 3042 } 3043 else if (state == eStateStopped || state == eStateCrashed) 3044 { 3045 3046 DidLaunch (); 3047 3048 DynamicLoader *dyld = GetDynamicLoader (); 3049 if (dyld) 3050 dyld->DidLaunch(); 3051 3052 SystemRuntime *system_runtime = GetSystemRuntime (); 3053 if (system_runtime) 3054 system_runtime->DidLaunch(); 3055 3056 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 3057 // This delays passing the stopped event to listeners till DidLaunch gets 3058 // a chance to complete... 3059 HandlePrivateEvent (event_sp); 3060 3061 if (PrivateStateThreadIsValid ()) 3062 ResumePrivateStateThread (); 3063 else 3064 StartPrivateStateThread (); 3065 } 3066 else if (state == eStateExited) 3067 { 3068 // We exited while trying to launch somehow. Don't call DidLaunch as that's 3069 // not likely to work, and return an invalid pid. 3070 HandlePrivateEvent (event_sp); 3071 } 3072 } 3073 } 3074 } 3075 else 3076 { 3077 error.SetErrorStringWithFormat("file doesn't exist: '%s'", local_exec_file_path); 3078 } 3079 } 3080 return error; 3081 } 3082 3083 3084 Error 3085 Process::LoadCore () 3086 { 3087 Error error = DoLoadCore(); 3088 if (error.Success()) 3089 { 3090 if (PrivateStateThreadIsValid ()) 3091 ResumePrivateStateThread (); 3092 else 3093 StartPrivateStateThread (); 3094 3095 DynamicLoader *dyld = GetDynamicLoader (); 3096 if (dyld) 3097 dyld->DidAttach(); 3098 3099 SystemRuntime *system_runtime = GetSystemRuntime (); 3100 if (system_runtime) 3101 system_runtime->DidAttach(); 3102 3103 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 3104 // We successfully loaded a core file, now pretend we stopped so we can 3105 // show all of the threads in the core file and explore the crashed 3106 // state. 3107 SetPrivateState (eStateStopped); 3108 3109 } 3110 return error; 3111 } 3112 3113 DynamicLoader * 3114 Process::GetDynamicLoader () 3115 { 3116 if (m_dyld_ap.get() == NULL) 3117 m_dyld_ap.reset (DynamicLoader::FindPlugin(this, NULL)); 3118 return m_dyld_ap.get(); 3119 } 3120 3121 SystemRuntime * 3122 Process::GetSystemRuntime () 3123 { 3124 if (m_system_runtime_ap.get() == NULL) 3125 m_system_runtime_ap.reset (SystemRuntime::FindPlugin(this)); 3126 return m_system_runtime_ap.get(); 3127 } 3128 3129 3130 Process::NextEventAction::EventActionResult 3131 Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp) 3132 { 3133 StateType state = ProcessEventData::GetStateFromEvent (event_sp.get()); 3134 switch (state) 3135 { 3136 case eStateRunning: 3137 case eStateConnected: 3138 return eEventActionRetry; 3139 3140 case eStateStopped: 3141 case eStateCrashed: 3142 { 3143 // During attach, prior to sending the eStateStopped event, 3144 // lldb_private::Process subclasses must set the new process ID. 3145 assert (m_process->GetID() != LLDB_INVALID_PROCESS_ID); 3146 // We don't want these events to be reported, so go set the ShouldReportStop here: 3147 m_process->GetThreadList().SetShouldReportStop (eVoteNo); 3148 3149 if (m_exec_count > 0) 3150 { 3151 --m_exec_count; 3152 RequestResume(); 3153 return eEventActionRetry; 3154 } 3155 else 3156 { 3157 m_process->CompleteAttach (); 3158 return eEventActionSuccess; 3159 } 3160 } 3161 break; 3162 3163 default: 3164 case eStateExited: 3165 case eStateInvalid: 3166 break; 3167 } 3168 3169 m_exit_string.assign ("No valid Process"); 3170 return eEventActionExit; 3171 } 3172 3173 Process::NextEventAction::EventActionResult 3174 Process::AttachCompletionHandler::HandleBeingInterrupted() 3175 { 3176 return eEventActionSuccess; 3177 } 3178 3179 const char * 3180 Process::AttachCompletionHandler::GetExitString () 3181 { 3182 return m_exit_string.c_str(); 3183 } 3184 3185 Error 3186 Process::Attach (ProcessAttachInfo &attach_info) 3187 { 3188 m_abi_sp.reset(); 3189 m_process_input_reader.reset(); 3190 m_dyld_ap.reset(); 3191 m_system_runtime_ap.reset(); 3192 m_os_ap.reset(); 3193 3194 lldb::pid_t attach_pid = attach_info.GetProcessID(); 3195 Error error; 3196 if (attach_pid == LLDB_INVALID_PROCESS_ID) 3197 { 3198 char process_name[PATH_MAX]; 3199 3200 if (attach_info.GetExecutableFile().GetPath (process_name, sizeof(process_name))) 3201 { 3202 const bool wait_for_launch = attach_info.GetWaitForLaunch(); 3203 3204 if (wait_for_launch) 3205 { 3206 error = WillAttachToProcessWithName(process_name, wait_for_launch); 3207 if (error.Success()) 3208 { 3209 if (m_public_run_lock.TrySetRunning()) 3210 { 3211 m_should_detach = true; 3212 const bool restarted = false; 3213 SetPublicState (eStateAttaching, restarted); 3214 // Now attach using these arguments. 3215 error = DoAttachToProcessWithName (process_name, wait_for_launch, attach_info); 3216 } 3217 else 3218 { 3219 // This shouldn't happen 3220 error.SetErrorString("failed to acquire process run lock"); 3221 } 3222 3223 if (error.Fail()) 3224 { 3225 if (GetID() != LLDB_INVALID_PROCESS_ID) 3226 { 3227 SetID (LLDB_INVALID_PROCESS_ID); 3228 if (error.AsCString() == NULL) 3229 error.SetErrorString("attach failed"); 3230 3231 SetExitStatus(-1, error.AsCString()); 3232 } 3233 } 3234 else 3235 { 3236 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 3237 StartPrivateStateThread(); 3238 } 3239 return error; 3240 } 3241 } 3242 else 3243 { 3244 ProcessInstanceInfoList process_infos; 3245 PlatformSP platform_sp (m_target.GetPlatform ()); 3246 3247 if (platform_sp) 3248 { 3249 ProcessInstanceInfoMatch match_info; 3250 match_info.GetProcessInfo() = attach_info; 3251 match_info.SetNameMatchType (eNameMatchEquals); 3252 platform_sp->FindProcesses (match_info, process_infos); 3253 const uint32_t num_matches = process_infos.GetSize(); 3254 if (num_matches == 1) 3255 { 3256 attach_pid = process_infos.GetProcessIDAtIndex(0); 3257 // Fall through and attach using the above process ID 3258 } 3259 else 3260 { 3261 match_info.GetProcessInfo().GetExecutableFile().GetPath (process_name, sizeof(process_name)); 3262 if (num_matches > 1) 3263 error.SetErrorStringWithFormat ("more than one process named %s", process_name); 3264 else 3265 error.SetErrorStringWithFormat ("could not find a process named %s", process_name); 3266 } 3267 } 3268 else 3269 { 3270 error.SetErrorString ("invalid platform, can't find processes by name"); 3271 return error; 3272 } 3273 } 3274 } 3275 else 3276 { 3277 error.SetErrorString ("invalid process name"); 3278 } 3279 } 3280 3281 if (attach_pid != LLDB_INVALID_PROCESS_ID) 3282 { 3283 error = WillAttachToProcessWithID(attach_pid); 3284 if (error.Success()) 3285 { 3286 3287 if (m_public_run_lock.TrySetRunning()) 3288 { 3289 // Now attach using these arguments. 3290 m_should_detach = true; 3291 const bool restarted = false; 3292 SetPublicState (eStateAttaching, restarted); 3293 error = DoAttachToProcessWithID (attach_pid, attach_info); 3294 } 3295 else 3296 { 3297 // This shouldn't happen 3298 error.SetErrorString("failed to acquire process run lock"); 3299 } 3300 3301 if (error.Success()) 3302 { 3303 3304 SetNextEventAction(new Process::AttachCompletionHandler(this, attach_info.GetResumeCount())); 3305 StartPrivateStateThread(); 3306 } 3307 else 3308 { 3309 if (GetID() != LLDB_INVALID_PROCESS_ID) 3310 { 3311 SetID (LLDB_INVALID_PROCESS_ID); 3312 const char *error_string = error.AsCString(); 3313 if (error_string == NULL) 3314 error_string = "attach failed"; 3315 3316 SetExitStatus(-1, error_string); 3317 } 3318 } 3319 } 3320 } 3321 return error; 3322 } 3323 3324 void 3325 Process::CompleteAttach () 3326 { 3327 // Let the process subclass figure out at much as it can about the process 3328 // before we go looking for a dynamic loader plug-in. 3329 DidAttach(); 3330 3331 // We just attached. If we have a platform, ask it for the process architecture, and if it isn't 3332 // the same as the one we've already set, switch architectures. 3333 PlatformSP platform_sp (m_target.GetPlatform ()); 3334 assert (platform_sp.get()); 3335 if (platform_sp) 3336 { 3337 const ArchSpec &target_arch = m_target.GetArchitecture(); 3338 if (target_arch.IsValid() && !platform_sp->IsCompatibleArchitecture (target_arch, false, NULL)) 3339 { 3340 ArchSpec platform_arch; 3341 platform_sp = platform_sp->GetPlatformForArchitecture (target_arch, &platform_arch); 3342 if (platform_sp) 3343 { 3344 m_target.SetPlatform (platform_sp); 3345 m_target.SetArchitecture(platform_arch); 3346 } 3347 } 3348 else 3349 { 3350 ProcessInstanceInfo process_info; 3351 platform_sp->GetProcessInfo (GetID(), process_info); 3352 const ArchSpec &process_arch = process_info.GetArchitecture(); 3353 if (process_arch.IsValid() && !m_target.GetArchitecture().IsExactMatch(process_arch)) 3354 m_target.SetArchitecture (process_arch); 3355 } 3356 } 3357 3358 // We have completed the attach, now it is time to find the dynamic loader 3359 // plug-in 3360 DynamicLoader *dyld = GetDynamicLoader (); 3361 if (dyld) 3362 dyld->DidAttach(); 3363 3364 SystemRuntime *system_runtime = GetSystemRuntime (); 3365 if (system_runtime) 3366 system_runtime->DidAttach(); 3367 3368 m_os_ap.reset (OperatingSystem::FindPlugin (this, NULL)); 3369 // Figure out which one is the executable, and set that in our target: 3370 const ModuleList &target_modules = m_target.GetImages(); 3371 Mutex::Locker modules_locker(target_modules.GetMutex()); 3372 size_t num_modules = target_modules.GetSize(); 3373 ModuleSP new_executable_module_sp; 3374 3375 for (size_t i = 0; i < num_modules; i++) 3376 { 3377 ModuleSP module_sp (target_modules.GetModuleAtIndexUnlocked (i)); 3378 if (module_sp && module_sp->IsExecutable()) 3379 { 3380 if (m_target.GetExecutableModulePointer() != module_sp.get()) 3381 new_executable_module_sp = module_sp; 3382 break; 3383 } 3384 } 3385 if (new_executable_module_sp) 3386 m_target.SetExecutableModule (new_executable_module_sp, false); 3387 } 3388 3389 Error 3390 Process::ConnectRemote (Stream *strm, const char *remote_url) 3391 { 3392 m_abi_sp.reset(); 3393 m_process_input_reader.reset(); 3394 3395 // Find the process and its architecture. Make sure it matches the architecture 3396 // of the current Target, and if not adjust it. 3397 3398 Error error (DoConnectRemote (strm, remote_url)); 3399 if (error.Success()) 3400 { 3401 if (GetID() != LLDB_INVALID_PROCESS_ID) 3402 { 3403 EventSP event_sp; 3404 StateType state = WaitForProcessStopPrivate(NULL, event_sp); 3405 3406 if (state == eStateStopped || state == eStateCrashed) 3407 { 3408 // If we attached and actually have a process on the other end, then 3409 // this ended up being the equivalent of an attach. 3410 CompleteAttach (); 3411 3412 // This delays passing the stopped event to listeners till 3413 // CompleteAttach gets a chance to complete... 3414 HandlePrivateEvent (event_sp); 3415 3416 } 3417 } 3418 3419 if (PrivateStateThreadIsValid ()) 3420 ResumePrivateStateThread (); 3421 else 3422 StartPrivateStateThread (); 3423 } 3424 return error; 3425 } 3426 3427 3428 Error 3429 Process::PrivateResume () 3430 { 3431 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS|LIBLLDB_LOG_STEP)); 3432 if (log) 3433 log->Printf("Process::PrivateResume() m_stop_id = %u, public state: %s private state: %s", 3434 m_mod_id.GetStopID(), 3435 StateAsCString(m_public_state.GetValue()), 3436 StateAsCString(m_private_state.GetValue())); 3437 3438 Error error (WillResume()); 3439 // Tell the process it is about to resume before the thread list 3440 if (error.Success()) 3441 { 3442 // Now let the thread list know we are about to resume so it 3443 // can let all of our threads know that they are about to be 3444 // resumed. Threads will each be called with 3445 // Thread::WillResume(StateType) where StateType contains the state 3446 // that they are supposed to have when the process is resumed 3447 // (suspended/running/stepping). Threads should also check 3448 // their resume signal in lldb::Thread::GetResumeSignal() 3449 // to see if they are supposed to start back up with a signal. 3450 if (m_thread_list.WillResume()) 3451 { 3452 // Last thing, do the PreResumeActions. 3453 if (!RunPreResumeActions()) 3454 { 3455 error.SetErrorStringWithFormat ("Process::PrivateResume PreResumeActions failed, not resuming."); 3456 } 3457 else 3458 { 3459 m_mod_id.BumpResumeID(); 3460 error = DoResume(); 3461 if (error.Success()) 3462 { 3463 DidResume(); 3464 m_thread_list.DidResume(); 3465 if (log) 3466 log->Printf ("Process thinks the process has resumed."); 3467 } 3468 } 3469 } 3470 else 3471 { 3472 // Somebody wanted to run without running. So generate a continue & a stopped event, 3473 // and let the world handle them. 3474 if (log) 3475 log->Printf ("Process::PrivateResume() asked to simulate a start & stop."); 3476 3477 SetPrivateState(eStateRunning); 3478 SetPrivateState(eStateStopped); 3479 } 3480 } 3481 else if (log) 3482 log->Printf ("Process::PrivateResume() got an error \"%s\".", error.AsCString("<unknown error>")); 3483 return error; 3484 } 3485 3486 Error 3487 Process::Halt (bool clear_thread_plans) 3488 { 3489 // Don't clear the m_clear_thread_plans_on_stop, only set it to true if 3490 // in case it was already set and some thread plan logic calls halt on its 3491 // own. 3492 m_clear_thread_plans_on_stop |= clear_thread_plans; 3493 3494 // First make sure we aren't in the middle of handling an event, or we might restart. This is pretty weak, since 3495 // we could just straightaway get another event. It just narrows the window... 3496 m_currently_handling_event.WaitForValueEqualTo(false); 3497 3498 3499 // Pause our private state thread so we can ensure no one else eats 3500 // the stop event out from under us. 3501 Listener halt_listener ("lldb.process.halt_listener"); 3502 HijackPrivateProcessEvents(&halt_listener); 3503 3504 EventSP event_sp; 3505 Error error (WillHalt()); 3506 3507 if (error.Success()) 3508 { 3509 3510 bool caused_stop = false; 3511 3512 // Ask the process subclass to actually halt our process 3513 error = DoHalt(caused_stop); 3514 if (error.Success()) 3515 { 3516 if (m_public_state.GetValue() == eStateAttaching) 3517 { 3518 SetExitStatus(SIGKILL, "Cancelled async attach."); 3519 Destroy (); 3520 } 3521 else 3522 { 3523 // If "caused_stop" is true, then DoHalt stopped the process. If 3524 // "caused_stop" is false, the process was already stopped. 3525 // If the DoHalt caused the process to stop, then we want to catch 3526 // this event and set the interrupted bool to true before we pass 3527 // this along so clients know that the process was interrupted by 3528 // a halt command. 3529 if (caused_stop) 3530 { 3531 // Wait for 1 second for the process to stop. 3532 TimeValue timeout_time; 3533 timeout_time = TimeValue::Now(); 3534 timeout_time.OffsetWithSeconds(1); 3535 bool got_event = halt_listener.WaitForEvent (&timeout_time, event_sp); 3536 StateType state = ProcessEventData::GetStateFromEvent(event_sp.get()); 3537 3538 if (!got_event || state == eStateInvalid) 3539 { 3540 // We timeout out and didn't get a stop event... 3541 error.SetErrorStringWithFormat ("Halt timed out. State = %s", StateAsCString(GetState())); 3542 } 3543 else 3544 { 3545 if (StateIsStoppedState (state, false)) 3546 { 3547 // We caused the process to interrupt itself, so mark this 3548 // as such in the stop event so clients can tell an interrupted 3549 // process from a natural stop 3550 ProcessEventData::SetInterruptedInEvent (event_sp.get(), true); 3551 } 3552 else 3553 { 3554 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3555 if (log) 3556 log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state)); 3557 error.SetErrorString ("Did not get stopped event after halt."); 3558 } 3559 } 3560 } 3561 DidHalt(); 3562 } 3563 } 3564 } 3565 // Resume our private state thread before we post the event (if any) 3566 RestorePrivateProcessEvents(); 3567 3568 // Post any event we might have consumed. If all goes well, we will have 3569 // stopped the process, intercepted the event and set the interrupted 3570 // bool in the event. Post it to the private event queue and that will end up 3571 // correctly setting the state. 3572 if (event_sp) 3573 m_private_state_broadcaster.BroadcastEvent(event_sp); 3574 3575 return error; 3576 } 3577 3578 Error 3579 Process::HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp) 3580 { 3581 Error error; 3582 if (m_public_state.GetValue() == eStateRunning) 3583 { 3584 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 3585 if (log) 3586 log->Printf("Process::Destroy() About to halt."); 3587 error = Halt(); 3588 if (error.Success()) 3589 { 3590 // Consume the halt event. 3591 TimeValue timeout (TimeValue::Now()); 3592 timeout.OffsetWithSeconds(1); 3593 StateType state = WaitForProcessToStop (&timeout, &exit_event_sp); 3594 3595 // If the process exited while we were waiting for it to stop, put the exited event into 3596 // the shared pointer passed in and return. Our caller doesn't need to do anything else, since 3597 // they don't have a process anymore... 3598 3599 if (state == eStateExited || m_private_state.GetValue() == eStateExited) 3600 { 3601 if (log) 3602 log->Printf("Process::HaltForDestroyOrDetach() Process exited while waiting to Halt."); 3603 return error; 3604 } 3605 else 3606 exit_event_sp.reset(); // It is ok to consume any non-exit stop events 3607 3608 if (state != eStateStopped) 3609 { 3610 if (log) 3611 log->Printf("Process::HaltForDestroyOrDetach() Halt failed to stop, state is: %s", StateAsCString(state)); 3612 // If we really couldn't stop the process then we should just error out here, but if the 3613 // lower levels just bobbled sending the event and we really are stopped, then continue on. 3614 StateType private_state = m_private_state.GetValue(); 3615 if (private_state != eStateStopped) 3616 { 3617 return error; 3618 } 3619 } 3620 } 3621 else 3622 { 3623 if (log) 3624 log->Printf("Process::HaltForDestroyOrDetach() Halt got error: %s", error.AsCString()); 3625 } 3626 } 3627 return error; 3628 } 3629 3630 Error 3631 Process::Detach (bool keep_stopped) 3632 { 3633 EventSP exit_event_sp; 3634 Error error; 3635 m_destroy_in_process = true; 3636 3637 error = WillDetach(); 3638 3639 if (error.Success()) 3640 { 3641 if (DetachRequiresHalt()) 3642 { 3643 error = HaltForDestroyOrDetach (exit_event_sp); 3644 if (!error.Success()) 3645 { 3646 m_destroy_in_process = false; 3647 return error; 3648 } 3649 else if (exit_event_sp) 3650 { 3651 // We shouldn't need to do anything else here. There's no process left to detach from... 3652 StopPrivateStateThread(); 3653 m_destroy_in_process = false; 3654 return error; 3655 } 3656 } 3657 3658 error = DoDetach(keep_stopped); 3659 if (error.Success()) 3660 { 3661 DidDetach(); 3662 StopPrivateStateThread(); 3663 } 3664 else 3665 { 3666 return error; 3667 } 3668 } 3669 m_destroy_in_process = false; 3670 3671 // If we exited when we were waiting for a process to stop, then 3672 // forward the event here so we don't lose the event 3673 if (exit_event_sp) 3674 { 3675 // Directly broadcast our exited event because we shut down our 3676 // private state thread above 3677 BroadcastEvent(exit_event_sp); 3678 } 3679 3680 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating 3681 // the last events through the event system, in which case we might strand the write lock. Unlock 3682 // it here so when we do to tear down the process we don't get an error destroying the lock. 3683 3684 m_public_run_lock.SetStopped(); 3685 return error; 3686 } 3687 3688 Error 3689 Process::Destroy () 3690 { 3691 3692 // Tell ourselves we are in the process of destroying the process, so that we don't do any unnecessary work 3693 // that might hinder the destruction. Remember to set this back to false when we are done. That way if the attempt 3694 // failed and the process stays around for some reason it won't be in a confused state. 3695 3696 m_destroy_in_process = true; 3697 3698 Error error (WillDestroy()); 3699 if (error.Success()) 3700 { 3701 EventSP exit_event_sp; 3702 if (DestroyRequiresHalt()) 3703 { 3704 error = HaltForDestroyOrDetach(exit_event_sp); 3705 } 3706 3707 if (m_public_state.GetValue() != eStateRunning) 3708 { 3709 // Ditch all thread plans, and remove all our breakpoints: in case we have to restart the target to 3710 // kill it, we don't want it hitting a breakpoint... 3711 // Only do this if we've stopped, however, since if we didn't manage to halt it above, then 3712 // we're not going to have much luck doing this now. 3713 m_thread_list.DiscardThreadPlans(); 3714 DisableAllBreakpointSites(); 3715 } 3716 3717 error = DoDestroy(); 3718 if (error.Success()) 3719 { 3720 DidDestroy(); 3721 StopPrivateStateThread(); 3722 } 3723 m_stdio_communication.StopReadThread(); 3724 m_stdio_communication.Disconnect(); 3725 if (m_process_input_reader && m_process_input_reader->IsActive()) 3726 m_target.GetDebugger().PopInputReader (m_process_input_reader); 3727 if (m_process_input_reader) 3728 m_process_input_reader.reset(); 3729 3730 // If we exited when we were waiting for a process to stop, then 3731 // forward the event here so we don't lose the event 3732 if (exit_event_sp) 3733 { 3734 // Directly broadcast our exited event because we shut down our 3735 // private state thread above 3736 BroadcastEvent(exit_event_sp); 3737 } 3738 3739 // If we have been interrupted (to kill us) in the middle of running, we may not end up propagating 3740 // the last events through the event system, in which case we might strand the write lock. Unlock 3741 // it here so when we do to tear down the process we don't get an error destroying the lock. 3742 m_public_run_lock.SetStopped(); 3743 } 3744 3745 m_destroy_in_process = false; 3746 3747 return error; 3748 } 3749 3750 Error 3751 Process::Signal (int signal) 3752 { 3753 Error error (WillSignal()); 3754 if (error.Success()) 3755 { 3756 error = DoSignal(signal); 3757 if (error.Success()) 3758 DidSignal(); 3759 } 3760 return error; 3761 } 3762 3763 lldb::ByteOrder 3764 Process::GetByteOrder () const 3765 { 3766 return m_target.GetArchitecture().GetByteOrder(); 3767 } 3768 3769 uint32_t 3770 Process::GetAddressByteSize () const 3771 { 3772 return m_target.GetArchitecture().GetAddressByteSize(); 3773 } 3774 3775 3776 bool 3777 Process::ShouldBroadcastEvent (Event *event_ptr) 3778 { 3779 const StateType state = Process::ProcessEventData::GetStateFromEvent (event_ptr); 3780 bool return_value = true; 3781 Log *log(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_EVENTS | LIBLLDB_LOG_PROCESS)); 3782 3783 switch (state) 3784 { 3785 case eStateConnected: 3786 case eStateAttaching: 3787 case eStateLaunching: 3788 case eStateDetached: 3789 case eStateExited: 3790 case eStateUnloaded: 3791 // These events indicate changes in the state of the debugging session, always report them. 3792 return_value = true; 3793 break; 3794 case eStateInvalid: 3795 // We stopped for no apparent reason, don't report it. 3796 return_value = false; 3797 break; 3798 case eStateRunning: 3799 case eStateStepping: 3800 // If we've started the target running, we handle the cases where we 3801 // are already running and where there is a transition from stopped to 3802 // running differently. 3803 // running -> running: Automatically suppress extra running events 3804 // stopped -> running: Report except when there is one or more no votes 3805 // and no yes votes. 3806 SynchronouslyNotifyStateChanged (state); 3807 switch (m_last_broadcast_state) 3808 { 3809 case eStateRunning: 3810 case eStateStepping: 3811 // We always suppress multiple runnings with no PUBLIC stop in between. 3812 return_value = false; 3813 break; 3814 default: 3815 // TODO: make this work correctly. For now always report 3816 // run if we aren't running so we don't miss any runnning 3817 // events. If I run the lldb/test/thread/a.out file and 3818 // break at main.cpp:58, run and hit the breakpoints on 3819 // multiple threads, then somehow during the stepping over 3820 // of all breakpoints no run gets reported. 3821 3822 // This is a transition from stop to run. 3823 switch (m_thread_list.ShouldReportRun (event_ptr)) 3824 { 3825 case eVoteYes: 3826 case eVoteNoOpinion: 3827 return_value = true; 3828 break; 3829 case eVoteNo: 3830 return_value = false; 3831 break; 3832 } 3833 break; 3834 } 3835 break; 3836 case eStateStopped: 3837 case eStateCrashed: 3838 case eStateSuspended: 3839 { 3840 // We've stopped. First see if we're going to restart the target. 3841 // If we are going to stop, then we always broadcast the event. 3842 // If we aren't going to stop, let the thread plans decide if we're going to report this event. 3843 // If no thread has an opinion, we don't report it. 3844 3845 RefreshStateAfterStop (); 3846 if (ProcessEventData::GetInterruptedFromEvent (event_ptr)) 3847 { 3848 if (log) 3849 log->Printf ("Process::ShouldBroadcastEvent (%p) stopped due to an interrupt, state: %s", 3850 event_ptr, 3851 StateAsCString(state)); 3852 return_value = true; 3853 } 3854 else 3855 { 3856 bool was_restarted = ProcessEventData::GetRestartedFromEvent (event_ptr); 3857 bool should_resume = false; 3858 3859 // It makes no sense to ask "ShouldStop" if we've already been restarted... 3860 // Asking the thread list is also not likely to go well, since we are running again. 3861 // So in that case just report the event. 3862 3863 if (!was_restarted) 3864 should_resume = m_thread_list.ShouldStop (event_ptr) == false; 3865 3866 if (was_restarted || should_resume || m_resume_requested) 3867 { 3868 Vote stop_vote = m_thread_list.ShouldReportStop (event_ptr); 3869 if (log) 3870 log->Printf ("Process::ShouldBroadcastEvent: should_stop: %i state: %s was_restarted: %i stop_vote: %d.", 3871 should_resume, 3872 StateAsCString(state), 3873 was_restarted, 3874 stop_vote); 3875 3876 switch (stop_vote) 3877 { 3878 case eVoteYes: 3879 return_value = true; 3880 break; 3881 case eVoteNoOpinion: 3882 case eVoteNo: 3883 return_value = false; 3884 break; 3885 } 3886 3887 if (!was_restarted) 3888 { 3889 if (log) 3890 log->Printf ("Process::ShouldBroadcastEvent (%p) Restarting process from state: %s", event_ptr, StateAsCString(state)); 3891 ProcessEventData::SetRestartedInEvent(event_ptr, true); 3892 PrivateResume (); 3893 } 3894 3895 } 3896 else 3897 { 3898 return_value = true; 3899 SynchronouslyNotifyStateChanged (state); 3900 } 3901 } 3902 } 3903 break; 3904 } 3905 3906 // We do some coalescing of events (for instance two consecutive running events get coalesced.) 3907 // But we only coalesce against events we actually broadcast. So we use m_last_broadcast_state 3908 // to track that. NB - you can't use "m_public_state.GetValue()" for that purpose, as was originally done, 3909 // because the PublicState reflects the last event pulled off the queue, and there may be several 3910 // events stacked up on the queue unserviced. So the PublicState may not reflect the last broadcasted event 3911 // yet. m_last_broadcast_state gets updated here. 3912 3913 if (return_value) 3914 m_last_broadcast_state = state; 3915 3916 if (log) 3917 log->Printf ("Process::ShouldBroadcastEvent (%p) => new state: %s, last broadcast state: %s - %s", 3918 event_ptr, 3919 StateAsCString(state), 3920 StateAsCString(m_last_broadcast_state), 3921 return_value ? "YES" : "NO"); 3922 return return_value; 3923 } 3924 3925 3926 bool 3927 Process::StartPrivateStateThread (bool force) 3928 { 3929 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_EVENTS)); 3930 3931 bool already_running = PrivateStateThreadIsValid (); 3932 if (log) 3933 log->Printf ("Process::%s()%s ", __FUNCTION__, already_running ? " already running" : " starting private state thread"); 3934 3935 if (!force && already_running) 3936 return true; 3937 3938 // Create a thread that watches our internal state and controls which 3939 // events make it to clients (into the DCProcess event queue). 3940 char thread_name[1024]; 3941 if (already_running) 3942 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state-override(pid=%" PRIu64 ")>", GetID()); 3943 else 3944 snprintf(thread_name, sizeof(thread_name), "<lldb.process.internal-state(pid=%" PRIu64 ")>", GetID()); 3945 3946 // Create the private state thread, and start it running. 3947 m_private_state_thread = Host::ThreadCreate (thread_name, Process::PrivateStateThread, this, NULL); 3948 bool success = IS_VALID_LLDB_HOST_THREAD(m_private_state_thread); 3949 if (success) 3950 { 3951 ResumePrivateStateThread(); 3952 return true; 3953 } 3954 else 3955 return false; 3956 } 3957 3958 void 3959 Process::PausePrivateStateThread () 3960 { 3961 ControlPrivateStateThread (eBroadcastInternalStateControlPause); 3962 } 3963 3964 void 3965 Process::ResumePrivateStateThread () 3966 { 3967 ControlPrivateStateThread (eBroadcastInternalStateControlResume); 3968 } 3969 3970 void 3971 Process::StopPrivateStateThread () 3972 { 3973 if (PrivateStateThreadIsValid ()) 3974 ControlPrivateStateThread (eBroadcastInternalStateControlStop); 3975 else 3976 { 3977 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 3978 if (log) 3979 log->Printf ("Went to stop the private state thread, but it was already invalid."); 3980 } 3981 } 3982 3983 void 3984 Process::ControlPrivateStateThread (uint32_t signal) 3985 { 3986 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 3987 3988 assert (signal == eBroadcastInternalStateControlStop || 3989 signal == eBroadcastInternalStateControlPause || 3990 signal == eBroadcastInternalStateControlResume); 3991 3992 if (log) 3993 log->Printf ("Process::%s (signal = %d)", __FUNCTION__, signal); 3994 3995 // Signal the private state thread. First we should copy this is case the 3996 // thread starts exiting since the private state thread will NULL this out 3997 // when it exits 3998 const lldb::thread_t private_state_thread = m_private_state_thread; 3999 if (IS_VALID_LLDB_HOST_THREAD(private_state_thread)) 4000 { 4001 TimeValue timeout_time; 4002 bool timed_out; 4003 4004 m_private_state_control_broadcaster.BroadcastEvent (signal, NULL); 4005 4006 timeout_time = TimeValue::Now(); 4007 timeout_time.OffsetWithSeconds(2); 4008 if (log) 4009 log->Printf ("Sending control event of type: %d.", signal); 4010 m_private_state_control_wait.WaitForValueEqualTo (true, &timeout_time, &timed_out); 4011 m_private_state_control_wait.SetValue (false, eBroadcastNever); 4012 4013 if (signal == eBroadcastInternalStateControlStop) 4014 { 4015 if (timed_out) 4016 { 4017 Error error; 4018 Host::ThreadCancel (private_state_thread, &error); 4019 if (log) 4020 log->Printf ("Timed out responding to the control event, cancel got error: \"%s\".", error.AsCString()); 4021 } 4022 else 4023 { 4024 if (log) 4025 log->Printf ("The control event killed the private state thread without having to cancel."); 4026 } 4027 4028 thread_result_t result = NULL; 4029 Host::ThreadJoin (private_state_thread, &result, NULL); 4030 m_private_state_thread = LLDB_INVALID_HOST_THREAD; 4031 } 4032 } 4033 else 4034 { 4035 if (log) 4036 log->Printf ("Private state thread already dead, no need to signal it to stop."); 4037 } 4038 } 4039 4040 void 4041 Process::SendAsyncInterrupt () 4042 { 4043 if (PrivateStateThreadIsValid()) 4044 m_private_state_broadcaster.BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 4045 else 4046 BroadcastEvent (Process::eBroadcastBitInterrupt, NULL); 4047 } 4048 4049 void 4050 Process::HandlePrivateEvent (EventSP &event_sp) 4051 { 4052 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4053 m_resume_requested = false; 4054 4055 m_currently_handling_event.SetValue(true, eBroadcastNever); 4056 4057 const StateType new_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4058 4059 // First check to see if anybody wants a shot at this event: 4060 if (m_next_event_action_ap.get() != NULL) 4061 { 4062 NextEventAction::EventActionResult action_result = m_next_event_action_ap->PerformAction(event_sp); 4063 if (log) 4064 log->Printf ("Ran next event action, result was %d.", action_result); 4065 4066 switch (action_result) 4067 { 4068 case NextEventAction::eEventActionSuccess: 4069 SetNextEventAction(NULL); 4070 break; 4071 4072 case NextEventAction::eEventActionRetry: 4073 break; 4074 4075 case NextEventAction::eEventActionExit: 4076 // Handle Exiting Here. If we already got an exited event, 4077 // we should just propagate it. Otherwise, swallow this event, 4078 // and set our state to exit so the next event will kill us. 4079 if (new_state != eStateExited) 4080 { 4081 // FIXME: should cons up an exited event, and discard this one. 4082 SetExitStatus(0, m_next_event_action_ap->GetExitString()); 4083 m_currently_handling_event.SetValue(false, eBroadcastAlways); 4084 SetNextEventAction(NULL); 4085 return; 4086 } 4087 SetNextEventAction(NULL); 4088 break; 4089 } 4090 } 4091 4092 // See if we should broadcast this state to external clients? 4093 const bool should_broadcast = ShouldBroadcastEvent (event_sp.get()); 4094 4095 if (should_broadcast) 4096 { 4097 if (log) 4098 { 4099 log->Printf ("Process::%s (pid = %" PRIu64 ") broadcasting new state %s (old state %s) to %s", 4100 __FUNCTION__, 4101 GetID(), 4102 StateAsCString(new_state), 4103 StateAsCString (GetState ()), 4104 IsHijackedForEvent(eBroadcastBitStateChanged) ? "hijacked" : "public"); 4105 } 4106 Process::ProcessEventData::SetUpdateStateOnRemoval(event_sp.get()); 4107 if (StateIsRunningState (new_state)) 4108 PushProcessInputReader (); 4109 else if (!Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 4110 PopProcessInputReader (); 4111 4112 BroadcastEvent (event_sp); 4113 } 4114 else 4115 { 4116 if (log) 4117 { 4118 log->Printf ("Process::%s (pid = %" PRIu64 ") suppressing state %s (old state %s): should_broadcast == false", 4119 __FUNCTION__, 4120 GetID(), 4121 StateAsCString(new_state), 4122 StateAsCString (GetState ())); 4123 } 4124 } 4125 m_currently_handling_event.SetValue(false, eBroadcastAlways); 4126 } 4127 4128 thread_result_t 4129 Process::PrivateStateThread (void *arg) 4130 { 4131 Process *proc = static_cast<Process*> (arg); 4132 thread_result_t result = proc->RunPrivateStateThread(); 4133 return result; 4134 } 4135 4136 thread_result_t 4137 Process::RunPrivateStateThread () 4138 { 4139 bool control_only = true; 4140 m_private_state_control_wait.SetValue (false, eBroadcastNever); 4141 4142 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4143 if (log) 4144 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread starting...", __FUNCTION__, this, GetID()); 4145 4146 bool exit_now = false; 4147 while (!exit_now) 4148 { 4149 EventSP event_sp; 4150 WaitForEventsPrivate (NULL, event_sp, control_only); 4151 if (event_sp->BroadcasterIs(&m_private_state_control_broadcaster)) 4152 { 4153 if (log) 4154 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") got a control event: %d", __FUNCTION__, this, GetID(), event_sp->GetType()); 4155 4156 switch (event_sp->GetType()) 4157 { 4158 case eBroadcastInternalStateControlStop: 4159 exit_now = true; 4160 break; // doing any internal state managment below 4161 4162 case eBroadcastInternalStateControlPause: 4163 control_only = true; 4164 break; 4165 4166 case eBroadcastInternalStateControlResume: 4167 control_only = false; 4168 break; 4169 } 4170 4171 m_private_state_control_wait.SetValue (true, eBroadcastAlways); 4172 continue; 4173 } 4174 else if (event_sp->GetType() == eBroadcastBitInterrupt) 4175 { 4176 if (m_public_state.GetValue() == eStateAttaching) 4177 { 4178 if (log) 4179 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt while attaching - forwarding interrupt.", __FUNCTION__, this, GetID()); 4180 BroadcastEvent (eBroadcastBitInterrupt, NULL); 4181 } 4182 else 4183 { 4184 if (log) 4185 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") woke up with an interrupt - Halting.", __FUNCTION__, this, GetID()); 4186 Halt(); 4187 } 4188 continue; 4189 } 4190 4191 const StateType internal_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 4192 4193 if (internal_state != eStateInvalid) 4194 { 4195 if (m_clear_thread_plans_on_stop && 4196 StateIsStoppedState(internal_state, true)) 4197 { 4198 m_clear_thread_plans_on_stop = false; 4199 m_thread_list.DiscardThreadPlans(); 4200 } 4201 HandlePrivateEvent (event_sp); 4202 } 4203 4204 if (internal_state == eStateInvalid || 4205 internal_state == eStateExited || 4206 internal_state == eStateDetached ) 4207 { 4208 if (log) 4209 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") about to exit with internal state %s...", __FUNCTION__, this, GetID(), StateAsCString(internal_state)); 4210 4211 break; 4212 } 4213 } 4214 4215 // Verify log is still enabled before attempting to write to it... 4216 if (log) 4217 log->Printf ("Process::%s (arg = %p, pid = %" PRIu64 ") thread exiting...", __FUNCTION__, this, GetID()); 4218 4219 m_public_run_lock.SetStopped(); 4220 m_private_state_control_wait.SetValue (true, eBroadcastAlways); 4221 m_private_state_thread = LLDB_INVALID_HOST_THREAD; 4222 return NULL; 4223 } 4224 4225 //------------------------------------------------------------------ 4226 // Process Event Data 4227 //------------------------------------------------------------------ 4228 4229 Process::ProcessEventData::ProcessEventData () : 4230 EventData (), 4231 m_process_sp (), 4232 m_state (eStateInvalid), 4233 m_restarted (false), 4234 m_update_state (0), 4235 m_interrupted (false) 4236 { 4237 } 4238 4239 Process::ProcessEventData::ProcessEventData (const ProcessSP &process_sp, StateType state) : 4240 EventData (), 4241 m_process_sp (process_sp), 4242 m_state (state), 4243 m_restarted (false), 4244 m_update_state (0), 4245 m_interrupted (false) 4246 { 4247 } 4248 4249 Process::ProcessEventData::~ProcessEventData() 4250 { 4251 } 4252 4253 const ConstString & 4254 Process::ProcessEventData::GetFlavorString () 4255 { 4256 static ConstString g_flavor ("Process::ProcessEventData"); 4257 return g_flavor; 4258 } 4259 4260 const ConstString & 4261 Process::ProcessEventData::GetFlavor () const 4262 { 4263 return ProcessEventData::GetFlavorString (); 4264 } 4265 4266 void 4267 Process::ProcessEventData::DoOnRemoval (Event *event_ptr) 4268 { 4269 // This function gets called twice for each event, once when the event gets pulled 4270 // off of the private process event queue, and then any number of times, first when it gets pulled off of 4271 // the public event queue, then other times when we're pretending that this is where we stopped at the 4272 // end of expression evaluation. m_update_state is used to distinguish these 4273 // three cases; it is 0 when we're just pulling it off for private handling, 4274 // and > 1 for expression evaluation, and we don't want to do the breakpoint command handling then. 4275 if (m_update_state != 1) 4276 return; 4277 4278 m_process_sp->SetPublicState (m_state, Process::ProcessEventData::GetRestartedFromEvent(event_ptr)); 4279 4280 // If we're stopped and haven't restarted, then do the breakpoint commands here: 4281 if (m_state == eStateStopped && ! m_restarted) 4282 { 4283 ThreadList &curr_thread_list = m_process_sp->GetThreadList(); 4284 uint32_t num_threads = curr_thread_list.GetSize(); 4285 uint32_t idx; 4286 4287 // The actions might change one of the thread's stop_info's opinions about whether we should 4288 // stop the process, so we need to query that as we go. 4289 4290 // One other complication here, is that we try to catch any case where the target has run (except for expressions) 4291 // and immediately exit, but if we get that wrong (which is possible) then the thread list might have changed, and 4292 // that would cause our iteration here to crash. We could make a copy of the thread list, but we'd really like 4293 // to also know if it has changed at all, so we make up a vector of the thread ID's and check what we get back 4294 // against this list & bag out if anything differs. 4295 std::vector<uint32_t> thread_index_array(num_threads); 4296 for (idx = 0; idx < num_threads; ++idx) 4297 thread_index_array[idx] = curr_thread_list.GetThreadAtIndex(idx)->GetIndexID(); 4298 4299 // Use this to track whether we should continue from here. We will only continue the target running if 4300 // no thread says we should stop. Of course if some thread's PerformAction actually sets the target running, 4301 // then it doesn't matter what the other threads say... 4302 4303 bool still_should_stop = false; 4304 4305 // Sometimes - for instance if we have a bug in the stub we are talking to, we stop but no thread has a 4306 // valid stop reason. In that case we should just stop, because we have no way of telling what the right 4307 // thing to do is, and it's better to let the user decide than continue behind their backs. 4308 4309 bool does_anybody_have_an_opinion = false; 4310 4311 for (idx = 0; idx < num_threads; ++idx) 4312 { 4313 curr_thread_list = m_process_sp->GetThreadList(); 4314 if (curr_thread_list.GetSize() != num_threads) 4315 { 4316 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 4317 if (log) 4318 log->Printf("Number of threads changed from %u to %u while processing event.", num_threads, curr_thread_list.GetSize()); 4319 break; 4320 } 4321 4322 lldb::ThreadSP thread_sp = curr_thread_list.GetThreadAtIndex(idx); 4323 4324 if (thread_sp->GetIndexID() != thread_index_array[idx]) 4325 { 4326 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 4327 if (log) 4328 log->Printf("The thread at position %u changed from %u to %u while processing event.", 4329 idx, 4330 thread_index_array[idx], 4331 thread_sp->GetIndexID()); 4332 break; 4333 } 4334 4335 StopInfoSP stop_info_sp = thread_sp->GetStopInfo (); 4336 if (stop_info_sp && stop_info_sp->IsValid()) 4337 { 4338 does_anybody_have_an_opinion = true; 4339 bool this_thread_wants_to_stop; 4340 if (stop_info_sp->GetOverrideShouldStop()) 4341 { 4342 this_thread_wants_to_stop = stop_info_sp->GetOverriddenShouldStopValue(); 4343 } 4344 else 4345 { 4346 stop_info_sp->PerformAction(event_ptr); 4347 // The stop action might restart the target. If it does, then we want to mark that in the 4348 // event so that whoever is receiving it will know to wait for the running event and reflect 4349 // that state appropriately. 4350 // We also need to stop processing actions, since they aren't expecting the target to be running. 4351 4352 // FIXME: we might have run. 4353 if (stop_info_sp->HasTargetRunSinceMe()) 4354 { 4355 SetRestarted (true); 4356 break; 4357 } 4358 4359 this_thread_wants_to_stop = stop_info_sp->ShouldStop(event_ptr); 4360 } 4361 4362 if (still_should_stop == false) 4363 still_should_stop = this_thread_wants_to_stop; 4364 } 4365 } 4366 4367 4368 if (!GetRestarted()) 4369 { 4370 if (!still_should_stop && does_anybody_have_an_opinion) 4371 { 4372 // We've been asked to continue, so do that here. 4373 SetRestarted(true); 4374 // Use the public resume method here, since this is just 4375 // extending a public resume. 4376 m_process_sp->PrivateResume(); 4377 } 4378 else 4379 { 4380 // If we didn't restart, run the Stop Hooks here: 4381 // They might also restart the target, so watch for that. 4382 m_process_sp->GetTarget().RunStopHooks(); 4383 if (m_process_sp->GetPrivateState() == eStateRunning) 4384 SetRestarted(true); 4385 } 4386 } 4387 } 4388 } 4389 4390 void 4391 Process::ProcessEventData::Dump (Stream *s) const 4392 { 4393 if (m_process_sp) 4394 s->Printf(" process = %p (pid = %" PRIu64 "), ", m_process_sp.get(), m_process_sp->GetID()); 4395 4396 s->Printf("state = %s", StateAsCString(GetState())); 4397 } 4398 4399 const Process::ProcessEventData * 4400 Process::ProcessEventData::GetEventDataFromEvent (const Event *event_ptr) 4401 { 4402 if (event_ptr) 4403 { 4404 const EventData *event_data = event_ptr->GetData(); 4405 if (event_data && event_data->GetFlavor() == ProcessEventData::GetFlavorString()) 4406 return static_cast <const ProcessEventData *> (event_ptr->GetData()); 4407 } 4408 return NULL; 4409 } 4410 4411 ProcessSP 4412 Process::ProcessEventData::GetProcessFromEvent (const Event *event_ptr) 4413 { 4414 ProcessSP process_sp; 4415 const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 4416 if (data) 4417 process_sp = data->GetProcessSP(); 4418 return process_sp; 4419 } 4420 4421 StateType 4422 Process::ProcessEventData::GetStateFromEvent (const Event *event_ptr) 4423 { 4424 const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 4425 if (data == NULL) 4426 return eStateInvalid; 4427 else 4428 return data->GetState(); 4429 } 4430 4431 bool 4432 Process::ProcessEventData::GetRestartedFromEvent (const Event *event_ptr) 4433 { 4434 const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 4435 if (data == NULL) 4436 return false; 4437 else 4438 return data->GetRestarted(); 4439 } 4440 4441 void 4442 Process::ProcessEventData::SetRestartedInEvent (Event *event_ptr, bool new_value) 4443 { 4444 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4445 if (data != NULL) 4446 data->SetRestarted(new_value); 4447 } 4448 4449 size_t 4450 Process::ProcessEventData::GetNumRestartedReasons(const Event *event_ptr) 4451 { 4452 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4453 if (data != NULL) 4454 return data->GetNumRestartedReasons(); 4455 else 4456 return 0; 4457 } 4458 4459 const char * 4460 Process::ProcessEventData::GetRestartedReasonAtIndex(const Event *event_ptr, size_t idx) 4461 { 4462 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4463 if (data != NULL) 4464 return data->GetRestartedReasonAtIndex(idx); 4465 else 4466 return NULL; 4467 } 4468 4469 void 4470 Process::ProcessEventData::AddRestartedReason (Event *event_ptr, const char *reason) 4471 { 4472 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4473 if (data != NULL) 4474 data->AddRestartedReason(reason); 4475 } 4476 4477 bool 4478 Process::ProcessEventData::GetInterruptedFromEvent (const Event *event_ptr) 4479 { 4480 const ProcessEventData *data = GetEventDataFromEvent (event_ptr); 4481 if (data == NULL) 4482 return false; 4483 else 4484 return data->GetInterrupted (); 4485 } 4486 4487 void 4488 Process::ProcessEventData::SetInterruptedInEvent (Event *event_ptr, bool new_value) 4489 { 4490 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4491 if (data != NULL) 4492 data->SetInterrupted(new_value); 4493 } 4494 4495 bool 4496 Process::ProcessEventData::SetUpdateStateOnRemoval (Event *event_ptr) 4497 { 4498 ProcessEventData *data = const_cast<ProcessEventData *>(GetEventDataFromEvent (event_ptr)); 4499 if (data) 4500 { 4501 data->SetUpdateStateOnRemoval(); 4502 return true; 4503 } 4504 return false; 4505 } 4506 4507 lldb::TargetSP 4508 Process::CalculateTarget () 4509 { 4510 return m_target.shared_from_this(); 4511 } 4512 4513 void 4514 Process::CalculateExecutionContext (ExecutionContext &exe_ctx) 4515 { 4516 exe_ctx.SetTargetPtr (&m_target); 4517 exe_ctx.SetProcessPtr (this); 4518 exe_ctx.SetThreadPtr(NULL); 4519 exe_ctx.SetFramePtr (NULL); 4520 } 4521 4522 //uint32_t 4523 //Process::ListProcessesMatchingName (const char *name, StringList &matches, std::vector<lldb::pid_t> &pids) 4524 //{ 4525 // return 0; 4526 //} 4527 // 4528 //ArchSpec 4529 //Process::GetArchSpecForExistingProcess (lldb::pid_t pid) 4530 //{ 4531 // return Host::GetArchSpecForExistingProcess (pid); 4532 //} 4533 // 4534 //ArchSpec 4535 //Process::GetArchSpecForExistingProcess (const char *process_name) 4536 //{ 4537 // return Host::GetArchSpecForExistingProcess (process_name); 4538 //} 4539 // 4540 void 4541 Process::AppendSTDOUT (const char * s, size_t len) 4542 { 4543 Mutex::Locker locker (m_stdio_communication_mutex); 4544 m_stdout_data.append (s, len); 4545 BroadcastEventIfUnique (eBroadcastBitSTDOUT, new ProcessEventData (shared_from_this(), GetState())); 4546 } 4547 4548 void 4549 Process::AppendSTDERR (const char * s, size_t len) 4550 { 4551 Mutex::Locker locker (m_stdio_communication_mutex); 4552 m_stderr_data.append (s, len); 4553 BroadcastEventIfUnique (eBroadcastBitSTDERR, new ProcessEventData (shared_from_this(), GetState())); 4554 } 4555 4556 void 4557 Process::BroadcastAsyncProfileData(const std::string &one_profile_data) 4558 { 4559 Mutex::Locker locker (m_profile_data_comm_mutex); 4560 m_profile_data.push_back(one_profile_data); 4561 BroadcastEventIfUnique (eBroadcastBitProfileData, new ProcessEventData (shared_from_this(), GetState())); 4562 } 4563 4564 size_t 4565 Process::GetAsyncProfileData (char *buf, size_t buf_size, Error &error) 4566 { 4567 Mutex::Locker locker(m_profile_data_comm_mutex); 4568 if (m_profile_data.empty()) 4569 return 0; 4570 4571 std::string &one_profile_data = m_profile_data.front(); 4572 size_t bytes_available = one_profile_data.size(); 4573 if (bytes_available > 0) 4574 { 4575 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4576 if (log) 4577 log->Printf ("Process::GetProfileData (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4578 if (bytes_available > buf_size) 4579 { 4580 memcpy(buf, one_profile_data.c_str(), buf_size); 4581 one_profile_data.erase(0, buf_size); 4582 bytes_available = buf_size; 4583 } 4584 else 4585 { 4586 memcpy(buf, one_profile_data.c_str(), bytes_available); 4587 m_profile_data.erase(m_profile_data.begin()); 4588 } 4589 } 4590 return bytes_available; 4591 } 4592 4593 4594 //------------------------------------------------------------------ 4595 // Process STDIO 4596 //------------------------------------------------------------------ 4597 4598 size_t 4599 Process::GetSTDOUT (char *buf, size_t buf_size, Error &error) 4600 { 4601 Mutex::Locker locker(m_stdio_communication_mutex); 4602 size_t bytes_available = m_stdout_data.size(); 4603 if (bytes_available > 0) 4604 { 4605 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4606 if (log) 4607 log->Printf ("Process::GetSTDOUT (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4608 if (bytes_available > buf_size) 4609 { 4610 memcpy(buf, m_stdout_data.c_str(), buf_size); 4611 m_stdout_data.erase(0, buf_size); 4612 bytes_available = buf_size; 4613 } 4614 else 4615 { 4616 memcpy(buf, m_stdout_data.c_str(), bytes_available); 4617 m_stdout_data.clear(); 4618 } 4619 } 4620 return bytes_available; 4621 } 4622 4623 4624 size_t 4625 Process::GetSTDERR (char *buf, size_t buf_size, Error &error) 4626 { 4627 Mutex::Locker locker(m_stdio_communication_mutex); 4628 size_t bytes_available = m_stderr_data.size(); 4629 if (bytes_available > 0) 4630 { 4631 Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS)); 4632 if (log) 4633 log->Printf ("Process::GetSTDERR (buf = %p, size = %" PRIu64 ")", buf, (uint64_t)buf_size); 4634 if (bytes_available > buf_size) 4635 { 4636 memcpy(buf, m_stderr_data.c_str(), buf_size); 4637 m_stderr_data.erase(0, buf_size); 4638 bytes_available = buf_size; 4639 } 4640 else 4641 { 4642 memcpy(buf, m_stderr_data.c_str(), bytes_available); 4643 m_stderr_data.clear(); 4644 } 4645 } 4646 return bytes_available; 4647 } 4648 4649 void 4650 Process::STDIOReadThreadBytesReceived (void *baton, const void *src, size_t src_len) 4651 { 4652 Process *process = (Process *) baton; 4653 process->AppendSTDOUT (static_cast<const char *>(src), src_len); 4654 } 4655 4656 size_t 4657 Process::ProcessInputReaderCallback (void *baton, 4658 InputReader &reader, 4659 lldb::InputReaderAction notification, 4660 const char *bytes, 4661 size_t bytes_len) 4662 { 4663 Process *process = (Process *) baton; 4664 4665 switch (notification) 4666 { 4667 case eInputReaderActivate: 4668 break; 4669 4670 case eInputReaderDeactivate: 4671 break; 4672 4673 case eInputReaderReactivate: 4674 break; 4675 4676 case eInputReaderAsynchronousOutputWritten: 4677 break; 4678 4679 case eInputReaderGotToken: 4680 { 4681 Error error; 4682 process->PutSTDIN (bytes, bytes_len, error); 4683 } 4684 break; 4685 4686 case eInputReaderInterrupt: 4687 process->SendAsyncInterrupt(); 4688 break; 4689 4690 case eInputReaderEndOfFile: 4691 process->AppendSTDOUT ("^D", 2); 4692 break; 4693 4694 case eInputReaderDone: 4695 break; 4696 4697 } 4698 4699 return bytes_len; 4700 } 4701 4702 void 4703 Process::ResetProcessInputReader () 4704 { 4705 m_process_input_reader.reset(); 4706 } 4707 4708 void 4709 Process::SetSTDIOFileDescriptor (int file_descriptor) 4710 { 4711 // First set up the Read Thread for reading/handling process I/O 4712 4713 std::unique_ptr<ConnectionFileDescriptor> conn_ap (new ConnectionFileDescriptor (file_descriptor, true)); 4714 4715 if (conn_ap.get()) 4716 { 4717 m_stdio_communication.SetConnection (conn_ap.release()); 4718 if (m_stdio_communication.IsConnected()) 4719 { 4720 m_stdio_communication.SetReadThreadBytesReceivedCallback (STDIOReadThreadBytesReceived, this); 4721 m_stdio_communication.StartReadThread(); 4722 4723 // Now read thread is set up, set up input reader. 4724 4725 if (!m_process_input_reader.get()) 4726 { 4727 m_process_input_reader.reset (new InputReader(m_target.GetDebugger())); 4728 Error err (m_process_input_reader->Initialize (Process::ProcessInputReaderCallback, 4729 this, 4730 eInputReaderGranularityByte, 4731 NULL, 4732 NULL, 4733 false)); 4734 4735 if (err.Fail()) 4736 m_process_input_reader.reset(); 4737 } 4738 } 4739 } 4740 } 4741 4742 void 4743 Process::PushProcessInputReader () 4744 { 4745 if (m_process_input_reader && !m_process_input_reader->IsActive()) 4746 m_target.GetDebugger().PushInputReader (m_process_input_reader); 4747 } 4748 4749 void 4750 Process::PopProcessInputReader () 4751 { 4752 if (m_process_input_reader && m_process_input_reader->IsActive()) 4753 m_target.GetDebugger().PopInputReader (m_process_input_reader); 4754 } 4755 4756 // The process needs to know about installed plug-ins 4757 void 4758 Process::SettingsInitialize () 4759 { 4760 // static std::vector<OptionEnumValueElement> g_plugins; 4761 // 4762 // int i=0; 4763 // const char *name; 4764 // OptionEnumValueElement option_enum; 4765 // while ((name = PluginManager::GetProcessPluginNameAtIndex (i)) != NULL) 4766 // { 4767 // if (name) 4768 // { 4769 // option_enum.value = i; 4770 // option_enum.string_value = name; 4771 // option_enum.usage = PluginManager::GetProcessPluginDescriptionAtIndex (i); 4772 // g_plugins.push_back (option_enum); 4773 // } 4774 // ++i; 4775 // } 4776 // option_enum.value = 0; 4777 // option_enum.string_value = NULL; 4778 // option_enum.usage = NULL; 4779 // g_plugins.push_back (option_enum); 4780 // 4781 // for (i=0; (name = SettingsController::instance_settings_table[i].var_name); ++i) 4782 // { 4783 // if (::strcmp (name, "plugin") == 0) 4784 // { 4785 // SettingsController::instance_settings_table[i].enum_values = &g_plugins[0]; 4786 // break; 4787 // } 4788 // } 4789 // 4790 Thread::SettingsInitialize (); 4791 } 4792 4793 void 4794 Process::SettingsTerminate () 4795 { 4796 Thread::SettingsTerminate (); 4797 } 4798 4799 ExecutionResults 4800 Process::RunThreadPlan (ExecutionContext &exe_ctx, 4801 lldb::ThreadPlanSP &thread_plan_sp, 4802 const EvaluateExpressionOptions &options, 4803 Stream &errors) 4804 { 4805 ExecutionResults return_value = eExecutionSetupError; 4806 4807 if (thread_plan_sp.get() == NULL) 4808 { 4809 errors.Printf("RunThreadPlan called with empty thread plan."); 4810 return eExecutionSetupError; 4811 } 4812 4813 if (!thread_plan_sp->ValidatePlan(NULL)) 4814 { 4815 errors.Printf ("RunThreadPlan called with an invalid thread plan."); 4816 return eExecutionSetupError; 4817 } 4818 4819 if (exe_ctx.GetProcessPtr() != this) 4820 { 4821 errors.Printf("RunThreadPlan called on wrong process."); 4822 return eExecutionSetupError; 4823 } 4824 4825 Thread *thread = exe_ctx.GetThreadPtr(); 4826 if (thread == NULL) 4827 { 4828 errors.Printf("RunThreadPlan called with invalid thread."); 4829 return eExecutionSetupError; 4830 } 4831 4832 // We rely on the thread plan we are running returning "PlanCompleted" if when it successfully completes. 4833 // For that to be true the plan can't be private - since private plans suppress themselves in the 4834 // GetCompletedPlan call. 4835 4836 bool orig_plan_private = thread_plan_sp->GetPrivate(); 4837 thread_plan_sp->SetPrivate(false); 4838 4839 if (m_private_state.GetValue() != eStateStopped) 4840 { 4841 errors.Printf ("RunThreadPlan called while the private state was not stopped."); 4842 return eExecutionSetupError; 4843 } 4844 4845 // Save the thread & frame from the exe_ctx for restoration after we run 4846 const uint32_t thread_idx_id = thread->GetIndexID(); 4847 StackFrameSP selected_frame_sp = thread->GetSelectedFrame(); 4848 if (!selected_frame_sp) 4849 { 4850 thread->SetSelectedFrame(0); 4851 selected_frame_sp = thread->GetSelectedFrame(); 4852 if (!selected_frame_sp) 4853 { 4854 errors.Printf("RunThreadPlan called without a selected frame on thread %d", thread_idx_id); 4855 return eExecutionSetupError; 4856 } 4857 } 4858 4859 StackID ctx_frame_id = selected_frame_sp->GetStackID(); 4860 4861 // N.B. Running the target may unset the currently selected thread and frame. We don't want to do that either, 4862 // so we should arrange to reset them as well. 4863 4864 lldb::ThreadSP selected_thread_sp = GetThreadList().GetSelectedThread(); 4865 4866 uint32_t selected_tid; 4867 StackID selected_stack_id; 4868 if (selected_thread_sp) 4869 { 4870 selected_tid = selected_thread_sp->GetIndexID(); 4871 selected_stack_id = selected_thread_sp->GetSelectedFrame()->GetStackID(); 4872 } 4873 else 4874 { 4875 selected_tid = LLDB_INVALID_THREAD_ID; 4876 } 4877 4878 lldb::thread_t backup_private_state_thread = LLDB_INVALID_HOST_THREAD; 4879 lldb::StateType old_state; 4880 lldb::ThreadPlanSP stopper_base_plan_sp; 4881 4882 Log *log(lldb_private::GetLogIfAnyCategoriesSet (LIBLLDB_LOG_STEP | LIBLLDB_LOG_PROCESS)); 4883 if (Host::GetCurrentThread() == m_private_state_thread) 4884 { 4885 // Yikes, we are running on the private state thread! So we can't wait for public events on this thread, since 4886 // we are the thread that is generating public events. 4887 // The simplest thing to do is to spin up a temporary thread to handle private state thread events while 4888 // we are fielding public events here. 4889 if (log) 4890 log->Printf ("Running thread plan on private state thread, spinning up another state thread to handle the events."); 4891 4892 4893 backup_private_state_thread = m_private_state_thread; 4894 4895 // One other bit of business: we want to run just this thread plan and anything it pushes, and then stop, 4896 // returning control here. 4897 // But in the normal course of things, the plan above us on the stack would be given a shot at the stop 4898 // event before deciding to stop, and we don't want that. So we insert a "stopper" base plan on the stack 4899 // before the plan we want to run. Since base plans always stop and return control to the user, that will 4900 // do just what we want. 4901 stopper_base_plan_sp.reset(new ThreadPlanBase (*thread)); 4902 thread->QueueThreadPlan (stopper_base_plan_sp, false); 4903 // Have to make sure our public state is stopped, since otherwise the reporting logic below doesn't work correctly. 4904 old_state = m_public_state.GetValue(); 4905 m_public_state.SetValueNoLock(eStateStopped); 4906 4907 // Now spin up the private state thread: 4908 StartPrivateStateThread(true); 4909 } 4910 4911 thread->QueueThreadPlan(thread_plan_sp, false); // This used to pass "true" does that make sense? 4912 4913 if (options.GetDebug()) 4914 { 4915 // In this case, we aren't actually going to run, we just want to stop right away. 4916 // Flush this thread so we will refetch the stacks and show the correct backtrace. 4917 // FIXME: To make this prettier we should invent some stop reason for this, but that 4918 // is only cosmetic, and this functionality is only of use to lldb developers who can 4919 // live with not pretty... 4920 thread->Flush(); 4921 return eExecutionStoppedForDebug; 4922 } 4923 4924 Listener listener("lldb.process.listener.run-thread-plan"); 4925 4926 lldb::EventSP event_to_broadcast_sp; 4927 4928 { 4929 // This process event hijacker Hijacks the Public events and its destructor makes sure that the process events get 4930 // restored on exit to the function. 4931 // 4932 // If the event needs to propagate beyond the hijacker (e.g., the process exits during execution), then the event 4933 // is put into event_to_broadcast_sp for rebroadcasting. 4934 4935 ProcessEventHijacker run_thread_plan_hijacker (*this, &listener); 4936 4937 if (log) 4938 { 4939 StreamString s; 4940 thread_plan_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 4941 log->Printf ("Process::RunThreadPlan(): Resuming thread %u - 0x%4.4" PRIx64 " to run thread plan \"%s\".", 4942 thread->GetIndexID(), 4943 thread->GetID(), 4944 s.GetData()); 4945 } 4946 4947 bool got_event; 4948 lldb::EventSP event_sp; 4949 lldb::StateType stop_state = lldb::eStateInvalid; 4950 4951 TimeValue* timeout_ptr = NULL; 4952 TimeValue real_timeout; 4953 4954 bool before_first_timeout = true; // This is set to false the first time that we have to halt the target. 4955 bool do_resume = true; 4956 bool handle_running_event = true; 4957 const uint64_t default_one_thread_timeout_usec = 250000; 4958 4959 // This is just for accounting: 4960 uint32_t num_resumes = 0; 4961 4962 TimeValue one_thread_timeout = TimeValue::Now(); 4963 TimeValue final_timeout = one_thread_timeout; 4964 4965 uint32_t timeout_usec = options.GetTimeoutUsec(); 4966 if (options.GetTryAllThreads()) 4967 { 4968 // If we are running all threads then we take half the time to run all threads, bounded by 4969 // .25 sec. 4970 if (options.GetTimeoutUsec() == 0) 4971 one_thread_timeout.OffsetWithMicroSeconds(default_one_thread_timeout_usec); 4972 else 4973 { 4974 uint64_t computed_timeout = timeout_usec / 2; 4975 if (computed_timeout > default_one_thread_timeout_usec) 4976 computed_timeout = default_one_thread_timeout_usec; 4977 one_thread_timeout.OffsetWithMicroSeconds(computed_timeout); 4978 } 4979 final_timeout.OffsetWithMicroSeconds (timeout_usec); 4980 } 4981 else 4982 { 4983 if (timeout_usec != 0) 4984 final_timeout.OffsetWithMicroSeconds(timeout_usec); 4985 } 4986 4987 // This while loop must exit out the bottom, there's cleanup that we need to do when we are done. 4988 // So don't call return anywhere within it. 4989 4990 while (1) 4991 { 4992 // We usually want to resume the process if we get to the top of the loop. 4993 // The only exception is if we get two running events with no intervening 4994 // stop, which can happen, we will just wait for then next stop event. 4995 if (log) 4996 log->Printf ("Top of while loop: do_resume: %i handle_running_event: %i before_first_timeout: %i.", 4997 do_resume, 4998 handle_running_event, 4999 before_first_timeout); 5000 5001 if (do_resume || handle_running_event) 5002 { 5003 // Do the initial resume and wait for the running event before going further. 5004 5005 if (do_resume) 5006 { 5007 num_resumes++; 5008 Error resume_error = PrivateResume (); 5009 if (!resume_error.Success()) 5010 { 5011 errors.Printf("Error resuming inferior the %d time: \"%s\".\n", 5012 num_resumes, 5013 resume_error.AsCString()); 5014 return_value = eExecutionSetupError; 5015 break; 5016 } 5017 } 5018 5019 TimeValue resume_timeout = TimeValue::Now(); 5020 resume_timeout.OffsetWithMicroSeconds(500000); 5021 5022 got_event = listener.WaitForEvent(&resume_timeout, event_sp); 5023 if (!got_event) 5024 { 5025 if (log) 5026 log->Printf ("Process::RunThreadPlan(): didn't get any event after resume %d, exiting.", 5027 num_resumes); 5028 5029 errors.Printf("Didn't get any event after resume %d, exiting.", num_resumes); 5030 return_value = eExecutionSetupError; 5031 break; 5032 } 5033 5034 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 5035 5036 if (stop_state != eStateRunning) 5037 { 5038 bool restarted = false; 5039 5040 if (stop_state == eStateStopped) 5041 { 5042 restarted = Process::ProcessEventData::GetRestartedFromEvent(event_sp.get()); 5043 if (log) 5044 log->Printf("Process::RunThreadPlan(): didn't get running event after " 5045 "resume %d, got %s instead (restarted: %i, do_resume: %i, handle_running_event: %i).", 5046 num_resumes, 5047 StateAsCString(stop_state), 5048 restarted, 5049 do_resume, 5050 handle_running_event); 5051 } 5052 5053 if (restarted) 5054 { 5055 // This is probably an overabundance of caution, I don't think I should ever get a stopped & restarted 5056 // event here. But if I do, the best thing is to Halt and then get out of here. 5057 Halt(); 5058 } 5059 5060 errors.Printf("Didn't get running event after initial resume, got %s instead.", 5061 StateAsCString(stop_state)); 5062 return_value = eExecutionSetupError; 5063 break; 5064 } 5065 5066 if (log) 5067 log->PutCString ("Process::RunThreadPlan(): resuming succeeded."); 5068 // We need to call the function synchronously, so spin waiting for it to return. 5069 // If we get interrupted while executing, we're going to lose our context, and 5070 // won't be able to gather the result at this point. 5071 // We set the timeout AFTER the resume, since the resume takes some time and we 5072 // don't want to charge that to the timeout. 5073 } 5074 else 5075 { 5076 if (log) 5077 log->PutCString ("Process::RunThreadPlan(): waiting for next event."); 5078 } 5079 5080 if (before_first_timeout) 5081 { 5082 if (options.GetTryAllThreads()) 5083 timeout_ptr = &one_thread_timeout; 5084 else 5085 { 5086 if (timeout_usec == 0) 5087 timeout_ptr = NULL; 5088 else 5089 timeout_ptr = &final_timeout; 5090 } 5091 } 5092 else 5093 { 5094 if (timeout_usec == 0) 5095 timeout_ptr = NULL; 5096 else 5097 timeout_ptr = &final_timeout; 5098 } 5099 5100 do_resume = true; 5101 handle_running_event = true; 5102 5103 // Now wait for the process to stop again: 5104 event_sp.reset(); 5105 5106 if (log) 5107 { 5108 if (timeout_ptr) 5109 { 5110 log->Printf ("Process::RunThreadPlan(): about to wait - now is %" PRIu64 " - endpoint is %" PRIu64, 5111 TimeValue::Now().GetAsMicroSecondsSinceJan1_1970(), 5112 timeout_ptr->GetAsMicroSecondsSinceJan1_1970()); 5113 } 5114 else 5115 { 5116 log->Printf ("Process::RunThreadPlan(): about to wait forever."); 5117 } 5118 } 5119 5120 got_event = listener.WaitForEvent (timeout_ptr, event_sp); 5121 5122 if (got_event) 5123 { 5124 if (event_sp.get()) 5125 { 5126 bool keep_going = false; 5127 if (event_sp->GetType() == eBroadcastBitInterrupt) 5128 { 5129 Halt(); 5130 return_value = eExecutionInterrupted; 5131 errors.Printf ("Execution halted by user interrupt."); 5132 if (log) 5133 log->Printf ("Process::RunThreadPlan(): Got interrupted by eBroadcastBitInterrupted, exiting."); 5134 break; 5135 } 5136 else 5137 { 5138 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 5139 if (log) 5140 log->Printf("Process::RunThreadPlan(): in while loop, got event: %s.", StateAsCString(stop_state)); 5141 5142 switch (stop_state) 5143 { 5144 case lldb::eStateStopped: 5145 { 5146 // We stopped, figure out what we are going to do now. 5147 ThreadSP thread_sp = GetThreadList().FindThreadByIndexID (thread_idx_id); 5148 if (!thread_sp) 5149 { 5150 // Ooh, our thread has vanished. Unlikely that this was successful execution... 5151 if (log) 5152 log->Printf ("Process::RunThreadPlan(): execution completed but our thread (index-id=%u) has vanished.", thread_idx_id); 5153 return_value = eExecutionInterrupted; 5154 } 5155 else 5156 { 5157 // If we were restarted, we just need to go back up to fetch another event. 5158 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 5159 { 5160 if (log) 5161 { 5162 log->Printf ("Process::RunThreadPlan(): Got a stop and restart, so we'll continue waiting."); 5163 } 5164 keep_going = true; 5165 do_resume = false; 5166 handle_running_event = true; 5167 5168 } 5169 else 5170 { 5171 5172 StopInfoSP stop_info_sp (thread_sp->GetStopInfo ()); 5173 StopReason stop_reason = eStopReasonInvalid; 5174 if (stop_info_sp) 5175 stop_reason = stop_info_sp->GetStopReason(); 5176 5177 5178 // FIXME: We only check if the stop reason is plan complete, should we make sure that 5179 // it is OUR plan that is complete? 5180 if (stop_reason == eStopReasonPlanComplete) 5181 { 5182 if (log) 5183 log->PutCString ("Process::RunThreadPlan(): execution completed successfully."); 5184 // Now mark this plan as private so it doesn't get reported as the stop reason 5185 // after this point. 5186 if (thread_plan_sp) 5187 thread_plan_sp->SetPrivate (orig_plan_private); 5188 return_value = eExecutionCompleted; 5189 } 5190 else 5191 { 5192 // Something restarted the target, so just wait for it to stop for real. 5193 if (stop_reason == eStopReasonBreakpoint) 5194 { 5195 if (log) 5196 log->Printf ("Process::RunThreadPlan() stopped for breakpoint: %s.", stop_info_sp->GetDescription()); 5197 return_value = eExecutionHitBreakpoint; 5198 if (!options.DoesIgnoreBreakpoints()) 5199 { 5200 event_to_broadcast_sp = event_sp; 5201 } 5202 } 5203 else 5204 { 5205 if (log) 5206 log->PutCString ("Process::RunThreadPlan(): thread plan didn't successfully complete."); 5207 if (!options.DoesUnwindOnError()) 5208 event_to_broadcast_sp = event_sp; 5209 return_value = eExecutionInterrupted; 5210 } 5211 } 5212 } 5213 } 5214 } 5215 break; 5216 5217 case lldb::eStateRunning: 5218 // This shouldn't really happen, but sometimes we do get two running events without an 5219 // intervening stop, and in that case we should just go back to waiting for the stop. 5220 do_resume = false; 5221 keep_going = true; 5222 handle_running_event = false; 5223 break; 5224 5225 default: 5226 if (log) 5227 log->Printf("Process::RunThreadPlan(): execution stopped with unexpected state: %s.", StateAsCString(stop_state)); 5228 5229 if (stop_state == eStateExited) 5230 event_to_broadcast_sp = event_sp; 5231 5232 errors.Printf ("Execution stopped with unexpected state.\n"); 5233 return_value = eExecutionInterrupted; 5234 break; 5235 } 5236 } 5237 5238 if (keep_going) 5239 continue; 5240 else 5241 break; 5242 } 5243 else 5244 { 5245 if (log) 5246 log->PutCString ("Process::RunThreadPlan(): got_event was true, but the event pointer was null. How odd..."); 5247 return_value = eExecutionInterrupted; 5248 break; 5249 } 5250 } 5251 else 5252 { 5253 // If we didn't get an event that means we've timed out... 5254 // We will interrupt the process here. Depending on what we were asked to do we will 5255 // either exit, or try with all threads running for the same timeout. 5256 5257 if (log) { 5258 if (options.GetTryAllThreads()) 5259 { 5260 uint64_t remaining_time = final_timeout - TimeValue::Now(); 5261 if (before_first_timeout) 5262 log->Printf ("Process::RunThreadPlan(): Running function with one thread timeout timed out, " 5263 "running till for %" PRIu64 " usec with all threads enabled.", 5264 remaining_time); 5265 else 5266 log->Printf ("Process::RunThreadPlan(): Restarting function with all threads enabled " 5267 "and timeout: %u timed out, abandoning execution.", 5268 timeout_usec); 5269 } 5270 else 5271 log->Printf ("Process::RunThreadPlan(): Running function with timeout: %u timed out, " 5272 "abandoning execution.", 5273 timeout_usec); 5274 } 5275 5276 // It is possible that between the time we issued the Halt, and we get around to calling Halt the target 5277 // could have stopped. That's fine, Halt will figure that out and send the appropriate Stopped event. 5278 // BUT it is also possible that we stopped & restarted (e.g. hit a signal with "stop" set to false.) In 5279 // that case, we'll get the stopped & restarted event, and we should go back to waiting for the Halt's 5280 // stopped event. That's what this while loop does. 5281 5282 bool back_to_top = true; 5283 uint32_t try_halt_again = 0; 5284 bool do_halt = true; 5285 const uint32_t num_retries = 5; 5286 while (try_halt_again < num_retries) 5287 { 5288 Error halt_error; 5289 if (do_halt) 5290 { 5291 if (log) 5292 log->Printf ("Process::RunThreadPlan(): Running Halt."); 5293 halt_error = Halt(); 5294 } 5295 if (halt_error.Success()) 5296 { 5297 if (log) 5298 log->PutCString ("Process::RunThreadPlan(): Halt succeeded."); 5299 5300 real_timeout = TimeValue::Now(); 5301 real_timeout.OffsetWithMicroSeconds(500000); 5302 5303 got_event = listener.WaitForEvent(&real_timeout, event_sp); 5304 5305 if (got_event) 5306 { 5307 stop_state = Process::ProcessEventData::GetStateFromEvent(event_sp.get()); 5308 if (log) 5309 { 5310 log->Printf ("Process::RunThreadPlan(): Stopped with event: %s", StateAsCString(stop_state)); 5311 if (stop_state == lldb::eStateStopped 5312 && Process::ProcessEventData::GetInterruptedFromEvent(event_sp.get())) 5313 log->PutCString (" Event was the Halt interruption event."); 5314 } 5315 5316 if (stop_state == lldb::eStateStopped) 5317 { 5318 // Between the time we initiated the Halt and the time we delivered it, the process could have 5319 // already finished its job. Check that here: 5320 5321 if (thread->IsThreadPlanDone (thread_plan_sp.get())) 5322 { 5323 if (log) 5324 log->PutCString ("Process::RunThreadPlan(): Even though we timed out, the call plan was done. " 5325 "Exiting wait loop."); 5326 return_value = eExecutionCompleted; 5327 back_to_top = false; 5328 break; 5329 } 5330 5331 if (Process::ProcessEventData::GetRestartedFromEvent(event_sp.get())) 5332 { 5333 if (log) 5334 log->PutCString ("Process::RunThreadPlan(): Went to halt but got a restarted event, there must be an un-restarted stopped event so try again... " 5335 "Exiting wait loop."); 5336 try_halt_again++; 5337 do_halt = false; 5338 continue; 5339 } 5340 5341 if (!options.GetTryAllThreads()) 5342 { 5343 if (log) 5344 log->PutCString ("Process::RunThreadPlan(): try_all_threads was false, we stopped so now we're quitting."); 5345 return_value = eExecutionInterrupted; 5346 back_to_top = false; 5347 break; 5348 } 5349 5350 if (before_first_timeout) 5351 { 5352 // Set all the other threads to run, and return to the top of the loop, which will continue; 5353 before_first_timeout = false; 5354 thread_plan_sp->SetStopOthers (false); 5355 if (log) 5356 log->PutCString ("Process::RunThreadPlan(): about to resume."); 5357 5358 back_to_top = true; 5359 break; 5360 } 5361 else 5362 { 5363 // Running all threads failed, so return Interrupted. 5364 if (log) 5365 log->PutCString("Process::RunThreadPlan(): running all threads timed out."); 5366 return_value = eExecutionInterrupted; 5367 back_to_top = false; 5368 break; 5369 } 5370 } 5371 } 5372 else 5373 { if (log) 5374 log->PutCString("Process::RunThreadPlan(): halt said it succeeded, but I got no event. " 5375 "I'm getting out of here passing Interrupted."); 5376 return_value = eExecutionInterrupted; 5377 back_to_top = false; 5378 break; 5379 } 5380 } 5381 else 5382 { 5383 try_halt_again++; 5384 continue; 5385 } 5386 } 5387 5388 if (!back_to_top || try_halt_again > num_retries) 5389 break; 5390 else 5391 continue; 5392 } 5393 } // END WAIT LOOP 5394 5395 // If we had to start up a temporary private state thread to run this thread plan, shut it down now. 5396 if (IS_VALID_LLDB_HOST_THREAD(backup_private_state_thread)) 5397 { 5398 StopPrivateStateThread(); 5399 Error error; 5400 m_private_state_thread = backup_private_state_thread; 5401 if (stopper_base_plan_sp) 5402 { 5403 thread->DiscardThreadPlansUpToPlan(stopper_base_plan_sp); 5404 } 5405 m_public_state.SetValueNoLock(old_state); 5406 5407 } 5408 5409 // Restore the thread state if we are going to discard the plan execution. There are three cases where this 5410 // could happen: 5411 // 1) The execution successfully completed 5412 // 2) We hit a breakpoint, and ignore_breakpoints was true 5413 // 3) We got some other error, and discard_on_error was true 5414 bool should_unwind = (return_value == eExecutionInterrupted && options.DoesUnwindOnError()) 5415 || (return_value == eExecutionHitBreakpoint && options.DoesIgnoreBreakpoints()); 5416 5417 if (return_value == eExecutionCompleted 5418 || should_unwind) 5419 { 5420 thread_plan_sp->RestoreThreadState(); 5421 } 5422 5423 // Now do some processing on the results of the run: 5424 if (return_value == eExecutionInterrupted || return_value == eExecutionHitBreakpoint) 5425 { 5426 if (log) 5427 { 5428 StreamString s; 5429 if (event_sp) 5430 event_sp->Dump (&s); 5431 else 5432 { 5433 log->PutCString ("Process::RunThreadPlan(): Stop event that interrupted us is NULL."); 5434 } 5435 5436 StreamString ts; 5437 5438 const char *event_explanation = NULL; 5439 5440 do 5441 { 5442 if (!event_sp) 5443 { 5444 event_explanation = "<no event>"; 5445 break; 5446 } 5447 else if (event_sp->GetType() == eBroadcastBitInterrupt) 5448 { 5449 event_explanation = "<user interrupt>"; 5450 break; 5451 } 5452 else 5453 { 5454 const Process::ProcessEventData *event_data = Process::ProcessEventData::GetEventDataFromEvent (event_sp.get()); 5455 5456 if (!event_data) 5457 { 5458 event_explanation = "<no event data>"; 5459 break; 5460 } 5461 5462 Process *process = event_data->GetProcessSP().get(); 5463 5464 if (!process) 5465 { 5466 event_explanation = "<no process>"; 5467 break; 5468 } 5469 5470 ThreadList &thread_list = process->GetThreadList(); 5471 5472 uint32_t num_threads = thread_list.GetSize(); 5473 uint32_t thread_index; 5474 5475 ts.Printf("<%u threads> ", num_threads); 5476 5477 for (thread_index = 0; 5478 thread_index < num_threads; 5479 ++thread_index) 5480 { 5481 Thread *thread = thread_list.GetThreadAtIndex(thread_index).get(); 5482 5483 if (!thread) 5484 { 5485 ts.Printf("<?> "); 5486 continue; 5487 } 5488 5489 ts.Printf("<0x%4.4" PRIx64 " ", thread->GetID()); 5490 RegisterContext *register_context = thread->GetRegisterContext().get(); 5491 5492 if (register_context) 5493 ts.Printf("[ip 0x%" PRIx64 "] ", register_context->GetPC()); 5494 else 5495 ts.Printf("[ip unknown] "); 5496 5497 lldb::StopInfoSP stop_info_sp = thread->GetStopInfo(); 5498 if (stop_info_sp) 5499 { 5500 const char *stop_desc = stop_info_sp->GetDescription(); 5501 if (stop_desc) 5502 ts.PutCString (stop_desc); 5503 } 5504 ts.Printf(">"); 5505 } 5506 5507 event_explanation = ts.GetData(); 5508 } 5509 } while (0); 5510 5511 if (event_explanation) 5512 log->Printf("Process::RunThreadPlan(): execution interrupted: %s %s", s.GetData(), event_explanation); 5513 else 5514 log->Printf("Process::RunThreadPlan(): execution interrupted: %s", s.GetData()); 5515 } 5516 5517 if (should_unwind) 5518 { 5519 if (log) 5520 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - discarding thread plans up to %p.", thread_plan_sp.get()); 5521 thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 5522 thread_plan_sp->SetPrivate (orig_plan_private); 5523 } 5524 else 5525 { 5526 if (log) 5527 log->Printf ("Process::RunThreadPlan: ExecutionInterrupted - for plan: %p not discarding.", thread_plan_sp.get()); 5528 } 5529 } 5530 else if (return_value == eExecutionSetupError) 5531 { 5532 if (log) 5533 log->PutCString("Process::RunThreadPlan(): execution set up error."); 5534 5535 if (options.DoesUnwindOnError()) 5536 { 5537 thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 5538 thread_plan_sp->SetPrivate (orig_plan_private); 5539 } 5540 } 5541 else 5542 { 5543 if (thread->IsThreadPlanDone (thread_plan_sp.get())) 5544 { 5545 if (log) 5546 log->PutCString("Process::RunThreadPlan(): thread plan is done"); 5547 return_value = eExecutionCompleted; 5548 } 5549 else if (thread->WasThreadPlanDiscarded (thread_plan_sp.get())) 5550 { 5551 if (log) 5552 log->PutCString("Process::RunThreadPlan(): thread plan was discarded"); 5553 return_value = eExecutionDiscarded; 5554 } 5555 else 5556 { 5557 if (log) 5558 log->PutCString("Process::RunThreadPlan(): thread plan stopped in mid course"); 5559 if (options.DoesUnwindOnError() && thread_plan_sp) 5560 { 5561 if (log) 5562 log->PutCString("Process::RunThreadPlan(): discarding thread plan 'cause unwind_on_error is set."); 5563 thread->DiscardThreadPlansUpToPlan (thread_plan_sp); 5564 thread_plan_sp->SetPrivate (orig_plan_private); 5565 } 5566 } 5567 } 5568 5569 // Thread we ran the function in may have gone away because we ran the target 5570 // Check that it's still there, and if it is put it back in the context. Also restore the 5571 // frame in the context if it is still present. 5572 thread = GetThreadList().FindThreadByIndexID(thread_idx_id, true).get(); 5573 if (thread) 5574 { 5575 exe_ctx.SetFrameSP (thread->GetFrameWithStackID (ctx_frame_id)); 5576 } 5577 5578 // Also restore the current process'es selected frame & thread, since this function calling may 5579 // be done behind the user's back. 5580 5581 if (selected_tid != LLDB_INVALID_THREAD_ID) 5582 { 5583 if (GetThreadList().SetSelectedThreadByIndexID (selected_tid) && selected_stack_id.IsValid()) 5584 { 5585 // We were able to restore the selected thread, now restore the frame: 5586 Mutex::Locker lock(GetThreadList().GetMutex()); 5587 StackFrameSP old_frame_sp = GetThreadList().GetSelectedThread()->GetFrameWithStackID(selected_stack_id); 5588 if (old_frame_sp) 5589 GetThreadList().GetSelectedThread()->SetSelectedFrame(old_frame_sp.get()); 5590 } 5591 } 5592 } 5593 5594 // If the process exited during the run of the thread plan, notify everyone. 5595 5596 if (event_to_broadcast_sp) 5597 { 5598 if (log) 5599 log->PutCString("Process::RunThreadPlan(): rebroadcasting event."); 5600 BroadcastEvent(event_to_broadcast_sp); 5601 } 5602 5603 return return_value; 5604 } 5605 5606 const char * 5607 Process::ExecutionResultAsCString (ExecutionResults result) 5608 { 5609 const char *result_name; 5610 5611 switch (result) 5612 { 5613 case eExecutionCompleted: 5614 result_name = "eExecutionCompleted"; 5615 break; 5616 case eExecutionDiscarded: 5617 result_name = "eExecutionDiscarded"; 5618 break; 5619 case eExecutionInterrupted: 5620 result_name = "eExecutionInterrupted"; 5621 break; 5622 case eExecutionHitBreakpoint: 5623 result_name = "eExecutionHitBreakpoint"; 5624 break; 5625 case eExecutionSetupError: 5626 result_name = "eExecutionSetupError"; 5627 break; 5628 case eExecutionTimedOut: 5629 result_name = "eExecutionTimedOut"; 5630 break; 5631 case eExecutionStoppedForDebug: 5632 result_name = "eExecutionStoppedForDebug"; 5633 break; 5634 } 5635 return result_name; 5636 } 5637 5638 void 5639 Process::GetStatus (Stream &strm) 5640 { 5641 const StateType state = GetState(); 5642 if (StateIsStoppedState(state, false)) 5643 { 5644 if (state == eStateExited) 5645 { 5646 int exit_status = GetExitStatus(); 5647 const char *exit_description = GetExitDescription(); 5648 strm.Printf ("Process %" PRIu64 " exited with status = %i (0x%8.8x) %s\n", 5649 GetID(), 5650 exit_status, 5651 exit_status, 5652 exit_description ? exit_description : ""); 5653 } 5654 else 5655 { 5656 if (state == eStateConnected) 5657 strm.Printf ("Connected to remote target.\n"); 5658 else 5659 strm.Printf ("Process %" PRIu64 " %s\n", GetID(), StateAsCString (state)); 5660 } 5661 } 5662 else 5663 { 5664 strm.Printf ("Process %" PRIu64 " is running.\n", GetID()); 5665 } 5666 } 5667 5668 size_t 5669 Process::GetThreadStatus (Stream &strm, 5670 bool only_threads_with_stop_reason, 5671 uint32_t start_frame, 5672 uint32_t num_frames, 5673 uint32_t num_frames_with_source) 5674 { 5675 size_t num_thread_infos_dumped = 0; 5676 5677 Mutex::Locker locker (GetThreadList().GetMutex()); 5678 const size_t num_threads = GetThreadList().GetSize(); 5679 for (uint32_t i = 0; i < num_threads; i++) 5680 { 5681 Thread *thread = GetThreadList().GetThreadAtIndex(i).get(); 5682 if (thread) 5683 { 5684 if (only_threads_with_stop_reason) 5685 { 5686 StopInfoSP stop_info_sp = thread->GetStopInfo(); 5687 if (stop_info_sp.get() == NULL || !stop_info_sp->IsValid()) 5688 continue; 5689 } 5690 thread->GetStatus (strm, 5691 start_frame, 5692 num_frames, 5693 num_frames_with_source); 5694 ++num_thread_infos_dumped; 5695 } 5696 } 5697 return num_thread_infos_dumped; 5698 } 5699 5700 void 5701 Process::AddInvalidMemoryRegion (const LoadRange ®ion) 5702 { 5703 m_memory_cache.AddInvalidRange(region.GetRangeBase(), region.GetByteSize()); 5704 } 5705 5706 bool 5707 Process::RemoveInvalidMemoryRange (const LoadRange ®ion) 5708 { 5709 return m_memory_cache.RemoveInvalidRange(region.GetRangeBase(), region.GetByteSize()); 5710 } 5711 5712 void 5713 Process::AddPreResumeAction (PreResumeActionCallback callback, void *baton) 5714 { 5715 m_pre_resume_actions.push_back(PreResumeCallbackAndBaton (callback, baton)); 5716 } 5717 5718 bool 5719 Process::RunPreResumeActions () 5720 { 5721 bool result = true; 5722 while (!m_pre_resume_actions.empty()) 5723 { 5724 struct PreResumeCallbackAndBaton action = m_pre_resume_actions.back(); 5725 m_pre_resume_actions.pop_back(); 5726 bool this_result = action.callback (action.baton); 5727 if (result == true) result = this_result; 5728 } 5729 return result; 5730 } 5731 5732 void 5733 Process::ClearPreResumeActions () 5734 { 5735 m_pre_resume_actions.clear(); 5736 } 5737 5738 void 5739 Process::Flush () 5740 { 5741 m_thread_list.Flush(); 5742 m_extended_thread_list.Flush(); 5743 m_extended_thread_stop_id = 0; 5744 m_queue_list.Clear(); 5745 m_queue_list_stop_id = 0; 5746 } 5747 5748 void 5749 Process::DidExec () 5750 { 5751 Target &target = GetTarget(); 5752 target.CleanupProcess (); 5753 target.ClearModules(false); 5754 m_dynamic_checkers_ap.reset(); 5755 m_abi_sp.reset(); 5756 m_system_runtime_ap.reset(); 5757 m_os_ap.reset(); 5758 m_dyld_ap.reset(); 5759 m_image_tokens.clear(); 5760 m_allocated_memory_cache.Clear(); 5761 m_language_runtimes.clear(); 5762 m_thread_list.DiscardThreadPlans(); 5763 m_memory_cache.Clear(true); 5764 DoDidExec(); 5765 CompleteAttach (); 5766 // Flush the process (threads and all stack frames) after running CompleteAttach() 5767 // in case the dynamic loader loaded things in new locations. 5768 Flush(); 5769 5770 // After we figure out what was loaded/unloaded in CompleteAttach, 5771 // we need to let the target know so it can do any cleanup it needs to. 5772 target.DidExec(); 5773 } 5774 5775