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