1 //===-- Target.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/Target.h" 13 14 // C Includes 15 // C++ Includes 16 // Other libraries and framework includes 17 // Project includes 18 #include "lldb/Breakpoint/BreakpointResolver.h" 19 #include "lldb/Breakpoint/BreakpointResolverAddress.h" 20 #include "lldb/Breakpoint/BreakpointResolverFileLine.h" 21 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h" 22 #include "lldb/Breakpoint/BreakpointResolverName.h" 23 #include "lldb/Breakpoint/Watchpoint.h" 24 #include "lldb/Core/Debugger.h" 25 #include "lldb/Core/Event.h" 26 #include "lldb/Core/Log.h" 27 #include "lldb/Core/Module.h" 28 #include "lldb/Core/ModuleSpec.h" 29 #include "lldb/Core/Section.h" 30 #include "lldb/Core/SourceManager.h" 31 #include "lldb/Core/State.h" 32 #include "lldb/Core/StreamFile.h" 33 #include "lldb/Core/StreamString.h" 34 #include "lldb/Core/Timer.h" 35 #include "lldb/Core/ValueObject.h" 36 #include "lldb/Expression/ClangASTSource.h" 37 #include "lldb/Expression/ClangUserExpression.h" 38 #include "lldb/Host/Host.h" 39 #include "lldb/Interpreter/CommandInterpreter.h" 40 #include "lldb/Interpreter/CommandReturnObject.h" 41 #include "lldb/Interpreter/OptionGroupWatchpoint.h" 42 #include "lldb/Interpreter/OptionValues.h" 43 #include "lldb/Interpreter/Property.h" 44 #include "lldb/lldb-private-log.h" 45 #include "lldb/Symbol/ObjectFile.h" 46 #include "lldb/Target/Process.h" 47 #include "lldb/Target/SectionLoadList.h" 48 #include "lldb/Target/StackFrame.h" 49 #include "lldb/Target/SystemRuntime.h" 50 #include "lldb/Target/Thread.h" 51 #include "lldb/Target/ThreadSpec.h" 52 53 using namespace lldb; 54 using namespace lldb_private; 55 56 ConstString & 57 Target::GetStaticBroadcasterClass () 58 { 59 static ConstString class_name ("lldb.target"); 60 return class_name; 61 } 62 63 //---------------------------------------------------------------------- 64 // Target constructor 65 //---------------------------------------------------------------------- 66 Target::Target(Debugger &debugger, const ArchSpec &target_arch, const lldb::PlatformSP &platform_sp) : 67 TargetProperties (this), 68 Broadcaster (&debugger, Target::GetStaticBroadcasterClass().AsCString()), 69 ExecutionContextScope (), 70 m_debugger (debugger), 71 m_platform_sp (platform_sp), 72 m_mutex (Mutex::eMutexTypeRecursive), 73 m_arch (target_arch), 74 m_images (this), 75 m_section_load_history (), 76 m_breakpoint_list (false), 77 m_internal_breakpoint_list (true), 78 m_watchpoint_list (), 79 m_process_sp (), 80 m_search_filter_sp (), 81 m_image_search_paths (ImageSearchPathsChanged, this), 82 m_scratch_ast_context_ap (), 83 m_scratch_ast_source_ap (), 84 m_ast_importer_ap (), 85 m_persistent_variables (), 86 m_source_manager_ap(), 87 m_stop_hooks (), 88 m_stop_hook_next_id (0), 89 m_valid (true), 90 m_suppress_stop_hooks (false) 91 { 92 SetEventName (eBroadcastBitBreakpointChanged, "breakpoint-changed"); 93 SetEventName (eBroadcastBitModulesLoaded, "modules-loaded"); 94 SetEventName (eBroadcastBitModulesUnloaded, "modules-unloaded"); 95 SetEventName (eBroadcastBitWatchpointChanged, "watchpoint-changed"); 96 SetEventName (eBroadcastBitSymbolsLoaded, "symbols-loaded"); 97 98 CheckInWithManager(); 99 100 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 101 if (log) 102 log->Printf ("%p Target::Target()", this); 103 if (m_arch.IsValid()) 104 { 105 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::Target created with architecture %s (%s)", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 106 } 107 } 108 109 //---------------------------------------------------------------------- 110 // Destructor 111 //---------------------------------------------------------------------- 112 Target::~Target() 113 { 114 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT)); 115 if (log) 116 log->Printf ("%p Target::~Target()", this); 117 DeleteCurrentProcess (); 118 } 119 120 void 121 Target::Dump (Stream *s, lldb::DescriptionLevel description_level) 122 { 123 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 124 if (description_level != lldb::eDescriptionLevelBrief) 125 { 126 s->Indent(); 127 s->PutCString("Target\n"); 128 s->IndentMore(); 129 m_images.Dump(s); 130 m_breakpoint_list.Dump(s); 131 m_internal_breakpoint_list.Dump(s); 132 s->IndentLess(); 133 } 134 else 135 { 136 Module *exe_module = GetExecutableModulePointer(); 137 if (exe_module) 138 s->PutCString (exe_module->GetFileSpec().GetFilename().GetCString()); 139 else 140 s->PutCString ("No executable module."); 141 } 142 } 143 144 void 145 Target::CleanupProcess () 146 { 147 // Do any cleanup of the target we need to do between process instances. 148 // NB It is better to do this before destroying the process in case the 149 // clean up needs some help from the process. 150 m_breakpoint_list.ClearAllBreakpointSites(); 151 m_internal_breakpoint_list.ClearAllBreakpointSites(); 152 // Disable watchpoints just on the debugger side. 153 Mutex::Locker locker; 154 this->GetWatchpointList().GetListMutex(locker); 155 DisableAllWatchpoints(false); 156 ClearAllWatchpointHitCounts(); 157 } 158 159 void 160 Target::DeleteCurrentProcess () 161 { 162 if (m_process_sp.get()) 163 { 164 m_section_load_history.Clear(); 165 if (m_process_sp->IsAlive()) 166 m_process_sp->Destroy(); 167 168 m_process_sp->Finalize(); 169 170 CleanupProcess (); 171 172 m_process_sp.reset(); 173 } 174 } 175 176 const lldb::ProcessSP & 177 Target::CreateProcess (Listener &listener, const char *plugin_name, const FileSpec *crash_file) 178 { 179 DeleteCurrentProcess (); 180 m_process_sp = Process::FindPlugin(*this, plugin_name, listener, crash_file); 181 return m_process_sp; 182 } 183 184 const lldb::ProcessSP & 185 Target::GetProcessSP () const 186 { 187 return m_process_sp; 188 } 189 190 void 191 Target::Destroy() 192 { 193 Mutex::Locker locker (m_mutex); 194 m_valid = false; 195 DeleteCurrentProcess (); 196 m_platform_sp.reset(); 197 m_arch.Clear(); 198 ClearModules(true); 199 m_section_load_history.Clear(); 200 const bool notify = false; 201 m_breakpoint_list.RemoveAll(notify); 202 m_internal_breakpoint_list.RemoveAll(notify); 203 m_last_created_breakpoint.reset(); 204 m_last_created_watchpoint.reset(); 205 m_search_filter_sp.reset(); 206 m_image_search_paths.Clear(notify); 207 m_persistent_variables.Clear(); 208 m_stop_hooks.clear(); 209 m_stop_hook_next_id = 0; 210 m_suppress_stop_hooks = false; 211 } 212 213 214 BreakpointList & 215 Target::GetBreakpointList(bool internal) 216 { 217 if (internal) 218 return m_internal_breakpoint_list; 219 else 220 return m_breakpoint_list; 221 } 222 223 const BreakpointList & 224 Target::GetBreakpointList(bool internal) const 225 { 226 if (internal) 227 return m_internal_breakpoint_list; 228 else 229 return m_breakpoint_list; 230 } 231 232 BreakpointSP 233 Target::GetBreakpointByID (break_id_t break_id) 234 { 235 BreakpointSP bp_sp; 236 237 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 238 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 239 else 240 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 241 242 return bp_sp; 243 } 244 245 BreakpointSP 246 Target::CreateSourceRegexBreakpoint (const FileSpecList *containingModules, 247 const FileSpecList *source_file_spec_list, 248 RegularExpression &source_regex, 249 bool internal, 250 bool hardware) 251 { 252 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, source_file_spec_list)); 253 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex (NULL, source_regex)); 254 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 255 } 256 257 258 BreakpointSP 259 Target::CreateBreakpoint (const FileSpecList *containingModules, 260 const FileSpec &file, 261 uint32_t line_no, 262 LazyBool check_inlines, 263 LazyBool skip_prologue, 264 bool internal, 265 bool hardware) 266 { 267 if (check_inlines == eLazyBoolCalculate) 268 { 269 const InlineStrategy inline_strategy = GetInlineStrategy(); 270 switch (inline_strategy) 271 { 272 case eInlineBreakpointsNever: 273 check_inlines = eLazyBoolNo; 274 break; 275 276 case eInlineBreakpointsHeaders: 277 if (file.IsSourceImplementationFile()) 278 check_inlines = eLazyBoolNo; 279 else 280 check_inlines = eLazyBoolYes; 281 break; 282 283 case eInlineBreakpointsAlways: 284 check_inlines = eLazyBoolYes; 285 break; 286 } 287 } 288 SearchFilterSP filter_sp; 289 if (check_inlines == eLazyBoolNo) 290 { 291 // Not checking for inlines, we are looking only for matching compile units 292 FileSpecList compile_unit_list; 293 compile_unit_list.Append (file); 294 filter_sp = GetSearchFilterForModuleAndCUList (containingModules, &compile_unit_list); 295 } 296 else 297 { 298 filter_sp = GetSearchFilterForModuleList (containingModules); 299 } 300 if (skip_prologue == eLazyBoolCalculate) 301 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 302 303 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine (NULL, 304 file, 305 line_no, 306 check_inlines, 307 skip_prologue)); 308 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 309 } 310 311 312 BreakpointSP 313 Target::CreateBreakpoint (lldb::addr_t addr, bool internal, bool hardware) 314 { 315 Address so_addr; 316 // Attempt to resolve our load address if possible, though it is ok if 317 // it doesn't resolve to section/offset. 318 319 // Try and resolve as a load address if possible 320 GetSectionLoadList().ResolveLoadAddress(addr, so_addr); 321 if (!so_addr.IsValid()) 322 { 323 // The address didn't resolve, so just set this as an absolute address 324 so_addr.SetOffset (addr); 325 } 326 BreakpointSP bp_sp (CreateBreakpoint(so_addr, internal, hardware)); 327 return bp_sp; 328 } 329 330 BreakpointSP 331 Target::CreateBreakpoint (Address &addr, bool internal, bool hardware) 332 { 333 SearchFilterSP filter_sp(new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 334 BreakpointResolverSP resolver_sp (new BreakpointResolverAddress (NULL, addr)); 335 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, false); 336 } 337 338 BreakpointSP 339 Target::CreateBreakpoint (const FileSpecList *containingModules, 340 const FileSpecList *containingSourceFiles, 341 const char *func_name, 342 uint32_t func_name_type_mask, 343 LazyBool skip_prologue, 344 bool internal, 345 bool hardware) 346 { 347 BreakpointSP bp_sp; 348 if (func_name) 349 { 350 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 351 352 if (skip_prologue == eLazyBoolCalculate) 353 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 354 355 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 356 func_name, 357 func_name_type_mask, 358 Breakpoint::Exact, 359 skip_prologue)); 360 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 361 } 362 return bp_sp; 363 } 364 365 lldb::BreakpointSP 366 Target::CreateBreakpoint (const FileSpecList *containingModules, 367 const FileSpecList *containingSourceFiles, 368 const std::vector<std::string> &func_names, 369 uint32_t func_name_type_mask, 370 LazyBool skip_prologue, 371 bool internal, 372 bool hardware) 373 { 374 BreakpointSP bp_sp; 375 size_t num_names = func_names.size(); 376 if (num_names > 0) 377 { 378 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 379 380 if (skip_prologue == eLazyBoolCalculate) 381 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 382 383 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 384 func_names, 385 func_name_type_mask, 386 skip_prologue)); 387 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 388 } 389 return bp_sp; 390 } 391 392 BreakpointSP 393 Target::CreateBreakpoint (const FileSpecList *containingModules, 394 const FileSpecList *containingSourceFiles, 395 const char *func_names[], 396 size_t num_names, 397 uint32_t func_name_type_mask, 398 LazyBool skip_prologue, 399 bool internal, 400 bool hardware) 401 { 402 BreakpointSP bp_sp; 403 if (num_names > 0) 404 { 405 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 406 407 if (skip_prologue == eLazyBoolCalculate) 408 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 409 410 BreakpointResolverSP resolver_sp (new BreakpointResolverName (NULL, 411 func_names, 412 num_names, 413 func_name_type_mask, 414 skip_prologue)); 415 bp_sp = CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 416 } 417 return bp_sp; 418 } 419 420 SearchFilterSP 421 Target::GetSearchFilterForModule (const FileSpec *containingModule) 422 { 423 SearchFilterSP filter_sp; 424 if (containingModule != NULL) 425 { 426 // TODO: We should look into sharing module based search filters 427 // across many breakpoints like we do for the simple target based one 428 filter_sp.reset (new SearchFilterByModule (shared_from_this(), *containingModule)); 429 } 430 else 431 { 432 if (m_search_filter_sp.get() == NULL) 433 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 434 filter_sp = m_search_filter_sp; 435 } 436 return filter_sp; 437 } 438 439 SearchFilterSP 440 Target::GetSearchFilterForModuleList (const FileSpecList *containingModules) 441 { 442 SearchFilterSP filter_sp; 443 if (containingModules && containingModules->GetSize() != 0) 444 { 445 // TODO: We should look into sharing module based search filters 446 // across many breakpoints like we do for the simple target based one 447 filter_sp.reset (new SearchFilterByModuleList (shared_from_this(), *containingModules)); 448 } 449 else 450 { 451 if (m_search_filter_sp.get() == NULL) 452 m_search_filter_sp.reset (new SearchFilterForNonModuleSpecificSearches (shared_from_this())); 453 filter_sp = m_search_filter_sp; 454 } 455 return filter_sp; 456 } 457 458 SearchFilterSP 459 Target::GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, 460 const FileSpecList *containingSourceFiles) 461 { 462 if (containingSourceFiles == NULL || containingSourceFiles->GetSize() == 0) 463 return GetSearchFilterForModuleList(containingModules); 464 465 SearchFilterSP filter_sp; 466 if (containingModules == NULL) 467 { 468 // We could make a special "CU List only SearchFilter". Better yet was if these could be composable, 469 // but that will take a little reworking. 470 471 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), FileSpecList(), *containingSourceFiles)); 472 } 473 else 474 { 475 filter_sp.reset (new SearchFilterByModuleListAndCU (shared_from_this(), *containingModules, *containingSourceFiles)); 476 } 477 return filter_sp; 478 } 479 480 BreakpointSP 481 Target::CreateFuncRegexBreakpoint (const FileSpecList *containingModules, 482 const FileSpecList *containingSourceFiles, 483 RegularExpression &func_regex, 484 LazyBool skip_prologue, 485 bool internal, 486 bool hardware) 487 { 488 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList (containingModules, containingSourceFiles)); 489 BreakpointResolverSP resolver_sp(new BreakpointResolverName (NULL, 490 func_regex, 491 skip_prologue == eLazyBoolCalculate ? GetSkipPrologue() : skip_prologue)); 492 493 return CreateBreakpoint (filter_sp, resolver_sp, internal, hardware, true); 494 } 495 496 lldb::BreakpointSP 497 Target::CreateExceptionBreakpoint (enum lldb::LanguageType language, bool catch_bp, bool throw_bp, bool internal) 498 { 499 return LanguageRuntime::CreateExceptionBreakpoint (*this, language, catch_bp, throw_bp, internal); 500 } 501 502 BreakpointSP 503 Target::CreateBreakpoint (SearchFilterSP &filter_sp, BreakpointResolverSP &resolver_sp, bool internal, bool request_hardware, bool resolve_indirect_symbols) 504 { 505 BreakpointSP bp_sp; 506 if (filter_sp && resolver_sp) 507 { 508 bp_sp.reset(new Breakpoint (*this, filter_sp, resolver_sp, request_hardware, resolve_indirect_symbols)); 509 resolver_sp->SetBreakpoint (bp_sp.get()); 510 511 if (internal) 512 m_internal_breakpoint_list.Add (bp_sp, false); 513 else 514 m_breakpoint_list.Add (bp_sp, true); 515 516 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 517 if (log) 518 { 519 StreamString s; 520 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 521 log->Printf ("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, internal ? "yes" : "no", s.GetData()); 522 } 523 524 bp_sp->ResolveBreakpoint(); 525 } 526 527 if (!internal && bp_sp) 528 { 529 m_last_created_breakpoint = bp_sp; 530 } 531 532 return bp_sp; 533 } 534 535 bool 536 Target::ProcessIsValid() 537 { 538 return (m_process_sp && m_process_sp->IsAlive()); 539 } 540 541 static bool 542 CheckIfWatchpointsExhausted(Target *target, Error &error) 543 { 544 uint32_t num_supported_hardware_watchpoints; 545 Error rc = target->GetProcessSP()->GetWatchpointSupportInfo(num_supported_hardware_watchpoints); 546 if (rc.Success()) 547 { 548 uint32_t num_current_watchpoints = target->GetWatchpointList().GetSize(); 549 if (num_current_watchpoints >= num_supported_hardware_watchpoints) 550 error.SetErrorStringWithFormat("number of supported hardware watchpoints (%u) has been reached", 551 num_supported_hardware_watchpoints); 552 } 553 return false; 554 } 555 556 // See also Watchpoint::SetWatchpointType(uint32_t type) and 557 // the OptionGroupWatchpoint::WatchType enum type. 558 WatchpointSP 559 Target::CreateWatchpoint(lldb::addr_t addr, size_t size, const ClangASTType *type, uint32_t kind, Error &error) 560 { 561 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 562 if (log) 563 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 " type = %u)\n", 564 __FUNCTION__, addr, (uint64_t)size, kind); 565 566 WatchpointSP wp_sp; 567 if (!ProcessIsValid()) 568 { 569 error.SetErrorString("process is not alive"); 570 return wp_sp; 571 } 572 573 if (addr == LLDB_INVALID_ADDRESS || size == 0) 574 { 575 if (size == 0) 576 error.SetErrorString("cannot set a watchpoint with watch_size of 0"); 577 else 578 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr); 579 return wp_sp; 580 } 581 582 if (!LLDB_WATCH_TYPE_IS_VALID(kind)) 583 { 584 error.SetErrorStringWithFormat ("invalid watchpoint type: %d", kind); 585 } 586 587 // Currently we only support one watchpoint per address, with total number 588 // of watchpoints limited by the hardware which the inferior is running on. 589 590 // Grab the list mutex while doing operations. 591 const bool notify = false; // Don't notify about all the state changes we do on creating the watchpoint. 592 Mutex::Locker locker; 593 this->GetWatchpointList().GetListMutex(locker); 594 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr); 595 if (matched_sp) 596 { 597 size_t old_size = matched_sp->GetByteSize(); 598 uint32_t old_type = 599 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) | 600 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0); 601 // Return the existing watchpoint if both size and type match. 602 if (size == old_size && kind == old_type) 603 { 604 wp_sp = matched_sp; 605 wp_sp->SetEnabled(false, notify); 606 } 607 else 608 { 609 // Nil the matched watchpoint; we will be creating a new one. 610 m_process_sp->DisableWatchpoint(matched_sp.get(), notify); 611 m_watchpoint_list.Remove(matched_sp->GetID(), true); 612 } 613 } 614 615 if (!wp_sp) 616 { 617 wp_sp.reset(new Watchpoint(*this, addr, size, type)); 618 wp_sp->SetWatchpointType(kind, notify); 619 m_watchpoint_list.Add (wp_sp, true); 620 } 621 622 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify); 623 if (log) 624 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n", 625 __FUNCTION__, 626 error.Success() ? "succeeded" : "failed", 627 wp_sp->GetID()); 628 629 if (error.Fail()) 630 { 631 // Enabling the watchpoint on the device side failed. 632 // Remove the said watchpoint from the list maintained by the target instance. 633 m_watchpoint_list.Remove (wp_sp->GetID(), true); 634 // See if we could provide more helpful error message. 635 if (!CheckIfWatchpointsExhausted(this, error)) 636 { 637 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size)) 638 error.SetErrorStringWithFormat("watch size of %" PRIu64 " is not supported", (uint64_t)size); 639 } 640 wp_sp.reset(); 641 } 642 else 643 m_last_created_watchpoint = wp_sp; 644 return wp_sp; 645 } 646 647 void 648 Target::RemoveAllBreakpoints (bool internal_also) 649 { 650 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 651 if (log) 652 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 653 654 m_breakpoint_list.RemoveAll (true); 655 if (internal_also) 656 m_internal_breakpoint_list.RemoveAll (false); 657 658 m_last_created_breakpoint.reset(); 659 } 660 661 void 662 Target::DisableAllBreakpoints (bool internal_also) 663 { 664 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 665 if (log) 666 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 667 668 m_breakpoint_list.SetEnabledAll (false); 669 if (internal_also) 670 m_internal_breakpoint_list.SetEnabledAll (false); 671 } 672 673 void 674 Target::EnableAllBreakpoints (bool internal_also) 675 { 676 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 677 if (log) 678 log->Printf ("Target::%s (internal_also = %s)\n", __FUNCTION__, internal_also ? "yes" : "no"); 679 680 m_breakpoint_list.SetEnabledAll (true); 681 if (internal_also) 682 m_internal_breakpoint_list.SetEnabledAll (true); 683 } 684 685 bool 686 Target::RemoveBreakpointByID (break_id_t break_id) 687 { 688 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 689 if (log) 690 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 691 692 if (DisableBreakpointByID (break_id)) 693 { 694 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 695 m_internal_breakpoint_list.Remove(break_id, false); 696 else 697 { 698 if (m_last_created_breakpoint) 699 { 700 if (m_last_created_breakpoint->GetID() == break_id) 701 m_last_created_breakpoint.reset(); 702 } 703 m_breakpoint_list.Remove(break_id, true); 704 } 705 return true; 706 } 707 return false; 708 } 709 710 bool 711 Target::DisableBreakpointByID (break_id_t break_id) 712 { 713 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 714 if (log) 715 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, break_id, LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 716 717 BreakpointSP bp_sp; 718 719 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 720 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 721 else 722 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 723 if (bp_sp) 724 { 725 bp_sp->SetEnabled (false); 726 return true; 727 } 728 return false; 729 } 730 731 bool 732 Target::EnableBreakpointByID (break_id_t break_id) 733 { 734 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS)); 735 if (log) 736 log->Printf ("Target::%s (break_id = %i, internal = %s)\n", 737 __FUNCTION__, 738 break_id, 739 LLDB_BREAK_ID_IS_INTERNAL (break_id) ? "yes" : "no"); 740 741 BreakpointSP bp_sp; 742 743 if (LLDB_BREAK_ID_IS_INTERNAL (break_id)) 744 bp_sp = m_internal_breakpoint_list.FindBreakpointByID (break_id); 745 else 746 bp_sp = m_breakpoint_list.FindBreakpointByID (break_id); 747 748 if (bp_sp) 749 { 750 bp_sp->SetEnabled (true); 751 return true; 752 } 753 return false; 754 } 755 756 // The flag 'end_to_end', default to true, signifies that the operation is 757 // performed end to end, for both the debugger and the debuggee. 758 759 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 760 // to end operations. 761 bool 762 Target::RemoveAllWatchpoints (bool end_to_end) 763 { 764 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 765 if (log) 766 log->Printf ("Target::%s\n", __FUNCTION__); 767 768 if (!end_to_end) { 769 m_watchpoint_list.RemoveAll(true); 770 return true; 771 } 772 773 // Otherwise, it's an end to end operation. 774 775 if (!ProcessIsValid()) 776 return false; 777 778 size_t num_watchpoints = m_watchpoint_list.GetSize(); 779 for (size_t i = 0; i < num_watchpoints; ++i) 780 { 781 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 782 if (!wp_sp) 783 return false; 784 785 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 786 if (rc.Fail()) 787 return false; 788 } 789 m_watchpoint_list.RemoveAll (true); 790 m_last_created_watchpoint.reset(); 791 return true; // Success! 792 } 793 794 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 795 // end operations. 796 bool 797 Target::DisableAllWatchpoints (bool end_to_end) 798 { 799 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 800 if (log) 801 log->Printf ("Target::%s\n", __FUNCTION__); 802 803 if (!end_to_end) { 804 m_watchpoint_list.SetEnabledAll(false); 805 return true; 806 } 807 808 // Otherwise, it's an end to end operation. 809 810 if (!ProcessIsValid()) 811 return false; 812 813 size_t num_watchpoints = m_watchpoint_list.GetSize(); 814 for (size_t i = 0; i < num_watchpoints; ++i) 815 { 816 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 817 if (!wp_sp) 818 return false; 819 820 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 821 if (rc.Fail()) 822 return false; 823 } 824 return true; // Success! 825 } 826 827 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end to 828 // end operations. 829 bool 830 Target::EnableAllWatchpoints (bool end_to_end) 831 { 832 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 833 if (log) 834 log->Printf ("Target::%s\n", __FUNCTION__); 835 836 if (!end_to_end) { 837 m_watchpoint_list.SetEnabledAll(true); 838 return true; 839 } 840 841 // Otherwise, it's an end to end operation. 842 843 if (!ProcessIsValid()) 844 return false; 845 846 size_t num_watchpoints = m_watchpoint_list.GetSize(); 847 for (size_t i = 0; i < num_watchpoints; ++i) 848 { 849 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 850 if (!wp_sp) 851 return false; 852 853 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 854 if (rc.Fail()) 855 return false; 856 } 857 return true; // Success! 858 } 859 860 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 861 bool 862 Target::ClearAllWatchpointHitCounts () 863 { 864 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 865 if (log) 866 log->Printf ("Target::%s\n", __FUNCTION__); 867 868 size_t num_watchpoints = m_watchpoint_list.GetSize(); 869 for (size_t i = 0; i < num_watchpoints; ++i) 870 { 871 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 872 if (!wp_sp) 873 return false; 874 875 wp_sp->ResetHitCount(); 876 } 877 return true; // Success! 878 } 879 880 // Assumption: Caller holds the list mutex lock for m_watchpoint_list 881 // during these operations. 882 bool 883 Target::IgnoreAllWatchpoints (uint32_t ignore_count) 884 { 885 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 886 if (log) 887 log->Printf ("Target::%s\n", __FUNCTION__); 888 889 if (!ProcessIsValid()) 890 return false; 891 892 size_t num_watchpoints = m_watchpoint_list.GetSize(); 893 for (size_t i = 0; i < num_watchpoints; ++i) 894 { 895 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 896 if (!wp_sp) 897 return false; 898 899 wp_sp->SetIgnoreCount(ignore_count); 900 } 901 return true; // Success! 902 } 903 904 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 905 bool 906 Target::DisableWatchpointByID (lldb::watch_id_t watch_id) 907 { 908 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 909 if (log) 910 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 911 912 if (!ProcessIsValid()) 913 return false; 914 915 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 916 if (wp_sp) 917 { 918 Error rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 919 if (rc.Success()) 920 return true; 921 922 // Else, fallthrough. 923 } 924 return false; 925 } 926 927 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 928 bool 929 Target::EnableWatchpointByID (lldb::watch_id_t watch_id) 930 { 931 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 932 if (log) 933 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 934 935 if (!ProcessIsValid()) 936 return false; 937 938 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 939 if (wp_sp) 940 { 941 Error rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 942 if (rc.Success()) 943 return true; 944 945 // Else, fallthrough. 946 } 947 return false; 948 } 949 950 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 951 bool 952 Target::RemoveWatchpointByID (lldb::watch_id_t watch_id) 953 { 954 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 955 if (log) 956 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 957 958 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id); 959 if (watch_to_remove_sp == m_last_created_watchpoint) 960 m_last_created_watchpoint.reset(); 961 962 if (DisableWatchpointByID (watch_id)) 963 { 964 m_watchpoint_list.Remove(watch_id, true); 965 return true; 966 } 967 return false; 968 } 969 970 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 971 bool 972 Target::IgnoreWatchpointByID (lldb::watch_id_t watch_id, uint32_t ignore_count) 973 { 974 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_WATCHPOINTS)); 975 if (log) 976 log->Printf ("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 977 978 if (!ProcessIsValid()) 979 return false; 980 981 WatchpointSP wp_sp = m_watchpoint_list.FindByID (watch_id); 982 if (wp_sp) 983 { 984 wp_sp->SetIgnoreCount(ignore_count); 985 return true; 986 } 987 return false; 988 } 989 990 ModuleSP 991 Target::GetExecutableModule () 992 { 993 return m_images.GetModuleAtIndex(0); 994 } 995 996 Module* 997 Target::GetExecutableModulePointer () 998 { 999 return m_images.GetModulePointerAtIndex(0); 1000 } 1001 1002 static void 1003 LoadScriptingResourceForModule (const ModuleSP &module_sp, Target *target) 1004 { 1005 Error error; 1006 StreamString feedback_stream; 1007 if (module_sp && !module_sp->LoadScriptingResourceInTarget(target, error, &feedback_stream)) 1008 { 1009 if (error.AsCString()) 1010 target->GetDebugger().GetErrorFile()->Printf("unable to load scripting data for module %s - error reported was %s\n", 1011 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(), 1012 error.AsCString()); 1013 if (feedback_stream.GetSize()) 1014 target->GetDebugger().GetErrorFile()->Printf("%s\n", 1015 feedback_stream.GetData()); 1016 } 1017 } 1018 1019 void 1020 Target::ClearModules(bool delete_locations) 1021 { 1022 ModulesDidUnload (m_images, delete_locations); 1023 m_section_load_history.Clear(); 1024 m_images.Clear(); 1025 m_scratch_ast_context_ap.reset(); 1026 m_scratch_ast_source_ap.reset(); 1027 m_ast_importer_ap.reset(); 1028 } 1029 1030 void 1031 Target::DidExec () 1032 { 1033 // When a process exec's we need to know about it so we can do some cleanup. 1034 m_breakpoint_list.RemoveInvalidLocations(m_arch); 1035 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch); 1036 } 1037 1038 void 1039 Target::SetExecutableModule (ModuleSP& executable_sp, bool get_dependent_files) 1040 { 1041 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 1042 ClearModules(false); 1043 1044 if (executable_sp.get()) 1045 { 1046 Timer scoped_timer (__PRETTY_FUNCTION__, 1047 "Target::SetExecutableModule (executable = '%s')", 1048 executable_sp->GetFileSpec().GetPath().c_str()); 1049 1050 m_images.Append(executable_sp); // The first image is our exectuable file 1051 1052 // If we haven't set an architecture yet, reset our architecture based on what we found in the executable module. 1053 if (!m_arch.IsValid()) 1054 { 1055 m_arch = executable_sp->GetArchitecture(); 1056 if (log) 1057 log->Printf ("Target::SetExecutableModule setting architecture to %s (%s) based on executable file", m_arch.GetArchitectureName(), m_arch.GetTriple().getTriple().c_str()); 1058 } 1059 1060 FileSpecList dependent_files; 1061 ObjectFile *executable_objfile = executable_sp->GetObjectFile(); 1062 1063 if (executable_objfile && get_dependent_files) 1064 { 1065 executable_objfile->GetDependentModules(dependent_files); 1066 for (uint32_t i=0; i<dependent_files.GetSize(); i++) 1067 { 1068 FileSpec dependent_file_spec (dependent_files.GetFileSpecPointerAtIndex(i)); 1069 FileSpec platform_dependent_file_spec; 1070 if (m_platform_sp) 1071 m_platform_sp->GetFileWithUUID (dependent_file_spec, NULL, platform_dependent_file_spec); 1072 else 1073 platform_dependent_file_spec = dependent_file_spec; 1074 1075 ModuleSpec module_spec (platform_dependent_file_spec, m_arch); 1076 ModuleSP image_module_sp(GetSharedModule (module_spec)); 1077 if (image_module_sp.get()) 1078 { 1079 ObjectFile *objfile = image_module_sp->GetObjectFile(); 1080 if (objfile) 1081 objfile->GetDependentModules(dependent_files); 1082 } 1083 } 1084 } 1085 } 1086 } 1087 1088 1089 bool 1090 Target::SetArchitecture (const ArchSpec &arch_spec) 1091 { 1092 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TARGET)); 1093 if (m_arch.IsCompatibleMatch(arch_spec) || !m_arch.IsValid()) 1094 { 1095 // If we haven't got a valid arch spec, or the architectures are 1096 // compatible, so just update the architecture. Architectures can be 1097 // equal, yet the triple OS and vendor might change, so we need to do 1098 // the assignment here just in case. 1099 m_arch = arch_spec; 1100 if (log) 1101 log->Printf ("Target::SetArchitecture setting architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1102 return true; 1103 } 1104 else 1105 { 1106 // If we have an executable file, try to reset the executable to the desired architecture 1107 if (log) 1108 log->Printf ("Target::SetArchitecture changing architecture to %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1109 m_arch = arch_spec; 1110 ModuleSP executable_sp = GetExecutableModule (); 1111 1112 ClearModules(true); 1113 // Need to do something about unsetting breakpoints. 1114 1115 if (executable_sp) 1116 { 1117 if (log) 1118 log->Printf("Target::SetArchitecture Trying to select executable file architecture %s (%s)", arch_spec.GetArchitectureName(), arch_spec.GetTriple().getTriple().c_str()); 1119 ModuleSpec module_spec (executable_sp->GetFileSpec(), arch_spec); 1120 Error error = ModuleList::GetSharedModule (module_spec, 1121 executable_sp, 1122 &GetExecutableSearchPaths(), 1123 NULL, 1124 NULL); 1125 1126 if (!error.Fail() && executable_sp) 1127 { 1128 SetExecutableModule (executable_sp, true); 1129 return true; 1130 } 1131 } 1132 } 1133 return false; 1134 } 1135 1136 void 1137 Target::WillClearList (const ModuleList& module_list) 1138 { 1139 } 1140 1141 void 1142 Target::ModuleAdded (const ModuleList& module_list, const ModuleSP &module_sp) 1143 { 1144 // A module is being added to this target for the first time 1145 ModuleList my_module_list; 1146 my_module_list.Append(module_sp); 1147 LoadScriptingResourceForModule(module_sp, this); 1148 ModulesDidLoad (my_module_list); 1149 } 1150 1151 void 1152 Target::ModuleRemoved (const ModuleList& module_list, const ModuleSP &module_sp) 1153 { 1154 // A module is being added to this target for the first time 1155 ModuleList my_module_list; 1156 my_module_list.Append(module_sp); 1157 ModulesDidUnload (my_module_list, false); 1158 } 1159 1160 void 1161 Target::ModuleUpdated (const ModuleList& module_list, const ModuleSP &old_module_sp, const ModuleSP &new_module_sp) 1162 { 1163 // A module is replacing an already added module 1164 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, new_module_sp); 1165 } 1166 1167 void 1168 Target::ModulesDidLoad (ModuleList &module_list) 1169 { 1170 if (module_list.GetSize()) 1171 { 1172 m_breakpoint_list.UpdateBreakpoints (module_list, true, false); 1173 if (m_process_sp) 1174 { 1175 m_process_sp->ModulesDidLoad (module_list); 1176 } 1177 // TODO: make event data that packages up the module_list 1178 BroadcastEvent (eBroadcastBitModulesLoaded, NULL); 1179 } 1180 } 1181 1182 void 1183 Target::SymbolsDidLoad (ModuleList &module_list) 1184 { 1185 if (module_list.GetSize()) 1186 { 1187 if (m_process_sp) 1188 { 1189 LanguageRuntime* runtime = m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1190 if (runtime) 1191 { 1192 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime*)runtime; 1193 objc_runtime->SymbolsDidLoad(module_list); 1194 } 1195 } 1196 1197 m_breakpoint_list.UpdateBreakpoints (module_list, true, false); 1198 BroadcastEvent(eBroadcastBitSymbolsLoaded, NULL); 1199 } 1200 } 1201 1202 void 1203 Target::ModulesDidUnload (ModuleList &module_list, bool delete_locations) 1204 { 1205 if (module_list.GetSize()) 1206 { 1207 m_breakpoint_list.UpdateBreakpoints (module_list, false, delete_locations); 1208 // TODO: make event data that packages up the module_list 1209 BroadcastEvent (eBroadcastBitModulesUnloaded, NULL); 1210 } 1211 } 1212 1213 bool 1214 Target::ModuleIsExcludedForNonModuleSpecificSearches (const FileSpec &module_file_spec) 1215 { 1216 if (GetBreakpointsConsultPlatformAvoidList()) 1217 { 1218 ModuleList matchingModules; 1219 ModuleSpec module_spec (module_file_spec); 1220 size_t num_modules = GetImages().FindModules(module_spec, matchingModules); 1221 1222 // If there is more than one module for this file spec, only return true if ALL the modules are on the 1223 // black list. 1224 if (num_modules > 0) 1225 { 1226 for (size_t i = 0; i < num_modules; i++) 1227 { 1228 if (!ModuleIsExcludedForNonModuleSpecificSearches (matchingModules.GetModuleAtIndex(i))) 1229 return false; 1230 } 1231 return true; 1232 } 1233 } 1234 return false; 1235 } 1236 1237 bool 1238 Target::ModuleIsExcludedForNonModuleSpecificSearches (const lldb::ModuleSP &module_sp) 1239 { 1240 if (GetBreakpointsConsultPlatformAvoidList()) 1241 { 1242 if (m_platform_sp) 1243 return m_platform_sp->ModuleIsExcludedForNonModuleSpecificSearches (*this, module_sp); 1244 } 1245 return false; 1246 } 1247 1248 size_t 1249 Target::ReadMemoryFromFileCache (const Address& addr, void *dst, size_t dst_len, Error &error) 1250 { 1251 SectionSP section_sp (addr.GetSection()); 1252 if (section_sp) 1253 { 1254 // If the contents of this section are encrypted, the on-disk file is unusuable. Read only from live memory. 1255 if (section_sp->IsEncrypted()) 1256 { 1257 error.SetErrorString("section is encrypted"); 1258 return 0; 1259 } 1260 ModuleSP module_sp (section_sp->GetModule()); 1261 if (module_sp) 1262 { 1263 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile(); 1264 if (objfile) 1265 { 1266 size_t bytes_read = objfile->ReadSectionData (section_sp.get(), 1267 addr.GetOffset(), 1268 dst, 1269 dst_len); 1270 if (bytes_read > 0) 1271 return bytes_read; 1272 else 1273 error.SetErrorStringWithFormat("error reading data from section %s", section_sp->GetName().GetCString()); 1274 } 1275 else 1276 error.SetErrorString("address isn't from a object file"); 1277 } 1278 else 1279 error.SetErrorString("address isn't in a module"); 1280 } 1281 else 1282 error.SetErrorString("address doesn't contain a section that points to a section in a object file"); 1283 1284 return 0; 1285 } 1286 1287 size_t 1288 Target::ReadMemory (const Address& addr, 1289 bool prefer_file_cache, 1290 void *dst, 1291 size_t dst_len, 1292 Error &error, 1293 lldb::addr_t *load_addr_ptr) 1294 { 1295 error.Clear(); 1296 1297 // if we end up reading this from process memory, we will fill this 1298 // with the actual load address 1299 if (load_addr_ptr) 1300 *load_addr_ptr = LLDB_INVALID_ADDRESS; 1301 1302 size_t bytes_read = 0; 1303 1304 addr_t load_addr = LLDB_INVALID_ADDRESS; 1305 addr_t file_addr = LLDB_INVALID_ADDRESS; 1306 Address resolved_addr; 1307 if (!addr.IsSectionOffset()) 1308 { 1309 SectionLoadList §ion_load_list = GetSectionLoadList(); 1310 if (section_load_list.IsEmpty()) 1311 { 1312 // No sections are loaded, so we must assume we are not running 1313 // yet and anything we are given is a file address. 1314 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the file address 1315 m_images.ResolveFileAddress (file_addr, resolved_addr); 1316 } 1317 else 1318 { 1319 // We have at least one section loaded. This can be becuase 1320 // we have manually loaded some sections with "target modules load ..." 1321 // or because we have have a live process that has sections loaded 1322 // through the dynamic loader 1323 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its offset is the load address 1324 section_load_list.ResolveLoadAddress (load_addr, resolved_addr); 1325 } 1326 } 1327 if (!resolved_addr.IsValid()) 1328 resolved_addr = addr; 1329 1330 1331 if (prefer_file_cache) 1332 { 1333 bytes_read = ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1334 if (bytes_read > 0) 1335 return bytes_read; 1336 } 1337 1338 if (ProcessIsValid()) 1339 { 1340 if (load_addr == LLDB_INVALID_ADDRESS) 1341 load_addr = resolved_addr.GetLoadAddress (this); 1342 1343 if (load_addr == LLDB_INVALID_ADDRESS) 1344 { 1345 ModuleSP addr_module_sp (resolved_addr.GetModule()); 1346 if (addr_module_sp && addr_module_sp->GetFileSpec()) 1347 error.SetErrorStringWithFormat("%s[0x%" PRIx64 "] can't be resolved, %s in not currently loaded", 1348 addr_module_sp->GetFileSpec().GetFilename().AsCString(), 1349 resolved_addr.GetFileAddress(), 1350 addr_module_sp->GetFileSpec().GetFilename().AsCString()); 1351 else 1352 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", resolved_addr.GetFileAddress()); 1353 } 1354 else 1355 { 1356 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error); 1357 if (bytes_read != dst_len) 1358 { 1359 if (error.Success()) 1360 { 1361 if (bytes_read == 0) 1362 error.SetErrorStringWithFormat("read memory from 0x%" PRIx64 " failed", load_addr); 1363 else 1364 error.SetErrorStringWithFormat("only %" PRIu64 " of %" PRIu64 " bytes were read from memory at 0x%" PRIx64, (uint64_t)bytes_read, (uint64_t)dst_len, load_addr); 1365 } 1366 } 1367 if (bytes_read) 1368 { 1369 if (load_addr_ptr) 1370 *load_addr_ptr = load_addr; 1371 return bytes_read; 1372 } 1373 // If the address is not section offset we have an address that 1374 // doesn't resolve to any address in any currently loaded shared 1375 // libaries and we failed to read memory so there isn't anything 1376 // more we can do. If it is section offset, we might be able to 1377 // read cached memory from the object file. 1378 if (!resolved_addr.IsSectionOffset()) 1379 return 0; 1380 } 1381 } 1382 1383 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) 1384 { 1385 // If we didn't already try and read from the object file cache, then 1386 // try it after failing to read from the process. 1387 return ReadMemoryFromFileCache (resolved_addr, dst, dst_len, error); 1388 } 1389 return 0; 1390 } 1391 1392 size_t 1393 Target::ReadCStringFromMemory (const Address& addr, std::string &out_str, Error &error) 1394 { 1395 char buf[256]; 1396 out_str.clear(); 1397 addr_t curr_addr = addr.GetLoadAddress(this); 1398 Address address(addr); 1399 while (1) 1400 { 1401 size_t length = ReadCStringFromMemory (address, buf, sizeof(buf), error); 1402 if (length == 0) 1403 break; 1404 out_str.append(buf, length); 1405 // If we got "length - 1" bytes, we didn't get the whole C string, we 1406 // need to read some more characters 1407 if (length == sizeof(buf) - 1) 1408 curr_addr += length; 1409 else 1410 break; 1411 address = Address(curr_addr); 1412 } 1413 return out_str.size(); 1414 } 1415 1416 1417 size_t 1418 Target::ReadCStringFromMemory (const Address& addr, char *dst, size_t dst_max_len, Error &result_error) 1419 { 1420 size_t total_cstr_len = 0; 1421 if (dst && dst_max_len) 1422 { 1423 result_error.Clear(); 1424 // NULL out everything just to be safe 1425 memset (dst, 0, dst_max_len); 1426 Error error; 1427 addr_t curr_addr = addr.GetLoadAddress(this); 1428 Address address(addr); 1429 const size_t cache_line_size = 512; 1430 size_t bytes_left = dst_max_len - 1; 1431 char *curr_dst = dst; 1432 1433 while (bytes_left > 0) 1434 { 1435 addr_t cache_line_bytes_left = cache_line_size - (curr_addr % cache_line_size); 1436 addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left); 1437 size_t bytes_read = ReadMemory (address, false, curr_dst, bytes_to_read, error); 1438 1439 if (bytes_read == 0) 1440 { 1441 result_error = error; 1442 dst[total_cstr_len] = '\0'; 1443 break; 1444 } 1445 const size_t len = strlen(curr_dst); 1446 1447 total_cstr_len += len; 1448 1449 if (len < bytes_to_read) 1450 break; 1451 1452 curr_dst += bytes_read; 1453 curr_addr += bytes_read; 1454 bytes_left -= bytes_read; 1455 address = Address(curr_addr); 1456 } 1457 } 1458 else 1459 { 1460 if (dst == NULL) 1461 result_error.SetErrorString("invalid arguments"); 1462 else 1463 result_error.Clear(); 1464 } 1465 return total_cstr_len; 1466 } 1467 1468 size_t 1469 Target::ReadScalarIntegerFromMemory (const Address& addr, 1470 bool prefer_file_cache, 1471 uint32_t byte_size, 1472 bool is_signed, 1473 Scalar &scalar, 1474 Error &error) 1475 { 1476 uint64_t uval; 1477 1478 if (byte_size <= sizeof(uval)) 1479 { 1480 size_t bytes_read = ReadMemory (addr, prefer_file_cache, &uval, byte_size, error); 1481 if (bytes_read == byte_size) 1482 { 1483 DataExtractor data (&uval, sizeof(uval), m_arch.GetByteOrder(), m_arch.GetAddressByteSize()); 1484 lldb::offset_t offset = 0; 1485 if (byte_size <= 4) 1486 scalar = data.GetMaxU32 (&offset, byte_size); 1487 else 1488 scalar = data.GetMaxU64 (&offset, byte_size); 1489 1490 if (is_signed) 1491 scalar.SignExtend(byte_size * 8); 1492 return bytes_read; 1493 } 1494 } 1495 else 1496 { 1497 error.SetErrorStringWithFormat ("byte size of %u is too large for integer scalar type", byte_size); 1498 } 1499 return 0; 1500 } 1501 1502 uint64_t 1503 Target::ReadUnsignedIntegerFromMemory (const Address& addr, 1504 bool prefer_file_cache, 1505 size_t integer_byte_size, 1506 uint64_t fail_value, 1507 Error &error) 1508 { 1509 Scalar scalar; 1510 if (ReadScalarIntegerFromMemory (addr, 1511 prefer_file_cache, 1512 integer_byte_size, 1513 false, 1514 scalar, 1515 error)) 1516 return scalar.ULongLong(fail_value); 1517 return fail_value; 1518 } 1519 1520 bool 1521 Target::ReadPointerFromMemory (const Address& addr, 1522 bool prefer_file_cache, 1523 Error &error, 1524 Address &pointer_addr) 1525 { 1526 Scalar scalar; 1527 if (ReadScalarIntegerFromMemory (addr, 1528 prefer_file_cache, 1529 m_arch.GetAddressByteSize(), 1530 false, 1531 scalar, 1532 error)) 1533 { 1534 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1535 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) 1536 { 1537 SectionLoadList §ion_load_list = GetSectionLoadList(); 1538 if (section_load_list.IsEmpty()) 1539 { 1540 // No sections are loaded, so we must assume we are not running 1541 // yet and anything we are given is a file address. 1542 m_images.ResolveFileAddress (pointer_vm_addr, pointer_addr); 1543 } 1544 else 1545 { 1546 // We have at least one section loaded. This can be becuase 1547 // we have manually loaded some sections with "target modules load ..." 1548 // or because we have have a live process that has sections loaded 1549 // through the dynamic loader 1550 section_load_list.ResolveLoadAddress (pointer_vm_addr, pointer_addr); 1551 } 1552 // We weren't able to resolve the pointer value, so just return 1553 // an address with no section 1554 if (!pointer_addr.IsValid()) 1555 pointer_addr.SetOffset (pointer_vm_addr); 1556 return true; 1557 1558 } 1559 } 1560 return false; 1561 } 1562 1563 ModuleSP 1564 Target::GetSharedModule (const ModuleSpec &module_spec, Error *error_ptr) 1565 { 1566 ModuleSP module_sp; 1567 1568 Error error; 1569 1570 // First see if we already have this module in our module list. If we do, then we're done, we don't need 1571 // to consult the shared modules list. But only do this if we are passed a UUID. 1572 1573 if (module_spec.GetUUID().IsValid()) 1574 module_sp = m_images.FindFirstModule(module_spec); 1575 1576 if (!module_sp) 1577 { 1578 ModuleSP old_module_sp; // This will get filled in if we have a new version of the library 1579 bool did_create_module = false; 1580 1581 // If there are image search path entries, try to use them first to acquire a suitable image. 1582 if (m_image_search_paths.GetSize()) 1583 { 1584 ModuleSpec transformed_spec (module_spec); 1585 if (m_image_search_paths.RemapPath (module_spec.GetFileSpec().GetDirectory(), transformed_spec.GetFileSpec().GetDirectory())) 1586 { 1587 transformed_spec.GetFileSpec().GetFilename() = module_spec.GetFileSpec().GetFilename(); 1588 error = ModuleList::GetSharedModule (transformed_spec, 1589 module_sp, 1590 &GetExecutableSearchPaths(), 1591 &old_module_sp, 1592 &did_create_module); 1593 } 1594 } 1595 1596 if (!module_sp) 1597 { 1598 // If we have a UUID, we can check our global shared module list in case 1599 // we already have it. If we don't have a valid UUID, then we can't since 1600 // the path in "module_spec" will be a platform path, and we will need to 1601 // let the platform find that file. For example, we could be asking for 1602 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick 1603 // the local copy of "/usr/lib/dyld" since our platform could be a remote 1604 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file 1605 // cache. 1606 if (module_spec.GetUUID().IsValid()) 1607 { 1608 // We have a UUID, it is OK to check the global module list... 1609 error = ModuleList::GetSharedModule (module_spec, 1610 module_sp, 1611 &GetExecutableSearchPaths(), 1612 &old_module_sp, 1613 &did_create_module); 1614 } 1615 1616 if (!module_sp) 1617 { 1618 // The platform is responsible for finding and caching an appropriate 1619 // module in the shared module cache. 1620 if (m_platform_sp) 1621 { 1622 FileSpec platform_file_spec; 1623 error = m_platform_sp->GetSharedModule (module_spec, 1624 module_sp, 1625 &GetExecutableSearchPaths(), 1626 &old_module_sp, 1627 &did_create_module); 1628 } 1629 else 1630 { 1631 error.SetErrorString("no platform is currently set"); 1632 } 1633 } 1634 } 1635 1636 // We found a module that wasn't in our target list. Let's make sure that there wasn't an equivalent 1637 // module in the list already, and if there was, let's remove it. 1638 if (module_sp) 1639 { 1640 ObjectFile *objfile = module_sp->GetObjectFile(); 1641 if (objfile) 1642 { 1643 switch (objfile->GetType()) 1644 { 1645 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of a program's execution state 1646 case ObjectFile::eTypeExecutable: /// A normal executable 1647 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker executable 1648 case ObjectFile::eTypeObjectFile: /// An intermediate object file 1649 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be used during execution 1650 break; 1651 case ObjectFile::eTypeDebugInfo: /// An object file that contains only debug information 1652 if (error_ptr) 1653 error_ptr->SetErrorString("debug info files aren't valid target modules, please specify an executable"); 1654 return ModuleSP(); 1655 case ObjectFile::eTypeStubLibrary: /// A library that can be linked against but not used for execution 1656 if (error_ptr) 1657 error_ptr->SetErrorString("stub libraries aren't valid target modules, please specify an executable"); 1658 return ModuleSP(); 1659 default: 1660 if (error_ptr) 1661 error_ptr->SetErrorString("unsupported file type, please specify an executable"); 1662 return ModuleSP(); 1663 } 1664 // GetSharedModule is not guaranteed to find the old shared module, for instance 1665 // in the common case where you pass in the UUID, it is only going to find the one 1666 // module matching the UUID. In fact, it has no good way to know what the "old module" 1667 // relevant to this target is, since there might be many copies of a module with this file spec 1668 // in various running debug sessions, but only one of them will belong to this target. 1669 // So let's remove the UUID from the module list, and look in the target's module list. 1670 // Only do this if there is SOMETHING else in the module spec... 1671 if (!old_module_sp) 1672 { 1673 if (module_spec.GetUUID().IsValid() && !module_spec.GetFileSpec().GetFilename().IsEmpty() && !module_spec.GetFileSpec().GetDirectory().IsEmpty()) 1674 { 1675 ModuleSpec module_spec_copy(module_spec.GetFileSpec()); 1676 module_spec_copy.GetUUID().Clear(); 1677 1678 ModuleList found_modules; 1679 size_t num_found = m_images.FindModules (module_spec_copy, found_modules); 1680 if (num_found == 1) 1681 { 1682 old_module_sp = found_modules.GetModuleAtIndex(0); 1683 } 1684 } 1685 } 1686 1687 if (old_module_sp && m_images.GetIndexForModule (old_module_sp.get()) != LLDB_INVALID_INDEX32) 1688 { 1689 m_images.ReplaceModule(old_module_sp, module_sp); 1690 Module *old_module_ptr = old_module_sp.get(); 1691 old_module_sp.reset(); 1692 ModuleList::RemoveSharedModuleIfOrphaned (old_module_ptr); 1693 } 1694 else 1695 m_images.Append(module_sp); 1696 } 1697 } 1698 } 1699 if (error_ptr) 1700 *error_ptr = error; 1701 return module_sp; 1702 } 1703 1704 1705 TargetSP 1706 Target::CalculateTarget () 1707 { 1708 return shared_from_this(); 1709 } 1710 1711 ProcessSP 1712 Target::CalculateProcess () 1713 { 1714 return ProcessSP(); 1715 } 1716 1717 ThreadSP 1718 Target::CalculateThread () 1719 { 1720 return ThreadSP(); 1721 } 1722 1723 StackFrameSP 1724 Target::CalculateStackFrame () 1725 { 1726 return StackFrameSP(); 1727 } 1728 1729 void 1730 Target::CalculateExecutionContext (ExecutionContext &exe_ctx) 1731 { 1732 exe_ctx.Clear(); 1733 exe_ctx.SetTargetPtr(this); 1734 } 1735 1736 PathMappingList & 1737 Target::GetImageSearchPathList () 1738 { 1739 return m_image_search_paths; 1740 } 1741 1742 void 1743 Target::ImageSearchPathsChanged 1744 ( 1745 const PathMappingList &path_list, 1746 void *baton 1747 ) 1748 { 1749 Target *target = (Target *)baton; 1750 ModuleSP exe_module_sp (target->GetExecutableModule()); 1751 if (exe_module_sp) 1752 target->SetExecutableModule (exe_module_sp, true); 1753 } 1754 1755 ClangASTContext * 1756 Target::GetScratchClangASTContext(bool create_on_demand) 1757 { 1758 // Now see if we know the target triple, and if so, create our scratch AST context: 1759 if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand) 1760 { 1761 m_scratch_ast_context_ap.reset (new ClangASTContext(m_arch.GetTriple().str().c_str())); 1762 m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this())); 1763 m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext()); 1764 llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy()); 1765 m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source); 1766 } 1767 return m_scratch_ast_context_ap.get(); 1768 } 1769 1770 ClangASTImporter * 1771 Target::GetClangASTImporter() 1772 { 1773 ClangASTImporter *ast_importer = m_ast_importer_ap.get(); 1774 1775 if (!ast_importer) 1776 { 1777 ast_importer = new ClangASTImporter(); 1778 m_ast_importer_ap.reset(ast_importer); 1779 } 1780 1781 return ast_importer; 1782 } 1783 1784 void 1785 Target::SettingsInitialize () 1786 { 1787 Process::SettingsInitialize (); 1788 } 1789 1790 void 1791 Target::SettingsTerminate () 1792 { 1793 Process::SettingsTerminate (); 1794 } 1795 1796 FileSpecList 1797 Target::GetDefaultExecutableSearchPaths () 1798 { 1799 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1800 if (properties_sp) 1801 return properties_sp->GetExecutableSearchPaths(); 1802 return FileSpecList(); 1803 } 1804 1805 FileSpecList 1806 Target::GetDefaultDebugFileSearchPaths () 1807 { 1808 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1809 if (properties_sp) 1810 return properties_sp->GetDebugFileSearchPaths(); 1811 return FileSpecList(); 1812 } 1813 1814 ArchSpec 1815 Target::GetDefaultArchitecture () 1816 { 1817 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1818 if (properties_sp) 1819 return properties_sp->GetDefaultArchitecture(); 1820 return ArchSpec(); 1821 } 1822 1823 void 1824 Target::SetDefaultArchitecture (const ArchSpec &arch) 1825 { 1826 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 1827 if (properties_sp) 1828 { 1829 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's default architecture to %s (%s)", arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str()); 1830 return properties_sp->SetDefaultArchitecture(arch); 1831 } 1832 } 1833 1834 Target * 1835 Target::GetTargetFromContexts (const ExecutionContext *exe_ctx_ptr, const SymbolContext *sc_ptr) 1836 { 1837 // The target can either exist in the "process" of ExecutionContext, or in 1838 // the "target_sp" member of SymbolContext. This accessor helper function 1839 // will get the target from one of these locations. 1840 1841 Target *target = NULL; 1842 if (sc_ptr != NULL) 1843 target = sc_ptr->target_sp.get(); 1844 if (target == NULL && exe_ctx_ptr) 1845 target = exe_ctx_ptr->GetTargetPtr(); 1846 return target; 1847 } 1848 1849 ExecutionResults 1850 Target::EvaluateExpression 1851 ( 1852 const char *expr_cstr, 1853 StackFrame *frame, 1854 lldb::ValueObjectSP &result_valobj_sp, 1855 const EvaluateExpressionOptions& options 1856 ) 1857 { 1858 result_valobj_sp.reset(); 1859 1860 ExecutionResults execution_results = eExecutionSetupError; 1861 1862 if (expr_cstr == NULL || expr_cstr[0] == '\0') 1863 return execution_results; 1864 1865 // We shouldn't run stop hooks in expressions. 1866 // Be sure to reset this if you return anywhere within this function. 1867 bool old_suppress_value = m_suppress_stop_hooks; 1868 m_suppress_stop_hooks = true; 1869 1870 ExecutionContext exe_ctx; 1871 1872 if (frame) 1873 { 1874 frame->CalculateExecutionContext(exe_ctx); 1875 } 1876 else if (m_process_sp) 1877 { 1878 m_process_sp->CalculateExecutionContext(exe_ctx); 1879 } 1880 else 1881 { 1882 CalculateExecutionContext(exe_ctx); 1883 } 1884 1885 // Make sure we aren't just trying to see the value of a persistent 1886 // variable (something like "$0") 1887 lldb::ClangExpressionVariableSP persistent_var_sp; 1888 // Only check for persistent variables the expression starts with a '$' 1889 if (expr_cstr[0] == '$') 1890 persistent_var_sp = m_persistent_variables.GetVariable (expr_cstr); 1891 1892 if (persistent_var_sp) 1893 { 1894 result_valobj_sp = persistent_var_sp->GetValueObject (); 1895 execution_results = eExecutionCompleted; 1896 } 1897 else 1898 { 1899 const char *prefix = GetExpressionPrefixContentsAsCString(); 1900 Error error; 1901 execution_results = ClangUserExpression::Evaluate (exe_ctx, 1902 options, 1903 expr_cstr, 1904 prefix, 1905 result_valobj_sp, 1906 error); 1907 } 1908 1909 m_suppress_stop_hooks = old_suppress_value; 1910 1911 return execution_results; 1912 } 1913 1914 lldb::addr_t 1915 Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 1916 { 1917 addr_t code_addr = load_addr; 1918 switch (m_arch.GetMachine()) 1919 { 1920 case llvm::Triple::arm: 1921 case llvm::Triple::thumb: 1922 switch (addr_class) 1923 { 1924 case eAddressClassData: 1925 case eAddressClassDebug: 1926 return LLDB_INVALID_ADDRESS; 1927 1928 case eAddressClassUnknown: 1929 case eAddressClassInvalid: 1930 case eAddressClassCode: 1931 case eAddressClassCodeAlternateISA: 1932 case eAddressClassRuntime: 1933 // Check if bit zero it no set? 1934 if ((code_addr & 1ull) == 0) 1935 { 1936 // Bit zero isn't set, check if the address is a multiple of 2? 1937 if (code_addr & 2ull) 1938 { 1939 // The address is a multiple of 2 so it must be thumb, set bit zero 1940 code_addr |= 1ull; 1941 } 1942 else if (addr_class == eAddressClassCodeAlternateISA) 1943 { 1944 // We checked the address and the address claims to be the alternate ISA 1945 // which means thumb, so set bit zero. 1946 code_addr |= 1ull; 1947 } 1948 } 1949 break; 1950 } 1951 break; 1952 1953 default: 1954 break; 1955 } 1956 return code_addr; 1957 } 1958 1959 lldb::addr_t 1960 Target::GetOpcodeLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const 1961 { 1962 addr_t opcode_addr = load_addr; 1963 switch (m_arch.GetMachine()) 1964 { 1965 case llvm::Triple::arm: 1966 case llvm::Triple::thumb: 1967 switch (addr_class) 1968 { 1969 case eAddressClassData: 1970 case eAddressClassDebug: 1971 return LLDB_INVALID_ADDRESS; 1972 1973 case eAddressClassInvalid: 1974 case eAddressClassUnknown: 1975 case eAddressClassCode: 1976 case eAddressClassCodeAlternateISA: 1977 case eAddressClassRuntime: 1978 opcode_addr &= ~(1ull); 1979 break; 1980 } 1981 break; 1982 1983 default: 1984 break; 1985 } 1986 return opcode_addr; 1987 } 1988 1989 SourceManager & 1990 Target::GetSourceManager () 1991 { 1992 if (m_source_manager_ap.get() == NULL) 1993 m_source_manager_ap.reset (new SourceManager(shared_from_this())); 1994 return *m_source_manager_ap; 1995 } 1996 1997 1998 Target::StopHookSP 1999 Target::CreateStopHook () 2000 { 2001 lldb::user_id_t new_uid = ++m_stop_hook_next_id; 2002 Target::StopHookSP stop_hook_sp (new StopHook(shared_from_this(), new_uid)); 2003 m_stop_hooks[new_uid] = stop_hook_sp; 2004 return stop_hook_sp; 2005 } 2006 2007 bool 2008 Target::RemoveStopHookByID (lldb::user_id_t user_id) 2009 { 2010 size_t num_removed; 2011 num_removed = m_stop_hooks.erase (user_id); 2012 if (num_removed == 0) 2013 return false; 2014 else 2015 return true; 2016 } 2017 2018 void 2019 Target::RemoveAllStopHooks () 2020 { 2021 m_stop_hooks.clear(); 2022 } 2023 2024 Target::StopHookSP 2025 Target::GetStopHookByID (lldb::user_id_t user_id) 2026 { 2027 StopHookSP found_hook; 2028 2029 StopHookCollection::iterator specified_hook_iter; 2030 specified_hook_iter = m_stop_hooks.find (user_id); 2031 if (specified_hook_iter != m_stop_hooks.end()) 2032 found_hook = (*specified_hook_iter).second; 2033 return found_hook; 2034 } 2035 2036 bool 2037 Target::SetStopHookActiveStateByID (lldb::user_id_t user_id, bool active_state) 2038 { 2039 StopHookCollection::iterator specified_hook_iter; 2040 specified_hook_iter = m_stop_hooks.find (user_id); 2041 if (specified_hook_iter == m_stop_hooks.end()) 2042 return false; 2043 2044 (*specified_hook_iter).second->SetIsActive (active_state); 2045 return true; 2046 } 2047 2048 void 2049 Target::SetAllStopHooksActiveState (bool active_state) 2050 { 2051 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2052 for (pos = m_stop_hooks.begin(); pos != end; pos++) 2053 { 2054 (*pos).second->SetIsActive (active_state); 2055 } 2056 } 2057 2058 void 2059 Target::RunStopHooks () 2060 { 2061 if (m_suppress_stop_hooks) 2062 return; 2063 2064 if (!m_process_sp) 2065 return; 2066 2067 // <rdar://problem/12027563> make sure we check that we are not stopped because of us running a user expression 2068 // since in that case we do not want to run the stop-hooks 2069 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression()) 2070 return; 2071 2072 if (m_stop_hooks.empty()) 2073 return; 2074 2075 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2076 2077 // If there aren't any active stop hooks, don't bother either: 2078 bool any_active_hooks = false; 2079 for (pos = m_stop_hooks.begin(); pos != end; pos++) 2080 { 2081 if ((*pos).second->IsActive()) 2082 { 2083 any_active_hooks = true; 2084 break; 2085 } 2086 } 2087 if (!any_active_hooks) 2088 return; 2089 2090 CommandReturnObject result; 2091 2092 std::vector<ExecutionContext> exc_ctx_with_reasons; 2093 std::vector<SymbolContext> sym_ctx_with_reasons; 2094 2095 ThreadList &cur_threadlist = m_process_sp->GetThreadList(); 2096 size_t num_threads = cur_threadlist.GetSize(); 2097 for (size_t i = 0; i < num_threads; i++) 2098 { 2099 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex (i); 2100 if (cur_thread_sp->ThreadStoppedForAReason()) 2101 { 2102 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0); 2103 exc_ctx_with_reasons.push_back(ExecutionContext(m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get())); 2104 sym_ctx_with_reasons.push_back(cur_frame_sp->GetSymbolContext(eSymbolContextEverything)); 2105 } 2106 } 2107 2108 // If no threads stopped for a reason, don't run the stop-hooks. 2109 size_t num_exe_ctx = exc_ctx_with_reasons.size(); 2110 if (num_exe_ctx == 0) 2111 return; 2112 2113 result.SetImmediateOutputStream (m_debugger.GetAsyncOutputStream()); 2114 result.SetImmediateErrorStream (m_debugger.GetAsyncErrorStream()); 2115 2116 bool keep_going = true; 2117 bool hooks_ran = false; 2118 bool print_hook_header; 2119 bool print_thread_header; 2120 2121 if (num_exe_ctx == 1) 2122 print_thread_header = false; 2123 else 2124 print_thread_header = true; 2125 2126 if (m_stop_hooks.size() == 1) 2127 print_hook_header = false; 2128 else 2129 print_hook_header = true; 2130 2131 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) 2132 { 2133 // result.Clear(); 2134 StopHookSP cur_hook_sp = (*pos).second; 2135 if (!cur_hook_sp->IsActive()) 2136 continue; 2137 2138 bool any_thread_matched = false; 2139 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) 2140 { 2141 if ((cur_hook_sp->GetSpecifier () == NULL 2142 || cur_hook_sp->GetSpecifier()->SymbolContextMatches(sym_ctx_with_reasons[i])) 2143 && (cur_hook_sp->GetThreadSpecifier() == NULL 2144 || cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests(exc_ctx_with_reasons[i].GetThreadRef()))) 2145 { 2146 if (!hooks_ran) 2147 { 2148 hooks_ran = true; 2149 } 2150 if (print_hook_header && !any_thread_matched) 2151 { 2152 const char *cmd = (cur_hook_sp->GetCommands().GetSize() == 1 ? 2153 cur_hook_sp->GetCommands().GetStringAtIndex(0) : 2154 NULL); 2155 if (cmd) 2156 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", cur_hook_sp->GetID(), cmd); 2157 else 2158 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", cur_hook_sp->GetID()); 2159 any_thread_matched = true; 2160 } 2161 2162 if (print_thread_header) 2163 result.AppendMessageWithFormat("-- Thread %d\n", exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID()); 2164 2165 bool stop_on_continue = true; 2166 bool stop_on_error = true; 2167 bool echo_commands = false; 2168 bool print_results = true; 2169 GetDebugger().GetCommandInterpreter().HandleCommands (cur_hook_sp->GetCommands(), 2170 &exc_ctx_with_reasons[i], 2171 stop_on_continue, 2172 stop_on_error, 2173 echo_commands, 2174 print_results, 2175 eLazyBoolNo, 2176 result); 2177 2178 // If the command started the target going again, we should bag out of 2179 // running the stop hooks. 2180 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) || 2181 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) 2182 { 2183 result.AppendMessageWithFormat ("Aborting stop hooks, hook %" PRIu64 " set the program running.", cur_hook_sp->GetID()); 2184 keep_going = false; 2185 } 2186 } 2187 } 2188 } 2189 2190 result.GetImmediateOutputStream()->Flush(); 2191 result.GetImmediateErrorStream()->Flush(); 2192 } 2193 2194 const TargetPropertiesSP & 2195 Target::GetGlobalProperties() 2196 { 2197 static TargetPropertiesSP g_settings_sp; 2198 if (!g_settings_sp) 2199 { 2200 g_settings_sp.reset (new TargetProperties (NULL)); 2201 } 2202 return g_settings_sp; 2203 } 2204 2205 Error 2206 Target::Install (ProcessLaunchInfo *launch_info) 2207 { 2208 Error error; 2209 PlatformSP platform_sp (GetPlatform()); 2210 if (platform_sp) 2211 { 2212 if (platform_sp->IsRemote()) 2213 { 2214 if (platform_sp->IsConnected()) 2215 { 2216 // Install all files that have an install path, and always install the 2217 // main executable when connected to a remote platform 2218 const ModuleList& modules = GetImages(); 2219 const size_t num_images = modules.GetSize(); 2220 for (size_t idx = 0; idx < num_images; ++idx) 2221 { 2222 const bool is_main_executable = idx == 0; 2223 ModuleSP module_sp(modules.GetModuleAtIndex(idx)); 2224 if (module_sp) 2225 { 2226 FileSpec local_file (module_sp->GetFileSpec()); 2227 if (local_file) 2228 { 2229 FileSpec remote_file (module_sp->GetRemoteInstallFileSpec()); 2230 if (!remote_file) 2231 { 2232 if (is_main_executable) // TODO: add setting for always installing main executable??? 2233 { 2234 // Always install the main executable 2235 remote_file.GetDirectory() = platform_sp->GetWorkingDirectory(); 2236 remote_file.GetFilename() = module_sp->GetFileSpec().GetFilename(); 2237 } 2238 } 2239 if (remote_file) 2240 { 2241 error = platform_sp->Install(local_file, remote_file); 2242 if (error.Success()) 2243 { 2244 module_sp->SetPlatformFileSpec(remote_file); 2245 if (is_main_executable) 2246 { 2247 if (launch_info) 2248 launch_info->SetExecutableFile(remote_file, false); 2249 } 2250 } 2251 else 2252 break; 2253 } 2254 } 2255 } 2256 } 2257 } 2258 } 2259 } 2260 return error; 2261 } 2262 2263 bool 2264 Target::ResolveLoadAddress (addr_t load_addr, Address &so_addr, uint32_t stop_id) 2265 { 2266 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr); 2267 } 2268 2269 bool 2270 Target::SetSectionLoadAddress (const SectionSP §ion_sp, addr_t new_section_load_addr, bool warn_multiple) 2271 { 2272 const addr_t old_section_load_addr = m_section_load_history.GetSectionLoadAddress (SectionLoadHistory::eStopIDNow, section_sp); 2273 if (old_section_load_addr != new_section_load_addr) 2274 { 2275 uint32_t stop_id = 0; 2276 ProcessSP process_sp(GetProcessSP()); 2277 if (process_sp) 2278 stop_id = process_sp->GetStopID(); 2279 else 2280 stop_id = m_section_load_history.GetLastStopID(); 2281 if (m_section_load_history.SetSectionLoadAddress (stop_id, section_sp, new_section_load_addr, warn_multiple)) 2282 return true; // Return true if the section load address was changed... 2283 } 2284 return false; // Return false to indicate nothing changed 2285 2286 } 2287 2288 bool 2289 Target::SetSectionUnloaded (const lldb::SectionSP §ion_sp) 2290 { 2291 uint32_t stop_id = 0; 2292 ProcessSP process_sp(GetProcessSP()); 2293 if (process_sp) 2294 stop_id = process_sp->GetStopID(); 2295 else 2296 stop_id = m_section_load_history.GetLastStopID(); 2297 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp); 2298 } 2299 2300 bool 2301 Target::SetSectionUnloaded (const lldb::SectionSP §ion_sp, addr_t load_addr) 2302 { 2303 uint32_t stop_id = 0; 2304 ProcessSP process_sp(GetProcessSP()); 2305 if (process_sp) 2306 stop_id = process_sp->GetStopID(); 2307 else 2308 stop_id = m_section_load_history.GetLastStopID(); 2309 return m_section_load_history.SetSectionUnloaded (stop_id, section_sp, load_addr); 2310 } 2311 2312 void 2313 Target::ClearAllLoadedSections () 2314 { 2315 m_section_load_history.Clear(); 2316 } 2317 2318 2319 Error 2320 Target::Launch (Listener &listener, ProcessLaunchInfo &launch_info) 2321 { 2322 Error error; 2323 2324 StateType state = eStateInvalid; 2325 2326 // Scope to temporarily get the process state in case someone has manually 2327 // remotely connected already to a process and we can skip the platform 2328 // launching. 2329 { 2330 ProcessSP process_sp (GetProcessSP()); 2331 2332 if (process_sp) 2333 state = process_sp->GetState(); 2334 } 2335 2336 launch_info.GetFlags().Set (eLaunchFlagDebug); 2337 2338 // Get the value of synchronous execution here. If you wait till after you have started to 2339 // run, then you could have hit a breakpoint, whose command might switch the value, and 2340 // then you'll pick up that incorrect value. 2341 Debugger &debugger = GetDebugger(); 2342 const bool synchronous_execution = debugger.GetCommandInterpreter().GetSynchronous (); 2343 2344 PlatformSP platform_sp (GetPlatform()); 2345 2346 // Finalize the file actions, and if none were given, default to opening 2347 // up a pseudo terminal 2348 const bool default_to_use_pty = platform_sp ? platform_sp->IsHost() : false; 2349 launch_info.FinalizeFileActions (this, default_to_use_pty); 2350 2351 if (state == eStateConnected) 2352 { 2353 if (launch_info.GetFlags().Test (eLaunchFlagLaunchInTTY)) 2354 { 2355 error.SetErrorString("can't launch in tty when launching through a remote connection"); 2356 return error; 2357 } 2358 } 2359 2360 if (!launch_info.GetArchitecture().IsValid()) 2361 launch_info.GetArchitecture() = GetArchitecture(); 2362 2363 if (state != eStateConnected && platform_sp && platform_sp->CanDebugProcess ()) 2364 { 2365 m_process_sp = GetPlatform()->DebugProcess (launch_info, 2366 debugger, 2367 this, 2368 listener, 2369 error); 2370 } 2371 else 2372 { 2373 if (state == eStateConnected) 2374 { 2375 assert(m_process_sp); 2376 } 2377 else 2378 { 2379 const char *plugin_name = launch_info.GetProcessPluginName(); 2380 CreateProcess (listener, plugin_name, NULL); 2381 } 2382 2383 if (m_process_sp) 2384 error = m_process_sp->Launch (launch_info); 2385 } 2386 2387 if (!m_process_sp) 2388 { 2389 if (error.Success()) 2390 error.SetErrorString("failed to launch or debug process"); 2391 return error; 2392 } 2393 2394 if (error.Success()) 2395 { 2396 if (launch_info.GetFlags().Test(eLaunchFlagStopAtEntry) == false) 2397 { 2398 ListenerSP hijack_listener_sp (launch_info.GetHijackListener()); 2399 2400 StateType state = m_process_sp->WaitForProcessToStop (NULL, NULL, false, hijack_listener_sp.get()); 2401 2402 if (state == eStateStopped) 2403 { 2404 if (!synchronous_execution) 2405 m_process_sp->RestoreProcessEvents (); 2406 2407 error = m_process_sp->PrivateResume(); 2408 2409 if (error.Success()) 2410 { 2411 if (synchronous_execution) 2412 { 2413 state = m_process_sp->WaitForProcessToStop (NULL, NULL, true, hijack_listener_sp.get()); 2414 const bool must_be_alive = false; // eStateExited is ok, so this must be false 2415 if (!StateIsStoppedState(state, must_be_alive)) 2416 { 2417 error.SetErrorStringWithFormat("process isn't stopped: %s", StateAsCString(state)); 2418 } 2419 } 2420 } 2421 else 2422 { 2423 Error error2; 2424 error2.SetErrorStringWithFormat("process resume at entry point failed: %s", error.AsCString()); 2425 error = error2; 2426 } 2427 } 2428 else 2429 { 2430 error.SetErrorStringWithFormat ("initial process state wasn't stopped: %s", StateAsCString(state)); 2431 } 2432 } 2433 m_process_sp->RestoreProcessEvents (); 2434 } 2435 else 2436 { 2437 Error error2; 2438 error2.SetErrorStringWithFormat ("process launch failed: %s", error.AsCString()); 2439 error = error2; 2440 } 2441 return error; 2442 } 2443 //-------------------------------------------------------------- 2444 // Target::StopHook 2445 //-------------------------------------------------------------- 2446 Target::StopHook::StopHook (lldb::TargetSP target_sp, lldb::user_id_t uid) : 2447 UserID (uid), 2448 m_target_sp (target_sp), 2449 m_commands (), 2450 m_specifier_sp (), 2451 m_thread_spec_ap(), 2452 m_active (true) 2453 { 2454 } 2455 2456 Target::StopHook::StopHook (const StopHook &rhs) : 2457 UserID (rhs.GetID()), 2458 m_target_sp (rhs.m_target_sp), 2459 m_commands (rhs.m_commands), 2460 m_specifier_sp (rhs.m_specifier_sp), 2461 m_thread_spec_ap (), 2462 m_active (rhs.m_active) 2463 { 2464 if (rhs.m_thread_spec_ap.get() != NULL) 2465 m_thread_spec_ap.reset (new ThreadSpec(*rhs.m_thread_spec_ap.get())); 2466 } 2467 2468 2469 Target::StopHook::~StopHook () 2470 { 2471 } 2472 2473 void 2474 Target::StopHook::SetThreadSpecifier (ThreadSpec *specifier) 2475 { 2476 m_thread_spec_ap.reset (specifier); 2477 } 2478 2479 2480 void 2481 Target::StopHook::GetDescription (Stream *s, lldb::DescriptionLevel level) const 2482 { 2483 int indent_level = s->GetIndentLevel(); 2484 2485 s->SetIndentLevel(indent_level + 2); 2486 2487 s->Printf ("Hook: %" PRIu64 "\n", GetID()); 2488 if (m_active) 2489 s->Indent ("State: enabled\n"); 2490 else 2491 s->Indent ("State: disabled\n"); 2492 2493 if (m_specifier_sp) 2494 { 2495 s->Indent(); 2496 s->PutCString ("Specifier:\n"); 2497 s->SetIndentLevel (indent_level + 4); 2498 m_specifier_sp->GetDescription (s, level); 2499 s->SetIndentLevel (indent_level + 2); 2500 } 2501 2502 if (m_thread_spec_ap.get() != NULL) 2503 { 2504 StreamString tmp; 2505 s->Indent("Thread:\n"); 2506 m_thread_spec_ap->GetDescription (&tmp, level); 2507 s->SetIndentLevel (indent_level + 4); 2508 s->Indent (tmp.GetData()); 2509 s->PutCString ("\n"); 2510 s->SetIndentLevel (indent_level + 2); 2511 } 2512 2513 s->Indent ("Commands: \n"); 2514 s->SetIndentLevel (indent_level + 4); 2515 uint32_t num_commands = m_commands.GetSize(); 2516 for (uint32_t i = 0; i < num_commands; i++) 2517 { 2518 s->Indent(m_commands.GetStringAtIndex(i)); 2519 s->PutCString ("\n"); 2520 } 2521 s->SetIndentLevel (indent_level); 2522 } 2523 2524 //-------------------------------------------------------------- 2525 // class TargetProperties 2526 //-------------------------------------------------------------- 2527 2528 OptionEnumValueElement 2529 lldb_private::g_dynamic_value_types[] = 2530 { 2531 { eNoDynamicValues, "no-dynamic-values", "Don't calculate the dynamic type of values"}, 2532 { eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values even if you have to run the target."}, 2533 { eDynamicDontRunTarget, "no-run-target", "Calculate the dynamic type of values, but don't run the target."}, 2534 { 0, NULL, NULL } 2535 }; 2536 2537 static OptionEnumValueElement 2538 g_inline_breakpoint_enums[] = 2539 { 2540 { eInlineBreakpointsNever, "never", "Never look for inline breakpoint locations (fastest). This setting should only be used if you know that no inlining occurs in your programs."}, 2541 { eInlineBreakpointsHeaders, "headers", "Only check for inline breakpoint locations when setting breakpoints in header files, but not when setting breakpoint in implementation source files (default)."}, 2542 { eInlineBreakpointsAlways, "always", "Always look for inline breakpoint locations when setting file and line breakpoints (slower but most accurate)."}, 2543 { 0, NULL, NULL } 2544 }; 2545 2546 typedef enum x86DisassemblyFlavor 2547 { 2548 eX86DisFlavorDefault, 2549 eX86DisFlavorIntel, 2550 eX86DisFlavorATT 2551 } x86DisassemblyFlavor; 2552 2553 static OptionEnumValueElement 2554 g_x86_dis_flavor_value_types[] = 2555 { 2556 { eX86DisFlavorDefault, "default", "Disassembler default (currently att)."}, 2557 { eX86DisFlavorIntel, "intel", "Intel disassembler flavor."}, 2558 { eX86DisFlavorATT, "att", "AT&T disassembler flavor."}, 2559 { 0, NULL, NULL } 2560 }; 2561 2562 static OptionEnumValueElement 2563 g_hex_immediate_style_values[] = 2564 { 2565 { Disassembler::eHexStyleC, "c", "C-style (0xffff)."}, 2566 { Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."}, 2567 { 0, NULL, NULL } 2568 }; 2569 2570 static OptionEnumValueElement 2571 g_load_script_from_sym_file_values[] = 2572 { 2573 { eLoadScriptFromSymFileTrue, "true", "Load debug scripts inside symbol files"}, 2574 { eLoadScriptFromSymFileFalse, "false", "Do not load debug scripts inside symbol files."}, 2575 { eLoadScriptFromSymFileWarn, "warn", "Warn about debug scripts inside symbol files but do not load them."}, 2576 { 0, NULL, NULL } 2577 }; 2578 2579 2580 static OptionEnumValueElement 2581 g_memory_module_load_level_values[] = 2582 { 2583 { eMemoryModuleLoadLevelMinimal, "minimal" , "Load minimal information when loading modules from memory. Currently this setting loads sections only."}, 2584 { eMemoryModuleLoadLevelPartial, "partial" , "Load partial information when loading modules from memory. Currently this setting loads sections and function bounds."}, 2585 { eMemoryModuleLoadLevelComplete, "complete", "Load complete information when loading modules from memory. Currently this setting loads sections and all symbols."}, 2586 { 0, NULL, NULL } 2587 }; 2588 2589 static PropertyDefinition 2590 g_properties[] = 2591 { 2592 { "default-arch" , OptionValue::eTypeArch , true , 0 , NULL, NULL, "Default architecture to choose, when there's a choice." }, 2593 { "expr-prefix" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "Path to a file containing expressions to be prepended to all expressions." }, 2594 { "prefer-dynamic-value" , OptionValue::eTypeEnum , false, eNoDynamicValues , NULL, g_dynamic_value_types, "Should printed values be shown as their dynamic value." }, 2595 { "enable-synthetic-value" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Should synthetic values be used by default whenever available." }, 2596 { "skip-prologue" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Skip function prologues when setting breakpoints by name." }, 2597 { "source-map" , OptionValue::eTypePathMap , false, 0 , NULL, NULL, "Source path remappings used to track the change of location between a source file when built, and " 2598 "where it exists on the current system. It consists of an array of duples, the first element of each duple is " 2599 "some part (starting at the root) of the path to the file when it was built, " 2600 "and the second is where the remainder of the original build hierarchy is rooted on the local system. " 2601 "Each element of the array is checked in order and the first one that results in a match wins." }, 2602 { "exec-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "Executable search paths to use when locating executable files whose paths don't match the local file system." }, 2603 { "debug-file-search-paths" , OptionValue::eTypeFileSpecList, false, 0 , NULL, NULL, "List of directories to be searched when locating debug symbol files." }, 2604 { "max-children-count" , OptionValue::eTypeSInt64 , false, 256 , NULL, NULL, "Maximum number of children to expand in any level of depth." }, 2605 { "max-string-summary-length" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of characters to show when using %s in summary strings." }, 2606 { "max-memory-read-size" , OptionValue::eTypeSInt64 , false, 1024 , NULL, NULL, "Maximum number of bytes that 'memory read' will fetch before --force must be specified." }, 2607 { "breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean , false, true , NULL, NULL, "Consult the platform module avoid list when setting non-module specific breakpoints." }, 2608 { "arg0" , OptionValue::eTypeString , false, 0 , NULL, NULL, "The first argument passed to the program in the argument array which can be different from the executable itself." }, 2609 { "run-args" , OptionValue::eTypeArgs , false, 0 , NULL, NULL, "A list containing all the arguments to be passed to the executable when it is run. Note that this does NOT include the argv[0] which is in target.arg0." }, 2610 { "env-vars" , OptionValue::eTypeDictionary, false, OptionValue::eTypeString , NULL, NULL, "A list of all the environment variables to be passed to the executable's environment, and their values." }, 2611 { "inherit-env" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Inherit the environment from the process that is running LLDB." }, 2612 { "input-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for reading its standard input." }, 2613 { "output-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard output." }, 2614 { "error-path" , OptionValue::eTypeFileSpec , false, 0 , NULL, NULL, "The file/path to be used by the executable program for writing its standard error." }, 2615 { "disable-aslr" , OptionValue::eTypeBoolean , false, true , NULL, NULL, "Disable Address Space Layout Randomization (ASLR)" }, 2616 { "disable-stdio" , OptionValue::eTypeBoolean , false, false , NULL, NULL, "Disable stdin/stdout for process (e.g. for a GUI application)" }, 2617 { "inline-breakpoint-strategy" , OptionValue::eTypeEnum , false, eInlineBreakpointsHeaders , NULL, g_inline_breakpoint_enums, "The strategy to use when settings breakpoints by file and line. " 2618 "Breakpoint locations can end up being inlined by the compiler, so that a compile unit 'a.c' might contain an inlined function from another source file. " 2619 "Usually this is limitted to breakpoint locations from inlined functions from header or other include files, or more accurately non-implementation source files. " 2620 "Sometimes code might #include implementation files and cause inlined breakpoint locations in inlined implementation files. " 2621 "Always checking for inlined breakpoint locations can be expensive (memory and time), so we try to minimize the " 2622 "times we look for inlined locations. This setting allows you to control exactly which strategy is used when settings " 2623 "file and line breakpoints." }, 2624 // FIXME: This is the wrong way to do per-architecture settings, but we don't have a general per architecture settings system in place yet. 2625 { "x86-disassembly-flavor" , OptionValue::eTypeEnum , false, eX86DisFlavorDefault, NULL, g_x86_dis_flavor_value_types, "The default disassembly flavor to use for x86 or x86-64 targets." }, 2626 { "use-hex-immediates" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Show immediates in disassembly as hexadecimal." }, 2627 { "hex-immediate-style" , OptionValue::eTypeEnum , false, Disassembler::eHexStyleC, NULL, g_hex_immediate_style_values, "Which style to use for printing hexadecimal disassembly values." }, 2628 { "use-fast-stepping" , OptionValue::eTypeBoolean , false, true, NULL, NULL, "Use a fast stepping algorithm based on running from branch to branch rather than instruction single-stepping." }, 2629 { "load-script-from-symbol-file" , OptionValue::eTypeEnum , false, eLoadScriptFromSymFileWarn, NULL, g_load_script_from_sym_file_values, "Allow LLDB to load scripting resources embedded in symbol files when available." }, 2630 { "memory-module-load-level" , OptionValue::eTypeEnum , false, eMemoryModuleLoadLevelComplete, NULL, g_memory_module_load_level_values, 2631 "Loading modules from memory can be slow as reading the symbol tables and other data can take a long time depending on your connection to the debug target. " 2632 "This setting helps users control how much information gets loaded when loading modules from memory." 2633 "'complete' is the default value for this setting which will load all sections and symbols by reading them from memory (slowest, most accurate). " 2634 "'partial' will load sections and attempt to find function bounds without downloading the symbol table (faster, still accurate, missing symbol names). " 2635 "'minimal' is the fastest setting and will load section data with no symbols, but should rarely be used as stack frames in these memory regions will be inaccurate and not provide any context (fastest). " }, 2636 { "display-expression-in-crashlogs" , OptionValue::eTypeBoolean , false, false, NULL, NULL, "Expressions that crash will show up in crash logs if the host system supports executable specific crash log strings and this setting is set to true." }, 2637 { "trap-handler-names" , OptionValue::eTypeArray , true, OptionValue::eTypeString, NULL, NULL, "A list of trap handler function names, e.g. a common Unix user process one is _sigtramp." }, 2638 { NULL , OptionValue::eTypeInvalid , false, 0 , NULL, NULL, NULL } 2639 }; 2640 enum 2641 { 2642 ePropertyDefaultArch, 2643 ePropertyExprPrefix, 2644 ePropertyPreferDynamic, 2645 ePropertyEnableSynthetic, 2646 ePropertySkipPrologue, 2647 ePropertySourceMap, 2648 ePropertyExecutableSearchPaths, 2649 ePropertyDebugFileSearchPaths, 2650 ePropertyMaxChildrenCount, 2651 ePropertyMaxSummaryLength, 2652 ePropertyMaxMemReadSize, 2653 ePropertyBreakpointUseAvoidList, 2654 ePropertyArg0, 2655 ePropertyRunArgs, 2656 ePropertyEnvVars, 2657 ePropertyInheritEnv, 2658 ePropertyInputPath, 2659 ePropertyOutputPath, 2660 ePropertyErrorPath, 2661 ePropertyDisableASLR, 2662 ePropertyDisableSTDIO, 2663 ePropertyInlineStrategy, 2664 ePropertyDisassemblyFlavor, 2665 ePropertyUseHexImmediates, 2666 ePropertyHexImmediateStyle, 2667 ePropertyUseFastStepping, 2668 ePropertyLoadScriptFromSymbolFile, 2669 ePropertyMemoryModuleLoadLevel, 2670 ePropertyDisplayExpressionsInCrashlogs, 2671 ePropertyTrapHandlerNames 2672 }; 2673 2674 2675 class TargetOptionValueProperties : public OptionValueProperties 2676 { 2677 public: 2678 TargetOptionValueProperties (const ConstString &name) : 2679 OptionValueProperties (name), 2680 m_target (NULL), 2681 m_got_host_env (false) 2682 { 2683 } 2684 2685 // This constructor is used when creating TargetOptionValueProperties when it 2686 // is part of a new lldb_private::Target instance. It will copy all current 2687 // global property values as needed 2688 TargetOptionValueProperties (Target *target, const TargetPropertiesSP &target_properties_sp) : 2689 OptionValueProperties(*target_properties_sp->GetValueProperties()), 2690 m_target (target), 2691 m_got_host_env (false) 2692 { 2693 } 2694 2695 virtual const Property * 2696 GetPropertyAtIndex (const ExecutionContext *exe_ctx, bool will_modify, uint32_t idx) const 2697 { 2698 // When gettings the value for a key from the target options, we will always 2699 // try and grab the setting from the current target if there is one. Else we just 2700 // use the one from this instance. 2701 if (idx == ePropertyEnvVars) 2702 GetHostEnvironmentIfNeeded (); 2703 2704 if (exe_ctx) 2705 { 2706 Target *target = exe_ctx->GetTargetPtr(); 2707 if (target) 2708 { 2709 TargetOptionValueProperties *target_properties = static_cast<TargetOptionValueProperties *>(target->GetValueProperties().get()); 2710 if (this != target_properties) 2711 return target_properties->ProtectedGetPropertyAtIndex (idx); 2712 } 2713 } 2714 return ProtectedGetPropertyAtIndex (idx); 2715 } 2716 2717 lldb::TargetSP 2718 GetTargetSP () 2719 { 2720 return m_target->shared_from_this(); 2721 } 2722 2723 protected: 2724 2725 void 2726 GetHostEnvironmentIfNeeded () const 2727 { 2728 if (!m_got_host_env) 2729 { 2730 if (m_target) 2731 { 2732 m_got_host_env = true; 2733 const uint32_t idx = ePropertyInheritEnv; 2734 if (GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0)) 2735 { 2736 PlatformSP platform_sp (m_target->GetPlatform()); 2737 if (platform_sp) 2738 { 2739 StringList env; 2740 if (platform_sp->GetEnvironment(env)) 2741 { 2742 OptionValueDictionary *env_dict = GetPropertyAtIndexAsOptionValueDictionary (NULL, ePropertyEnvVars); 2743 if (env_dict) 2744 { 2745 const bool can_replace = false; 2746 const size_t envc = env.GetSize(); 2747 for (size_t idx=0; idx<envc; idx++) 2748 { 2749 const char *env_entry = env.GetStringAtIndex (idx); 2750 if (env_entry) 2751 { 2752 const char *equal_pos = ::strchr(env_entry, '='); 2753 ConstString key; 2754 // It is ok to have environment variables with no values 2755 const char *value = NULL; 2756 if (equal_pos) 2757 { 2758 key.SetCStringWithLength(env_entry, equal_pos - env_entry); 2759 if (equal_pos[1]) 2760 value = equal_pos + 1; 2761 } 2762 else 2763 { 2764 key.SetCString(env_entry); 2765 } 2766 // Don't allow existing keys to be replaced with ones we get from the platform environment 2767 env_dict->SetValueForKey(key, OptionValueSP(new OptionValueString(value)), can_replace); 2768 } 2769 } 2770 } 2771 } 2772 } 2773 } 2774 } 2775 } 2776 } 2777 Target *m_target; 2778 mutable bool m_got_host_env; 2779 }; 2780 2781 //---------------------------------------------------------------------- 2782 // TargetProperties 2783 //---------------------------------------------------------------------- 2784 TargetProperties::TargetProperties (Target *target) : 2785 Properties () 2786 { 2787 if (target) 2788 { 2789 m_collection_sp.reset (new TargetOptionValueProperties(target, Target::GetGlobalProperties())); 2790 } 2791 else 2792 { 2793 m_collection_sp.reset (new TargetOptionValueProperties(ConstString("target"))); 2794 m_collection_sp->Initialize(g_properties); 2795 m_collection_sp->AppendProperty(ConstString("process"), 2796 ConstString("Settings specify to processes."), 2797 true, 2798 Process::GetGlobalProperties()->GetValueProperties()); 2799 } 2800 } 2801 2802 TargetProperties::~TargetProperties () 2803 { 2804 } 2805 ArchSpec 2806 TargetProperties::GetDefaultArchitecture () const 2807 { 2808 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 2809 if (value) 2810 return value->GetCurrentValue(); 2811 return ArchSpec(); 2812 } 2813 2814 void 2815 TargetProperties::SetDefaultArchitecture (const ArchSpec& arch) 2816 { 2817 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch (NULL, ePropertyDefaultArch); 2818 if (value) 2819 return value->SetCurrentValue(arch, true); 2820 } 2821 2822 lldb::DynamicValueType 2823 TargetProperties::GetPreferDynamicValue() const 2824 { 2825 const uint32_t idx = ePropertyPreferDynamic; 2826 return (lldb::DynamicValueType)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 2827 } 2828 2829 bool 2830 TargetProperties::GetDisableASLR () const 2831 { 2832 const uint32_t idx = ePropertyDisableASLR; 2833 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2834 } 2835 2836 void 2837 TargetProperties::SetDisableASLR (bool b) 2838 { 2839 const uint32_t idx = ePropertyDisableASLR; 2840 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 2841 } 2842 2843 bool 2844 TargetProperties::GetDisableSTDIO () const 2845 { 2846 const uint32_t idx = ePropertyDisableSTDIO; 2847 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2848 } 2849 2850 void 2851 TargetProperties::SetDisableSTDIO (bool b) 2852 { 2853 const uint32_t idx = ePropertyDisableSTDIO; 2854 m_collection_sp->SetPropertyAtIndexAsBoolean (NULL, idx, b); 2855 } 2856 2857 const char * 2858 TargetProperties::GetDisassemblyFlavor () const 2859 { 2860 const uint32_t idx = ePropertyDisassemblyFlavor; 2861 const char *return_value; 2862 2863 x86DisassemblyFlavor flavor_value = (x86DisassemblyFlavor) m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 2864 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value; 2865 return return_value; 2866 } 2867 2868 InlineStrategy 2869 TargetProperties::GetInlineStrategy () const 2870 { 2871 const uint32_t idx = ePropertyInlineStrategy; 2872 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration (NULL, idx, g_properties[idx].default_uint_value); 2873 } 2874 2875 const char * 2876 TargetProperties::GetArg0 () const 2877 { 2878 const uint32_t idx = ePropertyArg0; 2879 return m_collection_sp->GetPropertyAtIndexAsString (NULL, idx, NULL); 2880 } 2881 2882 void 2883 TargetProperties::SetArg0 (const char *arg) 2884 { 2885 const uint32_t idx = ePropertyArg0; 2886 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, arg); 2887 } 2888 2889 bool 2890 TargetProperties::GetRunArguments (Args &args) const 2891 { 2892 const uint32_t idx = ePropertyRunArgs; 2893 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args); 2894 } 2895 2896 void 2897 TargetProperties::SetRunArguments (const Args &args) 2898 { 2899 const uint32_t idx = ePropertyRunArgs; 2900 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args); 2901 } 2902 2903 size_t 2904 TargetProperties::GetEnvironmentAsArgs (Args &env) const 2905 { 2906 const uint32_t idx = ePropertyEnvVars; 2907 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, env); 2908 } 2909 2910 bool 2911 TargetProperties::GetSkipPrologue() const 2912 { 2913 const uint32_t idx = ePropertySkipPrologue; 2914 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2915 } 2916 2917 PathMappingList & 2918 TargetProperties::GetSourcePathMap () const 2919 { 2920 const uint32_t idx = ePropertySourceMap; 2921 OptionValuePathMappings *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings (NULL, false, idx); 2922 assert(option_value); 2923 return option_value->GetCurrentValue(); 2924 } 2925 2926 FileSpecList & 2927 TargetProperties::GetExecutableSearchPaths () 2928 { 2929 const uint32_t idx = ePropertyExecutableSearchPaths; 2930 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 2931 assert(option_value); 2932 return option_value->GetCurrentValue(); 2933 } 2934 2935 FileSpecList & 2936 TargetProperties::GetDebugFileSearchPaths () 2937 { 2938 const uint32_t idx = ePropertyDebugFileSearchPaths; 2939 OptionValueFileSpecList *option_value = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList (NULL, false, idx); 2940 assert(option_value); 2941 return option_value->GetCurrentValue(); 2942 } 2943 2944 bool 2945 TargetProperties::GetEnableSyntheticValue () const 2946 { 2947 const uint32_t idx = ePropertyEnableSynthetic; 2948 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 2949 } 2950 2951 uint32_t 2952 TargetProperties::GetMaximumNumberOfChildrenToDisplay() const 2953 { 2954 const uint32_t idx = ePropertyMaxChildrenCount; 2955 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 2956 } 2957 2958 uint32_t 2959 TargetProperties::GetMaximumSizeOfStringSummary() const 2960 { 2961 const uint32_t idx = ePropertyMaxSummaryLength; 2962 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 2963 } 2964 2965 uint32_t 2966 TargetProperties::GetMaximumMemReadSize () const 2967 { 2968 const uint32_t idx = ePropertyMaxMemReadSize; 2969 return m_collection_sp->GetPropertyAtIndexAsSInt64 (NULL, idx, g_properties[idx].default_uint_value); 2970 } 2971 2972 FileSpec 2973 TargetProperties::GetStandardInputPath () const 2974 { 2975 const uint32_t idx = ePropertyInputPath; 2976 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 2977 } 2978 2979 void 2980 TargetProperties::SetStandardInputPath (const char *p) 2981 { 2982 const uint32_t idx = ePropertyInputPath; 2983 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 2984 } 2985 2986 FileSpec 2987 TargetProperties::GetStandardOutputPath () const 2988 { 2989 const uint32_t idx = ePropertyOutputPath; 2990 return m_collection_sp->GetPropertyAtIndexAsFileSpec (NULL, idx); 2991 } 2992 2993 void 2994 TargetProperties::SetStandardOutputPath (const char *p) 2995 { 2996 const uint32_t idx = ePropertyOutputPath; 2997 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 2998 } 2999 3000 FileSpec 3001 TargetProperties::GetStandardErrorPath () const 3002 { 3003 const uint32_t idx = ePropertyErrorPath; 3004 return m_collection_sp->GetPropertyAtIndexAsFileSpec(NULL, idx); 3005 } 3006 3007 const char * 3008 TargetProperties::GetExpressionPrefixContentsAsCString () 3009 { 3010 const uint32_t idx = ePropertyExprPrefix; 3011 OptionValueFileSpec *file = m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec (NULL, false, idx); 3012 if (file) 3013 { 3014 const bool null_terminate = true; 3015 DataBufferSP data_sp(file->GetFileContents(null_terminate)); 3016 if (data_sp) 3017 return (const char *) data_sp->GetBytes(); 3018 } 3019 return NULL; 3020 } 3021 3022 void 3023 TargetProperties::SetStandardErrorPath (const char *p) 3024 { 3025 const uint32_t idx = ePropertyErrorPath; 3026 m_collection_sp->SetPropertyAtIndexAsString (NULL, idx, p); 3027 } 3028 3029 bool 3030 TargetProperties::GetBreakpointsConsultPlatformAvoidList () 3031 { 3032 const uint32_t idx = ePropertyBreakpointUseAvoidList; 3033 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3034 } 3035 3036 bool 3037 TargetProperties::GetUseHexImmediates () const 3038 { 3039 const uint32_t idx = ePropertyUseHexImmediates; 3040 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3041 } 3042 3043 bool 3044 TargetProperties::GetUseFastStepping () const 3045 { 3046 const uint32_t idx = ePropertyUseFastStepping; 3047 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3048 } 3049 3050 bool 3051 TargetProperties::GetDisplayExpressionsInCrashlogs () const 3052 { 3053 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs; 3054 return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0); 3055 } 3056 3057 LoadScriptFromSymFile 3058 TargetProperties::GetLoadScriptFromSymbolFile () const 3059 { 3060 const uint32_t idx = ePropertyLoadScriptFromSymbolFile; 3061 return (LoadScriptFromSymFile)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3062 } 3063 3064 Disassembler::HexImmediateStyle 3065 TargetProperties::GetHexImmediateStyle () const 3066 { 3067 const uint32_t idx = ePropertyHexImmediateStyle; 3068 return (Disassembler::HexImmediateStyle)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3069 } 3070 3071 MemoryModuleLoadLevel 3072 TargetProperties::GetMemoryModuleLoadLevel() const 3073 { 3074 const uint32_t idx = ePropertyMemoryModuleLoadLevel; 3075 return (MemoryModuleLoadLevel)m_collection_sp->GetPropertyAtIndexAsEnumeration(NULL, idx, g_properties[idx].default_uint_value); 3076 } 3077 3078 bool 3079 TargetProperties::GetUserSpecifiedTrapHandlerNames (Args &args) const 3080 { 3081 const uint32_t idx = ePropertyTrapHandlerNames; 3082 return m_collection_sp->GetPropertyAtIndexAsArgs (NULL, idx, args); 3083 } 3084 3085 void 3086 TargetProperties::SetUserSpecifiedTrapHandlerNames (const Args &args) 3087 { 3088 const uint32_t idx = ePropertyTrapHandlerNames; 3089 m_collection_sp->SetPropertyAtIndexFromArgs (NULL, idx, args); 3090 } 3091 3092 //---------------------------------------------------------------------- 3093 // Target::TargetEventData 3094 //---------------------------------------------------------------------- 3095 const ConstString & 3096 Target::TargetEventData::GetFlavorString () 3097 { 3098 static ConstString g_flavor ("Target::TargetEventData"); 3099 return g_flavor; 3100 } 3101 3102 const ConstString & 3103 Target::TargetEventData::GetFlavor () const 3104 { 3105 return TargetEventData::GetFlavorString (); 3106 } 3107 3108 Target::TargetEventData::TargetEventData (const lldb::TargetSP &new_target_sp) : 3109 EventData(), 3110 m_target_sp (new_target_sp) 3111 { 3112 } 3113 3114 Target::TargetEventData::~TargetEventData() 3115 { 3116 3117 } 3118 3119 void 3120 Target::TargetEventData::Dump (Stream *s) const 3121 { 3122 3123 } 3124 3125 const TargetSP 3126 Target::TargetEventData::GetTargetFromEvent (const lldb::EventSP &event_sp) 3127 { 3128 TargetSP target_sp; 3129 3130 const TargetEventData *data = GetEventDataFromEvent (event_sp.get()); 3131 if (data) 3132 target_sp = data->m_target_sp; 3133 3134 return target_sp; 3135 } 3136 3137 const Target::TargetEventData * 3138 Target::TargetEventData::GetEventDataFromEvent (const Event *event_ptr) 3139 { 3140 if (event_ptr) 3141 { 3142 const EventData *event_data = event_ptr->GetData(); 3143 if (event_data && event_data->GetFlavor() == TargetEventData::GetFlavorString()) 3144 return static_cast <const TargetEventData *> (event_ptr->GetData()); 3145 } 3146 return NULL; 3147 } 3148 3149