1 //===-- Target.cpp ----------------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "lldb/Target/Target.h" 10 #include "Plugins/ExpressionParser/Clang/ClangASTSource.h" 11 #include "Plugins/ExpressionParser/Clang/ClangModulesDeclVendor.h" 12 #include "Plugins/ExpressionParser/Clang/ClangPersistentVariables.h" 13 #include "lldb/Breakpoint/BreakpointIDList.h" 14 #include "lldb/Breakpoint/BreakpointResolver.h" 15 #include "lldb/Breakpoint/BreakpointResolverAddress.h" 16 #include "lldb/Breakpoint/BreakpointResolverFileLine.h" 17 #include "lldb/Breakpoint/BreakpointResolverFileRegex.h" 18 #include "lldb/Breakpoint/BreakpointResolverName.h" 19 #include "lldb/Breakpoint/BreakpointResolverScripted.h" 20 #include "lldb/Breakpoint/Watchpoint.h" 21 #include "lldb/Core/Debugger.h" 22 #include "lldb/Core/Module.h" 23 #include "lldb/Core/ModuleSpec.h" 24 #include "lldb/Core/PluginManager.h" 25 #include "lldb/Core/SearchFilter.h" 26 #include "lldb/Core/Section.h" 27 #include "lldb/Core/SourceManager.h" 28 #include "lldb/Core/StreamFile.h" 29 #include "lldb/Core/StructuredDataImpl.h" 30 #include "lldb/Core/ValueObject.h" 31 #include "lldb/Expression/REPL.h" 32 #include "lldb/Expression/UserExpression.h" 33 #include "lldb/Host/Host.h" 34 #include "lldb/Host/PosixApi.h" 35 #include "lldb/Interpreter/CommandInterpreter.h" 36 #include "lldb/Interpreter/CommandReturnObject.h" 37 #include "lldb/Interpreter/OptionGroupWatchpoint.h" 38 #include "lldb/Interpreter/OptionValues.h" 39 #include "lldb/Interpreter/Property.h" 40 #include "lldb/Symbol/ClangASTContext.h" 41 #include "lldb/Symbol/Function.h" 42 #include "lldb/Symbol/ObjectFile.h" 43 #include "lldb/Symbol/Symbol.h" 44 #include "lldb/Target/Language.h" 45 #include "lldb/Target/LanguageRuntime.h" 46 #include "lldb/Target/ObjCLanguageRuntime.h" 47 #include "lldb/Target/Process.h" 48 #include "lldb/Target/SectionLoadList.h" 49 #include "lldb/Target/StackFrame.h" 50 #include "lldb/Target/SystemRuntime.h" 51 #include "lldb/Target/Thread.h" 52 #include "lldb/Target/ThreadSpec.h" 53 #include "lldb/Utility/Event.h" 54 #include "lldb/Utility/FileSpec.h" 55 #include "lldb/Utility/LLDBAssert.h" 56 #include "lldb/Utility/Log.h" 57 #include "lldb/Utility/State.h" 58 #include "lldb/Utility/StreamString.h" 59 #include "lldb/Utility/Timer.h" 60 61 #include <memory> 62 #include <mutex> 63 64 using namespace lldb; 65 using namespace lldb_private; 66 67 constexpr std::chrono::milliseconds EvaluateExpressionOptions::default_timeout; 68 69 Target::Arch::Arch(const ArchSpec &spec) 70 : m_spec(spec), 71 m_plugin_up(PluginManager::CreateArchitectureInstance(spec)) {} 72 73 const Target::Arch& Target::Arch::operator=(const ArchSpec &spec) { 74 m_spec = spec; 75 m_plugin_up = PluginManager::CreateArchitectureInstance(spec); 76 return *this; 77 } 78 79 ConstString &Target::GetStaticBroadcasterClass() { 80 static ConstString class_name("lldb.target"); 81 return class_name; 82 } 83 84 Target::Target(Debugger &debugger, const ArchSpec &target_arch, 85 const lldb::PlatformSP &platform_sp, bool is_dummy_target) 86 : TargetProperties(this), 87 Broadcaster(debugger.GetBroadcasterManager(), 88 Target::GetStaticBroadcasterClass().AsCString()), 89 ExecutionContextScope(), m_debugger(debugger), m_platform_sp(platform_sp), 90 m_mutex(), m_arch(target_arch), m_images(this), m_section_load_history(), 91 m_breakpoint_list(false), m_internal_breakpoint_list(true), 92 m_watchpoint_list(), m_process_sp(), m_search_filter_sp(), 93 m_image_search_paths(ImageSearchPathsChanged, this), m_ast_importer_sp(), 94 m_source_manager_up(), m_stop_hooks(), m_stop_hook_next_id(0), 95 m_valid(true), m_suppress_stop_hooks(false), 96 m_is_dummy_target(is_dummy_target), 97 m_stats_storage(static_cast<int>(StatisticKind::StatisticMax)) 98 99 { 100 SetEventName(eBroadcastBitBreakpointChanged, "breakpoint-changed"); 101 SetEventName(eBroadcastBitModulesLoaded, "modules-loaded"); 102 SetEventName(eBroadcastBitModulesUnloaded, "modules-unloaded"); 103 SetEventName(eBroadcastBitWatchpointChanged, "watchpoint-changed"); 104 SetEventName(eBroadcastBitSymbolsLoaded, "symbols-loaded"); 105 106 CheckInWithManager(); 107 108 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT)); 109 if (log) 110 log->Printf("%p Target::Target()", static_cast<void *>(this)); 111 if (target_arch.IsValid()) { 112 LogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET, 113 "Target::Target created with architecture %s (%s)", 114 target_arch.GetArchitectureName(), 115 target_arch.GetTriple().getTriple().c_str()); 116 } 117 } 118 119 Target::~Target() { 120 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_OBJECT)); 121 if (log) 122 log->Printf("%p Target::~Target()", static_cast<void *>(this)); 123 DeleteCurrentProcess(); 124 } 125 126 void Target::PrimeFromDummyTarget(Target *target) { 127 if (!target) 128 return; 129 130 m_stop_hooks = target->m_stop_hooks; 131 132 for (BreakpointSP breakpoint_sp : target->m_breakpoint_list.Breakpoints()) { 133 if (breakpoint_sp->IsInternal()) 134 continue; 135 136 BreakpointSP new_bp(new Breakpoint(*this, *breakpoint_sp.get())); 137 AddBreakpoint(new_bp, false); 138 } 139 140 for (auto bp_name_entry : target->m_breakpoint_names) 141 { 142 143 BreakpointName *new_bp_name = new BreakpointName(*bp_name_entry.second); 144 AddBreakpointName(new_bp_name); 145 } 146 } 147 148 void Target::Dump(Stream *s, lldb::DescriptionLevel description_level) { 149 // s->Printf("%.*p: ", (int)sizeof(void*) * 2, this); 150 if (description_level != lldb::eDescriptionLevelBrief) { 151 s->Indent(); 152 s->PutCString("Target\n"); 153 s->IndentMore(); 154 m_images.Dump(s); 155 m_breakpoint_list.Dump(s); 156 m_internal_breakpoint_list.Dump(s); 157 s->IndentLess(); 158 } else { 159 Module *exe_module = GetExecutableModulePointer(); 160 if (exe_module) 161 s->PutCString(exe_module->GetFileSpec().GetFilename().GetCString()); 162 else 163 s->PutCString("No executable module."); 164 } 165 } 166 167 void Target::CleanupProcess() { 168 // Do any cleanup of the target we need to do between process instances. 169 // NB It is better to do this before destroying the process in case the 170 // clean up needs some help from the process. 171 m_breakpoint_list.ClearAllBreakpointSites(); 172 m_internal_breakpoint_list.ClearAllBreakpointSites(); 173 // Disable watchpoints just on the debugger side. 174 std::unique_lock<std::recursive_mutex> lock; 175 this->GetWatchpointList().GetListMutex(lock); 176 DisableAllWatchpoints(false); 177 ClearAllWatchpointHitCounts(); 178 ClearAllWatchpointHistoricValues(); 179 } 180 181 void Target::DeleteCurrentProcess() { 182 if (m_process_sp) { 183 m_section_load_history.Clear(); 184 if (m_process_sp->IsAlive()) 185 m_process_sp->Destroy(false); 186 187 m_process_sp->Finalize(); 188 189 CleanupProcess(); 190 191 m_process_sp.reset(); 192 } 193 } 194 195 const lldb::ProcessSP &Target::CreateProcess(ListenerSP listener_sp, 196 llvm::StringRef plugin_name, 197 const FileSpec *crash_file) { 198 if (!listener_sp) 199 listener_sp = GetDebugger().GetListener(); 200 DeleteCurrentProcess(); 201 m_process_sp = Process::FindPlugin(shared_from_this(), plugin_name, 202 listener_sp, crash_file); 203 return m_process_sp; 204 } 205 206 const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; } 207 208 lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language, 209 const char *repl_options, bool can_create) { 210 if (language == eLanguageTypeUnknown) { 211 std::set<LanguageType> repl_languages; 212 213 Language::GetLanguagesSupportingREPLs(repl_languages); 214 215 if (repl_languages.size() == 1) { 216 language = *repl_languages.begin(); 217 } else if (repl_languages.size() == 0) { 218 err.SetErrorStringWithFormat( 219 "LLDB isn't configured with REPL support for any languages."); 220 return REPLSP(); 221 } else { 222 err.SetErrorStringWithFormat( 223 "Multiple possible REPL languages. Please specify a language."); 224 return REPLSP(); 225 } 226 } 227 228 REPLMap::iterator pos = m_repl_map.find(language); 229 230 if (pos != m_repl_map.end()) { 231 return pos->second; 232 } 233 234 if (!can_create) { 235 err.SetErrorStringWithFormat( 236 "Couldn't find an existing REPL for %s, and can't create a new one", 237 Language::GetNameForLanguageType(language)); 238 return lldb::REPLSP(); 239 } 240 241 Debugger *const debugger = nullptr; 242 lldb::REPLSP ret = REPL::Create(err, language, debugger, this, repl_options); 243 244 if (ret) { 245 m_repl_map[language] = ret; 246 return m_repl_map[language]; 247 } 248 249 if (err.Success()) { 250 err.SetErrorStringWithFormat("Couldn't create a REPL for %s", 251 Language::GetNameForLanguageType(language)); 252 } 253 254 return lldb::REPLSP(); 255 } 256 257 void Target::SetREPL(lldb::LanguageType language, lldb::REPLSP repl_sp) { 258 lldbassert(!m_repl_map.count(language)); 259 260 m_repl_map[language] = repl_sp; 261 } 262 263 void Target::Destroy() { 264 std::lock_guard<std::recursive_mutex> guard(m_mutex); 265 m_valid = false; 266 DeleteCurrentProcess(); 267 m_platform_sp.reset(); 268 m_arch = ArchSpec(); 269 ClearModules(true); 270 m_section_load_history.Clear(); 271 const bool notify = false; 272 m_breakpoint_list.RemoveAll(notify); 273 m_internal_breakpoint_list.RemoveAll(notify); 274 m_last_created_breakpoint.reset(); 275 m_last_created_watchpoint.reset(); 276 m_search_filter_sp.reset(); 277 m_image_search_paths.Clear(notify); 278 m_stop_hooks.clear(); 279 m_stop_hook_next_id = 0; 280 m_suppress_stop_hooks = false; 281 } 282 283 BreakpointList &Target::GetBreakpointList(bool internal) { 284 if (internal) 285 return m_internal_breakpoint_list; 286 else 287 return m_breakpoint_list; 288 } 289 290 const BreakpointList &Target::GetBreakpointList(bool internal) const { 291 if (internal) 292 return m_internal_breakpoint_list; 293 else 294 return m_breakpoint_list; 295 } 296 297 BreakpointSP Target::GetBreakpointByID(break_id_t break_id) { 298 BreakpointSP bp_sp; 299 300 if (LLDB_BREAK_ID_IS_INTERNAL(break_id)) 301 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id); 302 else 303 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id); 304 305 return bp_sp; 306 } 307 308 BreakpointSP Target::CreateSourceRegexBreakpoint( 309 const FileSpecList *containingModules, 310 const FileSpecList *source_file_spec_list, 311 const std::unordered_set<std::string> &function_names, 312 RegularExpression &source_regex, bool internal, bool hardware, 313 LazyBool move_to_nearest_code) { 314 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList( 315 containingModules, source_file_spec_list)); 316 if (move_to_nearest_code == eLazyBoolCalculate) 317 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo; 318 BreakpointResolverSP resolver_sp(new BreakpointResolverFileRegex( 319 nullptr, source_regex, function_names, 320 !static_cast<bool>(move_to_nearest_code))); 321 322 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 323 } 324 325 BreakpointSP Target::CreateBreakpoint(const FileSpecList *containingModules, 326 const FileSpec &file, uint32_t line_no, 327 uint32_t column, lldb::addr_t offset, 328 LazyBool check_inlines, 329 LazyBool skip_prologue, bool internal, 330 bool hardware, 331 LazyBool move_to_nearest_code) { 332 FileSpec remapped_file; 333 if (!GetSourcePathMap().ReverseRemapPath(file, remapped_file)) 334 remapped_file = file; 335 336 if (check_inlines == eLazyBoolCalculate) { 337 const InlineStrategy inline_strategy = GetInlineStrategy(); 338 switch (inline_strategy) { 339 case eInlineBreakpointsNever: 340 check_inlines = eLazyBoolNo; 341 break; 342 343 case eInlineBreakpointsHeaders: 344 if (remapped_file.IsSourceImplementationFile()) 345 check_inlines = eLazyBoolNo; 346 else 347 check_inlines = eLazyBoolYes; 348 break; 349 350 case eInlineBreakpointsAlways: 351 check_inlines = eLazyBoolYes; 352 break; 353 } 354 } 355 SearchFilterSP filter_sp; 356 if (check_inlines == eLazyBoolNo) { 357 // Not checking for inlines, we are looking only for matching compile units 358 FileSpecList compile_unit_list; 359 compile_unit_list.Append(remapped_file); 360 filter_sp = GetSearchFilterForModuleAndCUList(containingModules, 361 &compile_unit_list); 362 } else { 363 filter_sp = GetSearchFilterForModuleList(containingModules); 364 } 365 if (skip_prologue == eLazyBoolCalculate) 366 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 367 if (move_to_nearest_code == eLazyBoolCalculate) 368 move_to_nearest_code = GetMoveToNearestCode() ? eLazyBoolYes : eLazyBoolNo; 369 370 BreakpointResolverSP resolver_sp(new BreakpointResolverFileLine( 371 nullptr, remapped_file, line_no, column, offset, check_inlines, 372 skip_prologue, !static_cast<bool>(move_to_nearest_code))); 373 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 374 } 375 376 BreakpointSP Target::CreateBreakpoint(lldb::addr_t addr, bool internal, 377 bool hardware) { 378 Address so_addr; 379 380 // Check for any reason we want to move this breakpoint to other address. 381 addr = GetBreakableLoadAddress(addr); 382 383 // Attempt to resolve our load address if possible, though it is ok if it 384 // doesn't resolve to section/offset. 385 386 // Try and resolve as a load address if possible 387 GetSectionLoadList().ResolveLoadAddress(addr, so_addr); 388 if (!so_addr.IsValid()) { 389 // The address didn't resolve, so just set this as an absolute address 390 so_addr.SetOffset(addr); 391 } 392 BreakpointSP bp_sp(CreateBreakpoint(so_addr, internal, hardware)); 393 return bp_sp; 394 } 395 396 BreakpointSP Target::CreateBreakpoint(const Address &addr, bool internal, 397 bool hardware) { 398 SearchFilterSP filter_sp( 399 new SearchFilterForUnconstrainedSearches(shared_from_this())); 400 BreakpointResolverSP resolver_sp( 401 new BreakpointResolverAddress(nullptr, addr)); 402 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, false); 403 } 404 405 lldb::BreakpointSP 406 Target::CreateAddressInModuleBreakpoint(lldb::addr_t file_addr, bool internal, 407 const FileSpec *file_spec, 408 bool request_hardware) { 409 SearchFilterSP filter_sp( 410 new SearchFilterForUnconstrainedSearches(shared_from_this())); 411 BreakpointResolverSP resolver_sp( 412 new BreakpointResolverAddress(nullptr, file_addr, file_spec)); 413 return CreateBreakpoint(filter_sp, resolver_sp, internal, request_hardware, 414 false); 415 } 416 417 BreakpointSP Target::CreateBreakpoint( 418 const FileSpecList *containingModules, 419 const FileSpecList *containingSourceFiles, const char *func_name, 420 FunctionNameType func_name_type_mask, LanguageType language, 421 lldb::addr_t offset, LazyBool skip_prologue, bool internal, bool hardware) { 422 BreakpointSP bp_sp; 423 if (func_name) { 424 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList( 425 containingModules, containingSourceFiles)); 426 427 if (skip_prologue == eLazyBoolCalculate) 428 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 429 if (language == lldb::eLanguageTypeUnknown) 430 language = GetLanguage(); 431 432 BreakpointResolverSP resolver_sp(new BreakpointResolverName( 433 nullptr, func_name, func_name_type_mask, language, Breakpoint::Exact, 434 offset, skip_prologue)); 435 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 436 } 437 return bp_sp; 438 } 439 440 lldb::BreakpointSP 441 Target::CreateBreakpoint(const FileSpecList *containingModules, 442 const FileSpecList *containingSourceFiles, 443 const std::vector<std::string> &func_names, 444 FunctionNameType func_name_type_mask, 445 LanguageType language, lldb::addr_t offset, 446 LazyBool skip_prologue, bool internal, bool hardware) { 447 BreakpointSP bp_sp; 448 size_t num_names = func_names.size(); 449 if (num_names > 0) { 450 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList( 451 containingModules, containingSourceFiles)); 452 453 if (skip_prologue == eLazyBoolCalculate) 454 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 455 if (language == lldb::eLanguageTypeUnknown) 456 language = GetLanguage(); 457 458 BreakpointResolverSP resolver_sp( 459 new BreakpointResolverName(nullptr, func_names, func_name_type_mask, 460 language, offset, skip_prologue)); 461 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 462 } 463 return bp_sp; 464 } 465 466 BreakpointSP 467 Target::CreateBreakpoint(const FileSpecList *containingModules, 468 const FileSpecList *containingSourceFiles, 469 const char *func_names[], size_t num_names, 470 FunctionNameType func_name_type_mask, 471 LanguageType language, lldb::addr_t offset, 472 LazyBool skip_prologue, bool internal, bool hardware) { 473 BreakpointSP bp_sp; 474 if (num_names > 0) { 475 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList( 476 containingModules, containingSourceFiles)); 477 478 if (skip_prologue == eLazyBoolCalculate) { 479 if (offset == 0) 480 skip_prologue = GetSkipPrologue() ? eLazyBoolYes : eLazyBoolNo; 481 else 482 skip_prologue = eLazyBoolNo; 483 } 484 if (language == lldb::eLanguageTypeUnknown) 485 language = GetLanguage(); 486 487 BreakpointResolverSP resolver_sp(new BreakpointResolverName( 488 nullptr, func_names, num_names, func_name_type_mask, language, offset, 489 skip_prologue)); 490 resolver_sp->SetOffset(offset); 491 bp_sp = CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 492 } 493 return bp_sp; 494 } 495 496 SearchFilterSP 497 Target::GetSearchFilterForModule(const FileSpec *containingModule) { 498 SearchFilterSP filter_sp; 499 if (containingModule != nullptr) { 500 // TODO: We should look into sharing module based search filters 501 // across many breakpoints like we do for the simple target based one 502 filter_sp = std::make_shared<SearchFilterByModule>(shared_from_this(), 503 *containingModule); 504 } else { 505 if (!m_search_filter_sp) 506 m_search_filter_sp = 507 std::make_shared<SearchFilterForUnconstrainedSearches>( 508 shared_from_this()); 509 filter_sp = m_search_filter_sp; 510 } 511 return filter_sp; 512 } 513 514 SearchFilterSP 515 Target::GetSearchFilterForModuleList(const FileSpecList *containingModules) { 516 SearchFilterSP filter_sp; 517 if (containingModules && containingModules->GetSize() != 0) { 518 // TODO: We should look into sharing module based search filters 519 // across many breakpoints like we do for the simple target based one 520 filter_sp = std::make_shared<SearchFilterByModuleList>(shared_from_this(), 521 *containingModules); 522 } else { 523 if (!m_search_filter_sp) 524 m_search_filter_sp = 525 std::make_shared<SearchFilterForUnconstrainedSearches>( 526 shared_from_this()); 527 filter_sp = m_search_filter_sp; 528 } 529 return filter_sp; 530 } 531 532 SearchFilterSP Target::GetSearchFilterForModuleAndCUList( 533 const FileSpecList *containingModules, 534 const FileSpecList *containingSourceFiles) { 535 if (containingSourceFiles == nullptr || containingSourceFiles->GetSize() == 0) 536 return GetSearchFilterForModuleList(containingModules); 537 538 SearchFilterSP filter_sp; 539 if (containingModules == nullptr) { 540 // We could make a special "CU List only SearchFilter". Better yet was if 541 // these could be composable, but that will take a little reworking. 542 543 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>( 544 shared_from_this(), FileSpecList(), *containingSourceFiles); 545 } else { 546 filter_sp = std::make_shared<SearchFilterByModuleListAndCU>( 547 shared_from_this(), *containingModules, *containingSourceFiles); 548 } 549 return filter_sp; 550 } 551 552 BreakpointSP Target::CreateFuncRegexBreakpoint( 553 const FileSpecList *containingModules, 554 const FileSpecList *containingSourceFiles, RegularExpression &func_regex, 555 lldb::LanguageType requested_language, LazyBool skip_prologue, 556 bool internal, bool hardware) { 557 SearchFilterSP filter_sp(GetSearchFilterForModuleAndCUList( 558 containingModules, containingSourceFiles)); 559 bool skip = (skip_prologue == eLazyBoolCalculate) 560 ? GetSkipPrologue() 561 : static_cast<bool>(skip_prologue); 562 BreakpointResolverSP resolver_sp(new BreakpointResolverName( 563 nullptr, func_regex, requested_language, 0, skip)); 564 565 return CreateBreakpoint(filter_sp, resolver_sp, internal, hardware, true); 566 } 567 568 lldb::BreakpointSP 569 Target::CreateExceptionBreakpoint(enum lldb::LanguageType language, 570 bool catch_bp, bool throw_bp, bool internal, 571 Args *additional_args, Status *error) { 572 BreakpointSP exc_bkpt_sp = LanguageRuntime::CreateExceptionBreakpoint( 573 *this, language, catch_bp, throw_bp, internal); 574 if (exc_bkpt_sp && additional_args) { 575 Breakpoint::BreakpointPreconditionSP precondition_sp = 576 exc_bkpt_sp->GetPrecondition(); 577 if (precondition_sp && additional_args) { 578 if (error) 579 *error = precondition_sp->ConfigurePrecondition(*additional_args); 580 else 581 precondition_sp->ConfigurePrecondition(*additional_args); 582 } 583 } 584 return exc_bkpt_sp; 585 } 586 587 lldb::BreakpointSP 588 Target::CreateScriptedBreakpoint(const llvm::StringRef class_name, 589 const FileSpecList *containingModules, 590 const FileSpecList *containingSourceFiles, 591 bool internal, 592 bool request_hardware, 593 StructuredData::ObjectSP extra_args_sp, 594 Status *creation_error) 595 { 596 SearchFilterSP filter_sp; 597 598 lldb::SearchDepth depth = lldb::eSearchDepthTarget; 599 bool has_files = containingSourceFiles && containingSourceFiles->GetSize() > 0; 600 bool has_modules = containingModules && containingModules->GetSize() > 0; 601 602 if (has_files && has_modules) { 603 filter_sp = GetSearchFilterForModuleAndCUList( 604 containingModules, containingSourceFiles); 605 } else if (has_files) { 606 filter_sp = GetSearchFilterForModuleAndCUList( 607 nullptr, containingSourceFiles); 608 } else if (has_modules) { 609 filter_sp = GetSearchFilterForModuleList(containingModules); 610 } else { 611 filter_sp = std::make_shared<SearchFilterForUnconstrainedSearches>( 612 shared_from_this()); 613 } 614 615 StructuredDataImpl *extra_args_impl = new StructuredDataImpl(); 616 if (extra_args_sp) 617 extra_args_impl->SetObjectSP(extra_args_sp); 618 619 BreakpointResolverSP resolver_sp(new 620 BreakpointResolverScripted(nullptr, class_name, 621 depth, 622 extra_args_impl, 623 *GetDebugger().GetCommandInterpreter() 624 .GetScriptInterpreter())); 625 return CreateBreakpoint(filter_sp, resolver_sp, internal, false, true); 626 627 } 628 629 630 BreakpointSP Target::CreateBreakpoint(SearchFilterSP &filter_sp, 631 BreakpointResolverSP &resolver_sp, 632 bool internal, bool request_hardware, 633 bool resolve_indirect_symbols) { 634 BreakpointSP bp_sp; 635 if (filter_sp && resolver_sp) { 636 const bool hardware = request_hardware || GetRequireHardwareBreakpoints(); 637 bp_sp.reset(new Breakpoint(*this, filter_sp, resolver_sp, hardware, 638 resolve_indirect_symbols)); 639 resolver_sp->SetBreakpoint(bp_sp.get()); 640 AddBreakpoint(bp_sp, internal); 641 } 642 return bp_sp; 643 } 644 645 void Target::AddBreakpoint(lldb::BreakpointSP bp_sp, bool internal) { 646 if (!bp_sp) 647 return; 648 if (internal) 649 m_internal_breakpoint_list.Add(bp_sp, false); 650 else 651 m_breakpoint_list.Add(bp_sp, true); 652 653 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 654 if (log) { 655 StreamString s; 656 bp_sp->GetDescription(&s, lldb::eDescriptionLevelVerbose); 657 log->Printf("Target::%s (internal = %s) => break_id = %s\n", __FUNCTION__, 658 bp_sp->IsInternal() ? "yes" : "no", s.GetData()); 659 } 660 661 bp_sp->ResolveBreakpoint(); 662 663 if (!internal) { 664 m_last_created_breakpoint = bp_sp; 665 } 666 } 667 668 void Target::AddNameToBreakpoint(BreakpointID &id, 669 const char *name, 670 Status &error) 671 { 672 BreakpointSP bp_sp 673 = m_breakpoint_list.FindBreakpointByID(id.GetBreakpointID()); 674 if (!bp_sp) 675 { 676 StreamString s; 677 id.GetDescription(&s, eDescriptionLevelBrief); 678 error.SetErrorStringWithFormat("Could not find breakpoint %s", 679 s.GetData()); 680 return; 681 } 682 AddNameToBreakpoint(bp_sp, name, error); 683 } 684 685 void Target::AddNameToBreakpoint(BreakpointSP &bp_sp, 686 const char *name, 687 Status &error) 688 { 689 if (!bp_sp) 690 return; 691 692 BreakpointName *bp_name = FindBreakpointName(ConstString(name), true, error); 693 if (!bp_name) 694 return; 695 696 bp_name->ConfigureBreakpoint(bp_sp); 697 bp_sp->AddName(name); 698 } 699 700 void Target::AddBreakpointName(BreakpointName *bp_name) { 701 m_breakpoint_names.insert(std::make_pair(bp_name->GetName(), bp_name)); 702 } 703 704 BreakpointName *Target::FindBreakpointName(ConstString name, 705 bool can_create, 706 Status &error) 707 { 708 BreakpointID::StringIsBreakpointName(name.GetStringRef(), error); 709 if (!error.Success()) 710 return nullptr; 711 712 BreakpointNameList::iterator iter = m_breakpoint_names.find(name); 713 if (iter == m_breakpoint_names.end()) { 714 if (!can_create) 715 { 716 error.SetErrorStringWithFormat("Breakpoint name \"%s\" doesn't exist and " 717 "can_create is false.", name.AsCString()); 718 return nullptr; 719 } 720 721 iter = m_breakpoint_names.insert(std::make_pair(name, 722 new BreakpointName(name))) 723 .first; 724 } 725 return (iter->second); 726 } 727 728 void 729 Target::DeleteBreakpointName(ConstString name) 730 { 731 BreakpointNameList::iterator iter = m_breakpoint_names.find(name); 732 733 if (iter != m_breakpoint_names.end()) { 734 const char *name_cstr = name.AsCString(); 735 m_breakpoint_names.erase(iter); 736 for (auto bp_sp : m_breakpoint_list.Breakpoints()) 737 bp_sp->RemoveName(name_cstr); 738 } 739 } 740 741 void Target::RemoveNameFromBreakpoint(lldb::BreakpointSP &bp_sp, 742 ConstString name) 743 { 744 bp_sp->RemoveName(name.AsCString()); 745 } 746 747 void Target::ConfigureBreakpointName(BreakpointName &bp_name, 748 const BreakpointOptions &new_options, 749 const BreakpointName::Permissions &new_permissions) 750 { 751 bp_name.GetOptions().CopyOverSetOptions(new_options); 752 bp_name.GetPermissions().MergeInto(new_permissions); 753 ApplyNameToBreakpoints(bp_name); 754 } 755 756 void Target::ApplyNameToBreakpoints(BreakpointName &bp_name) { 757 BreakpointList bkpts_with_name(false); 758 m_breakpoint_list.FindBreakpointsByName(bp_name.GetName().AsCString(), 759 bkpts_with_name); 760 761 for (auto bp_sp : bkpts_with_name.Breakpoints()) 762 bp_name.ConfigureBreakpoint(bp_sp); 763 } 764 765 void Target::GetBreakpointNames(std::vector<std::string> &names) 766 { 767 names.clear(); 768 for (auto bp_name : m_breakpoint_names) { 769 names.push_back(bp_name.first.AsCString()); 770 } 771 llvm::sort(names.begin(), names.end()); 772 } 773 774 bool Target::ProcessIsValid() { 775 return (m_process_sp && m_process_sp->IsAlive()); 776 } 777 778 static bool CheckIfWatchpointsSupported(Target *target, Status &error) { 779 uint32_t num_supported_hardware_watchpoints; 780 Status rc = target->GetProcessSP()->GetWatchpointSupportInfo( 781 num_supported_hardware_watchpoints); 782 783 // If unable to determine the # of watchpoints available, 784 // assume they are supported. 785 if (rc.Fail()) 786 return true; 787 788 if (num_supported_hardware_watchpoints == 0) { 789 error.SetErrorStringWithFormat( 790 "Target supports (%u) hardware watchpoint slots.\n", 791 num_supported_hardware_watchpoints); 792 return false; 793 } 794 return true; 795 } 796 797 // See also Watchpoint::SetWatchpointType(uint32_t type) and the 798 // OptionGroupWatchpoint::WatchType enum type. 799 WatchpointSP Target::CreateWatchpoint(lldb::addr_t addr, size_t size, 800 const CompilerType *type, uint32_t kind, 801 Status &error) { 802 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 803 if (log) 804 log->Printf("Target::%s (addr = 0x%8.8" PRIx64 " size = %" PRIu64 805 " type = %u)\n", 806 __FUNCTION__, addr, (uint64_t)size, kind); 807 808 WatchpointSP wp_sp; 809 if (!ProcessIsValid()) { 810 error.SetErrorString("process is not alive"); 811 return wp_sp; 812 } 813 814 if (addr == LLDB_INVALID_ADDRESS || size == 0) { 815 if (size == 0) 816 error.SetErrorString("cannot set a watchpoint with watch_size of 0"); 817 else 818 error.SetErrorStringWithFormat("invalid watch address: %" PRIu64, addr); 819 return wp_sp; 820 } 821 822 if (!LLDB_WATCH_TYPE_IS_VALID(kind)) { 823 error.SetErrorStringWithFormat("invalid watchpoint type: %d", kind); 824 } 825 826 if (!CheckIfWatchpointsSupported(this, error)) 827 return wp_sp; 828 829 // Currently we only support one watchpoint per address, with total number of 830 // watchpoints limited by the hardware which the inferior is running on. 831 832 // Grab the list mutex while doing operations. 833 const bool notify = false; // Don't notify about all the state changes we do 834 // on creating the watchpoint. 835 std::unique_lock<std::recursive_mutex> lock; 836 this->GetWatchpointList().GetListMutex(lock); 837 WatchpointSP matched_sp = m_watchpoint_list.FindByAddress(addr); 838 if (matched_sp) { 839 size_t old_size = matched_sp->GetByteSize(); 840 uint32_t old_type = 841 (matched_sp->WatchpointRead() ? LLDB_WATCH_TYPE_READ : 0) | 842 (matched_sp->WatchpointWrite() ? LLDB_WATCH_TYPE_WRITE : 0); 843 // Return the existing watchpoint if both size and type match. 844 if (size == old_size && kind == old_type) { 845 wp_sp = matched_sp; 846 wp_sp->SetEnabled(false, notify); 847 } else { 848 // Nil the matched watchpoint; we will be creating a new one. 849 m_process_sp->DisableWatchpoint(matched_sp.get(), notify); 850 m_watchpoint_list.Remove(matched_sp->GetID(), true); 851 } 852 } 853 854 if (!wp_sp) { 855 wp_sp = std::make_shared<Watchpoint>(*this, addr, size, type); 856 wp_sp->SetWatchpointType(kind, notify); 857 m_watchpoint_list.Add(wp_sp, true); 858 } 859 860 error = m_process_sp->EnableWatchpoint(wp_sp.get(), notify); 861 if (log) 862 log->Printf("Target::%s (creation of watchpoint %s with id = %u)\n", 863 __FUNCTION__, error.Success() ? "succeeded" : "failed", 864 wp_sp->GetID()); 865 866 if (error.Fail()) { 867 // Enabling the watchpoint on the device side failed. Remove the said 868 // watchpoint from the list maintained by the target instance. 869 m_watchpoint_list.Remove(wp_sp->GetID(), true); 870 // See if we could provide more helpful error message. 871 if (!OptionGroupWatchpoint::IsWatchSizeSupported(size)) 872 error.SetErrorStringWithFormat( 873 "watch size of %" PRIu64 " is not supported", (uint64_t)size); 874 875 wp_sp.reset(); 876 } else 877 m_last_created_watchpoint = wp_sp; 878 return wp_sp; 879 } 880 881 void Target::RemoveAllowedBreakpoints () 882 { 883 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 884 if (log) 885 log->Printf("Target::%s \n", __FUNCTION__); 886 887 m_breakpoint_list.RemoveAllowed(true); 888 889 m_last_created_breakpoint.reset(); 890 } 891 892 void Target::RemoveAllBreakpoints(bool internal_also) { 893 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 894 if (log) 895 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__, 896 internal_also ? "yes" : "no"); 897 898 m_breakpoint_list.RemoveAll(true); 899 if (internal_also) 900 m_internal_breakpoint_list.RemoveAll(false); 901 902 m_last_created_breakpoint.reset(); 903 } 904 905 void Target::DisableAllBreakpoints(bool internal_also) { 906 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 907 if (log) 908 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__, 909 internal_also ? "yes" : "no"); 910 911 m_breakpoint_list.SetEnabledAll(false); 912 if (internal_also) 913 m_internal_breakpoint_list.SetEnabledAll(false); 914 } 915 916 void Target::DisableAllowedBreakpoints() { 917 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 918 if (log) 919 log->Printf("Target::%s", __FUNCTION__); 920 921 m_breakpoint_list.SetEnabledAllowed(false); 922 } 923 924 void Target::EnableAllBreakpoints(bool internal_also) { 925 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 926 if (log) 927 log->Printf("Target::%s (internal_also = %s)\n", __FUNCTION__, 928 internal_also ? "yes" : "no"); 929 930 m_breakpoint_list.SetEnabledAll(true); 931 if (internal_also) 932 m_internal_breakpoint_list.SetEnabledAll(true); 933 } 934 935 void Target::EnableAllowedBreakpoints() { 936 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 937 if (log) 938 log->Printf("Target::%s", __FUNCTION__); 939 940 m_breakpoint_list.SetEnabledAllowed(true); 941 } 942 943 bool Target::RemoveBreakpointByID(break_id_t break_id) { 944 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 945 if (log) 946 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, 947 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no"); 948 949 if (DisableBreakpointByID(break_id)) { 950 if (LLDB_BREAK_ID_IS_INTERNAL(break_id)) 951 m_internal_breakpoint_list.Remove(break_id, false); 952 else { 953 if (m_last_created_breakpoint) { 954 if (m_last_created_breakpoint->GetID() == break_id) 955 m_last_created_breakpoint.reset(); 956 } 957 m_breakpoint_list.Remove(break_id, true); 958 } 959 return true; 960 } 961 return false; 962 } 963 964 bool Target::DisableBreakpointByID(break_id_t break_id) { 965 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 966 if (log) 967 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, 968 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no"); 969 970 BreakpointSP bp_sp; 971 972 if (LLDB_BREAK_ID_IS_INTERNAL(break_id)) 973 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id); 974 else 975 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id); 976 if (bp_sp) { 977 bp_sp->SetEnabled(false); 978 return true; 979 } 980 return false; 981 } 982 983 bool Target::EnableBreakpointByID(break_id_t break_id) { 984 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_BREAKPOINTS)); 985 if (log) 986 log->Printf("Target::%s (break_id = %i, internal = %s)\n", __FUNCTION__, 987 break_id, LLDB_BREAK_ID_IS_INTERNAL(break_id) ? "yes" : "no"); 988 989 BreakpointSP bp_sp; 990 991 if (LLDB_BREAK_ID_IS_INTERNAL(break_id)) 992 bp_sp = m_internal_breakpoint_list.FindBreakpointByID(break_id); 993 else 994 bp_sp = m_breakpoint_list.FindBreakpointByID(break_id); 995 996 if (bp_sp) { 997 bp_sp->SetEnabled(true); 998 return true; 999 } 1000 return false; 1001 } 1002 1003 Status Target::SerializeBreakpointsToFile(const FileSpec &file, 1004 const BreakpointIDList &bp_ids, 1005 bool append) { 1006 Status error; 1007 1008 if (!file) { 1009 error.SetErrorString("Invalid FileSpec."); 1010 return error; 1011 } 1012 1013 std::string path(file.GetPath()); 1014 StructuredData::ObjectSP input_data_sp; 1015 1016 StructuredData::ArraySP break_store_sp; 1017 StructuredData::Array *break_store_ptr = nullptr; 1018 1019 if (append) { 1020 input_data_sp = StructuredData::ParseJSONFromFile(file, error); 1021 if (error.Success()) { 1022 break_store_ptr = input_data_sp->GetAsArray(); 1023 if (!break_store_ptr) { 1024 error.SetErrorStringWithFormat( 1025 "Tried to append to invalid input file %s", path.c_str()); 1026 return error; 1027 } 1028 } 1029 } 1030 1031 if (!break_store_ptr) { 1032 break_store_sp = std::make_shared<StructuredData::Array>(); 1033 break_store_ptr = break_store_sp.get(); 1034 } 1035 1036 StreamFile out_file(path.c_str(), 1037 File::OpenOptions::eOpenOptionTruncate | 1038 File::OpenOptions::eOpenOptionWrite | 1039 File::OpenOptions::eOpenOptionCanCreate | 1040 File::OpenOptions::eOpenOptionCloseOnExec, 1041 lldb::eFilePermissionsFileDefault); 1042 if (!out_file.GetFile().IsValid()) { 1043 error.SetErrorStringWithFormat("Unable to open output file: %s.", 1044 path.c_str()); 1045 return error; 1046 } 1047 1048 std::unique_lock<std::recursive_mutex> lock; 1049 GetBreakpointList().GetListMutex(lock); 1050 1051 if (bp_ids.GetSize() == 0) { 1052 const BreakpointList &breakpoints = GetBreakpointList(); 1053 1054 size_t num_breakpoints = breakpoints.GetSize(); 1055 for (size_t i = 0; i < num_breakpoints; i++) { 1056 Breakpoint *bp = breakpoints.GetBreakpointAtIndex(i).get(); 1057 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData(); 1058 // If a breakpoint can't serialize it, just ignore it for now: 1059 if (bkpt_save_sp) 1060 break_store_ptr->AddItem(bkpt_save_sp); 1061 } 1062 } else { 1063 1064 std::unordered_set<lldb::break_id_t> processed_bkpts; 1065 const size_t count = bp_ids.GetSize(); 1066 for (size_t i = 0; i < count; ++i) { 1067 BreakpointID cur_bp_id = bp_ids.GetBreakpointIDAtIndex(i); 1068 lldb::break_id_t bp_id = cur_bp_id.GetBreakpointID(); 1069 1070 if (bp_id != LLDB_INVALID_BREAK_ID) { 1071 // Only do each breakpoint once: 1072 std::pair<std::unordered_set<lldb::break_id_t>::iterator, bool> 1073 insert_result = processed_bkpts.insert(bp_id); 1074 if (!insert_result.second) 1075 continue; 1076 1077 Breakpoint *bp = GetBreakpointByID(bp_id).get(); 1078 StructuredData::ObjectSP bkpt_save_sp = bp->SerializeToStructuredData(); 1079 // If the user explicitly asked to serialize a breakpoint, and we 1080 // can't, then raise an error: 1081 if (!bkpt_save_sp) { 1082 error.SetErrorStringWithFormat("Unable to serialize breakpoint %d", 1083 bp_id); 1084 return error; 1085 } 1086 break_store_ptr->AddItem(bkpt_save_sp); 1087 } 1088 } 1089 } 1090 1091 break_store_ptr->Dump(out_file, false); 1092 out_file.PutChar('\n'); 1093 return error; 1094 } 1095 1096 Status Target::CreateBreakpointsFromFile(const FileSpec &file, 1097 BreakpointIDList &new_bps) { 1098 std::vector<std::string> no_names; 1099 return CreateBreakpointsFromFile(file, no_names, new_bps); 1100 } 1101 1102 Status Target::CreateBreakpointsFromFile(const FileSpec &file, 1103 std::vector<std::string> &names, 1104 BreakpointIDList &new_bps) { 1105 std::unique_lock<std::recursive_mutex> lock; 1106 GetBreakpointList().GetListMutex(lock); 1107 1108 Status error; 1109 StructuredData::ObjectSP input_data_sp = 1110 StructuredData::ParseJSONFromFile(file, error); 1111 if (!error.Success()) { 1112 return error; 1113 } else if (!input_data_sp || !input_data_sp->IsValid()) { 1114 error.SetErrorStringWithFormat("Invalid JSON from input file: %s.", 1115 file.GetPath().c_str()); 1116 return error; 1117 } 1118 1119 StructuredData::Array *bkpt_array = input_data_sp->GetAsArray(); 1120 if (!bkpt_array) { 1121 error.SetErrorStringWithFormat( 1122 "Invalid breakpoint data from input file: %s.", file.GetPath().c_str()); 1123 return error; 1124 } 1125 1126 size_t num_bkpts = bkpt_array->GetSize(); 1127 size_t num_names = names.size(); 1128 1129 for (size_t i = 0; i < num_bkpts; i++) { 1130 StructuredData::ObjectSP bkpt_object_sp = bkpt_array->GetItemAtIndex(i); 1131 // Peel off the breakpoint key, and feed the rest to the Breakpoint: 1132 StructuredData::Dictionary *bkpt_dict = bkpt_object_sp->GetAsDictionary(); 1133 if (!bkpt_dict) { 1134 error.SetErrorStringWithFormat( 1135 "Invalid breakpoint data for element %zu from input file: %s.", i, 1136 file.GetPath().c_str()); 1137 return error; 1138 } 1139 StructuredData::ObjectSP bkpt_data_sp = 1140 bkpt_dict->GetValueForKey(Breakpoint::GetSerializationKey()); 1141 if (num_names && 1142 !Breakpoint::SerializedBreakpointMatchesNames(bkpt_data_sp, names)) 1143 continue; 1144 1145 BreakpointSP bkpt_sp = 1146 Breakpoint::CreateFromStructuredData(*this, bkpt_data_sp, error); 1147 if (!error.Success()) { 1148 error.SetErrorStringWithFormat( 1149 "Error restoring breakpoint %zu from %s: %s.", i, 1150 file.GetPath().c_str(), error.AsCString()); 1151 return error; 1152 } 1153 new_bps.AddBreakpointID(BreakpointID(bkpt_sp->GetID())); 1154 } 1155 return error; 1156 } 1157 1158 // The flag 'end_to_end', default to true, signifies that the operation is 1159 // performed end to end, for both the debugger and the debuggee. 1160 1161 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 1162 // to end operations. 1163 bool Target::RemoveAllWatchpoints(bool end_to_end) { 1164 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1165 if (log) 1166 log->Printf("Target::%s\n", __FUNCTION__); 1167 1168 if (!end_to_end) { 1169 m_watchpoint_list.RemoveAll(true); 1170 return true; 1171 } 1172 1173 // Otherwise, it's an end to end operation. 1174 1175 if (!ProcessIsValid()) 1176 return false; 1177 1178 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1179 for (size_t i = 0; i < num_watchpoints; ++i) { 1180 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1181 if (!wp_sp) 1182 return false; 1183 1184 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 1185 if (rc.Fail()) 1186 return false; 1187 } 1188 m_watchpoint_list.RemoveAll(true); 1189 m_last_created_watchpoint.reset(); 1190 return true; // Success! 1191 } 1192 1193 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 1194 // to end operations. 1195 bool Target::DisableAllWatchpoints(bool end_to_end) { 1196 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1197 if (log) 1198 log->Printf("Target::%s\n", __FUNCTION__); 1199 1200 if (!end_to_end) { 1201 m_watchpoint_list.SetEnabledAll(false); 1202 return true; 1203 } 1204 1205 // Otherwise, it's an end to end operation. 1206 1207 if (!ProcessIsValid()) 1208 return false; 1209 1210 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1211 for (size_t i = 0; i < num_watchpoints; ++i) { 1212 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1213 if (!wp_sp) 1214 return false; 1215 1216 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 1217 if (rc.Fail()) 1218 return false; 1219 } 1220 return true; // Success! 1221 } 1222 1223 // Assumption: Caller holds the list mutex lock for m_watchpoint_list for end 1224 // to end operations. 1225 bool Target::EnableAllWatchpoints(bool end_to_end) { 1226 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1227 if (log) 1228 log->Printf("Target::%s\n", __FUNCTION__); 1229 1230 if (!end_to_end) { 1231 m_watchpoint_list.SetEnabledAll(true); 1232 return true; 1233 } 1234 1235 // Otherwise, it's an end to end operation. 1236 1237 if (!ProcessIsValid()) 1238 return false; 1239 1240 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1241 for (size_t i = 0; i < num_watchpoints; ++i) { 1242 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1243 if (!wp_sp) 1244 return false; 1245 1246 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 1247 if (rc.Fail()) 1248 return false; 1249 } 1250 return true; // Success! 1251 } 1252 1253 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1254 bool Target::ClearAllWatchpointHitCounts() { 1255 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1256 if (log) 1257 log->Printf("Target::%s\n", __FUNCTION__); 1258 1259 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1260 for (size_t i = 0; i < num_watchpoints; ++i) { 1261 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1262 if (!wp_sp) 1263 return false; 1264 1265 wp_sp->ResetHitCount(); 1266 } 1267 return true; // Success! 1268 } 1269 1270 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1271 bool Target::ClearAllWatchpointHistoricValues() { 1272 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1273 if (log) 1274 log->Printf("Target::%s\n", __FUNCTION__); 1275 1276 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1277 for (size_t i = 0; i < num_watchpoints; ++i) { 1278 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1279 if (!wp_sp) 1280 return false; 1281 1282 wp_sp->ResetHistoricValues(); 1283 } 1284 return true; // Success! 1285 } 1286 1287 // Assumption: Caller holds the list mutex lock for m_watchpoint_list during 1288 // these operations. 1289 bool Target::IgnoreAllWatchpoints(uint32_t ignore_count) { 1290 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1291 if (log) 1292 log->Printf("Target::%s\n", __FUNCTION__); 1293 1294 if (!ProcessIsValid()) 1295 return false; 1296 1297 size_t num_watchpoints = m_watchpoint_list.GetSize(); 1298 for (size_t i = 0; i < num_watchpoints; ++i) { 1299 WatchpointSP wp_sp = m_watchpoint_list.GetByIndex(i); 1300 if (!wp_sp) 1301 return false; 1302 1303 wp_sp->SetIgnoreCount(ignore_count); 1304 } 1305 return true; // Success! 1306 } 1307 1308 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1309 bool Target::DisableWatchpointByID(lldb::watch_id_t watch_id) { 1310 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1311 if (log) 1312 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1313 1314 if (!ProcessIsValid()) 1315 return false; 1316 1317 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id); 1318 if (wp_sp) { 1319 Status rc = m_process_sp->DisableWatchpoint(wp_sp.get()); 1320 if (rc.Success()) 1321 return true; 1322 1323 // Else, fallthrough. 1324 } 1325 return false; 1326 } 1327 1328 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1329 bool Target::EnableWatchpointByID(lldb::watch_id_t watch_id) { 1330 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1331 if (log) 1332 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1333 1334 if (!ProcessIsValid()) 1335 return false; 1336 1337 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id); 1338 if (wp_sp) { 1339 Status rc = m_process_sp->EnableWatchpoint(wp_sp.get()); 1340 if (rc.Success()) 1341 return true; 1342 1343 // Else, fallthrough. 1344 } 1345 return false; 1346 } 1347 1348 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1349 bool Target::RemoveWatchpointByID(lldb::watch_id_t watch_id) { 1350 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1351 if (log) 1352 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1353 1354 WatchpointSP watch_to_remove_sp = m_watchpoint_list.FindByID(watch_id); 1355 if (watch_to_remove_sp == m_last_created_watchpoint) 1356 m_last_created_watchpoint.reset(); 1357 1358 if (DisableWatchpointByID(watch_id)) { 1359 m_watchpoint_list.Remove(watch_id, true); 1360 return true; 1361 } 1362 return false; 1363 } 1364 1365 // Assumption: Caller holds the list mutex lock for m_watchpoint_list. 1366 bool Target::IgnoreWatchpointByID(lldb::watch_id_t watch_id, 1367 uint32_t ignore_count) { 1368 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_WATCHPOINTS)); 1369 if (log) 1370 log->Printf("Target::%s (watch_id = %i)\n", __FUNCTION__, watch_id); 1371 1372 if (!ProcessIsValid()) 1373 return false; 1374 1375 WatchpointSP wp_sp = m_watchpoint_list.FindByID(watch_id); 1376 if (wp_sp) { 1377 wp_sp->SetIgnoreCount(ignore_count); 1378 return true; 1379 } 1380 return false; 1381 } 1382 1383 ModuleSP Target::GetExecutableModule() { 1384 // search for the first executable in the module list 1385 for (size_t i = 0; i < m_images.GetSize(); ++i) { 1386 ModuleSP module_sp = m_images.GetModuleAtIndex(i); 1387 lldb_private::ObjectFile *obj = module_sp->GetObjectFile(); 1388 if (obj == nullptr) 1389 continue; 1390 if (obj->GetType() == ObjectFile::Type::eTypeExecutable) 1391 return module_sp; 1392 } 1393 // as fall back return the first module loaded 1394 return m_images.GetModuleAtIndex(0); 1395 } 1396 1397 Module *Target::GetExecutableModulePointer() { 1398 return GetExecutableModule().get(); 1399 } 1400 1401 static void LoadScriptingResourceForModule(const ModuleSP &module_sp, 1402 Target *target) { 1403 Status error; 1404 StreamString feedback_stream; 1405 if (module_sp && 1406 !module_sp->LoadScriptingResourceInTarget(target, error, 1407 &feedback_stream)) { 1408 if (error.AsCString()) 1409 target->GetDebugger().GetErrorFile()->Printf( 1410 "unable to load scripting data for module %s - error reported was " 1411 "%s\n", 1412 module_sp->GetFileSpec().GetFileNameStrippingExtension().GetCString(), 1413 error.AsCString()); 1414 } 1415 if (feedback_stream.GetSize()) 1416 target->GetDebugger().GetErrorFile()->Printf("%s\n", 1417 feedback_stream.GetData()); 1418 } 1419 1420 void Target::ClearModules(bool delete_locations) { 1421 ModulesDidUnload(m_images, delete_locations); 1422 m_section_load_history.Clear(); 1423 m_images.Clear(); 1424 m_scratch_type_system_map.Clear(); 1425 m_ast_importer_sp.reset(); 1426 } 1427 1428 void Target::DidExec() { 1429 // When a process exec's we need to know about it so we can do some cleanup. 1430 m_breakpoint_list.RemoveInvalidLocations(m_arch.GetSpec()); 1431 m_internal_breakpoint_list.RemoveInvalidLocations(m_arch.GetSpec()); 1432 } 1433 1434 void Target::SetExecutableModule(ModuleSP &executable_sp, 1435 LoadDependentFiles load_dependent_files) { 1436 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 1437 ClearModules(false); 1438 1439 if (executable_sp) { 1440 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION); 1441 Timer scoped_timer(func_cat, 1442 "Target::SetExecutableModule (executable = '%s')", 1443 executable_sp->GetFileSpec().GetPath().c_str()); 1444 1445 m_images.Append(executable_sp); // The first image is our executable file 1446 1447 // If we haven't set an architecture yet, reset our architecture based on 1448 // what we found in the executable module. 1449 if (!m_arch.GetSpec().IsValid()) { 1450 m_arch = executable_sp->GetArchitecture(); 1451 LLDB_LOG(log, 1452 "setting architecture to {0} ({1}) based on executable file", 1453 m_arch.GetSpec().GetArchitectureName(), 1454 m_arch.GetSpec().GetTriple().getTriple()); 1455 } 1456 1457 FileSpecList dependent_files; 1458 ObjectFile *executable_objfile = executable_sp->GetObjectFile(); 1459 bool load_dependents = true; 1460 switch (load_dependent_files) { 1461 case eLoadDependentsDefault: 1462 load_dependents = executable_sp->IsExecutable(); 1463 break; 1464 case eLoadDependentsYes: 1465 load_dependents = true; 1466 break; 1467 case eLoadDependentsNo: 1468 load_dependents = false; 1469 break; 1470 } 1471 1472 if (executable_objfile && load_dependents) { 1473 executable_objfile->GetDependentModules(dependent_files); 1474 for (uint32_t i = 0; i < dependent_files.GetSize(); i++) { 1475 FileSpec dependent_file_spec( 1476 dependent_files.GetFileSpecPointerAtIndex(i)); 1477 FileSpec platform_dependent_file_spec; 1478 if (m_platform_sp) 1479 m_platform_sp->GetFileWithUUID(dependent_file_spec, nullptr, 1480 platform_dependent_file_spec); 1481 else 1482 platform_dependent_file_spec = dependent_file_spec; 1483 1484 ModuleSpec module_spec(platform_dependent_file_spec, m_arch.GetSpec()); 1485 ModuleSP image_module_sp(GetSharedModule(module_spec)); 1486 if (image_module_sp) { 1487 ObjectFile *objfile = image_module_sp->GetObjectFile(); 1488 if (objfile) 1489 objfile->GetDependentModules(dependent_files); 1490 } 1491 } 1492 } 1493 } 1494 } 1495 1496 bool Target::SetArchitecture(const ArchSpec &arch_spec, bool set_platform) { 1497 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 1498 bool missing_local_arch = !m_arch.GetSpec().IsValid(); 1499 bool replace_local_arch = true; 1500 bool compatible_local_arch = false; 1501 ArchSpec other(arch_spec); 1502 1503 // Changing the architecture might mean that the currently selected platform 1504 // isn't compatible. Set the platform correctly if we are asked to do so, 1505 // otherwise assume the user will set the platform manually. 1506 if (set_platform) { 1507 if (other.IsValid()) { 1508 auto platform_sp = GetPlatform(); 1509 if (!platform_sp || 1510 !platform_sp->IsCompatibleArchitecture(other, false, nullptr)) { 1511 ArchSpec platform_arch; 1512 auto arch_platform_sp = 1513 Platform::GetPlatformForArchitecture(other, &platform_arch); 1514 if (arch_platform_sp) { 1515 SetPlatform(arch_platform_sp); 1516 if (platform_arch.IsValid()) 1517 other = platform_arch; 1518 } 1519 } 1520 } 1521 } 1522 1523 if (!missing_local_arch) { 1524 if (m_arch.GetSpec().IsCompatibleMatch(arch_spec)) { 1525 other.MergeFrom(m_arch.GetSpec()); 1526 1527 if (m_arch.GetSpec().IsCompatibleMatch(other)) { 1528 compatible_local_arch = true; 1529 bool arch_changed, vendor_changed, os_changed, os_ver_changed, 1530 env_changed; 1531 1532 m_arch.GetSpec().PiecewiseTripleCompare(other, arch_changed, vendor_changed, 1533 os_changed, os_ver_changed, env_changed); 1534 1535 if (!arch_changed && !vendor_changed && !os_changed && !env_changed) 1536 replace_local_arch = false; 1537 } 1538 } 1539 } 1540 1541 if (compatible_local_arch || missing_local_arch) { 1542 // If we haven't got a valid arch spec, or the architectures are compatible 1543 // update the architecture, unless the one we already have is more 1544 // specified 1545 if (replace_local_arch) 1546 m_arch = other; 1547 LLDB_LOG(log, "set architecture to {0} ({1})", 1548 m_arch.GetSpec().GetArchitectureName(), 1549 m_arch.GetSpec().GetTriple().getTriple()); 1550 return true; 1551 } 1552 1553 // If we have an executable file, try to reset the executable to the desired 1554 // architecture 1555 if (log) 1556 log->Printf("Target::SetArchitecture changing architecture to %s (%s)", 1557 arch_spec.GetArchitectureName(), 1558 arch_spec.GetTriple().getTriple().c_str()); 1559 m_arch = other; 1560 ModuleSP executable_sp = GetExecutableModule(); 1561 1562 ClearModules(true); 1563 // Need to do something about unsetting breakpoints. 1564 1565 if (executable_sp) { 1566 if (log) 1567 log->Printf("Target::SetArchitecture Trying to select executable file " 1568 "architecture %s (%s)", 1569 arch_spec.GetArchitectureName(), 1570 arch_spec.GetTriple().getTriple().c_str()); 1571 ModuleSpec module_spec(executable_sp->GetFileSpec(), other); 1572 Status error = ModuleList::GetSharedModule(module_spec, executable_sp, 1573 &GetExecutableSearchPaths(), 1574 nullptr, nullptr); 1575 1576 if (!error.Fail() && executable_sp) { 1577 SetExecutableModule(executable_sp, eLoadDependentsYes); 1578 return true; 1579 } 1580 } 1581 return false; 1582 } 1583 1584 bool Target::MergeArchitecture(const ArchSpec &arch_spec) { 1585 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 1586 if (arch_spec.IsValid()) { 1587 if (m_arch.GetSpec().IsCompatibleMatch(arch_spec)) { 1588 // The current target arch is compatible with "arch_spec", see if we can 1589 // improve our current architecture using bits from "arch_spec" 1590 1591 if (log) 1592 log->Printf("Target::MergeArchitecture target has arch %s, merging with " 1593 "arch %s", 1594 m_arch.GetSpec().GetTriple().getTriple().c_str(), 1595 arch_spec.GetTriple().getTriple().c_str()); 1596 1597 // Merge bits from arch_spec into "merged_arch" and set our architecture 1598 ArchSpec merged_arch(m_arch.GetSpec()); 1599 merged_arch.MergeFrom(arch_spec); 1600 return SetArchitecture(merged_arch); 1601 } else { 1602 // The new architecture is different, we just need to replace it 1603 return SetArchitecture(arch_spec); 1604 } 1605 } 1606 return false; 1607 } 1608 1609 void Target::WillClearList(const ModuleList &module_list) {} 1610 1611 void Target::ModuleAdded(const ModuleList &module_list, 1612 const ModuleSP &module_sp) { 1613 // A module is being added to this target for the first time 1614 if (m_valid) { 1615 ModuleList my_module_list; 1616 my_module_list.Append(module_sp); 1617 LoadScriptingResourceForModule(module_sp, this); 1618 ModulesDidLoad(my_module_list); 1619 } 1620 } 1621 1622 void Target::ModuleRemoved(const ModuleList &module_list, 1623 const ModuleSP &module_sp) { 1624 // A module is being removed from this target. 1625 if (m_valid) { 1626 ModuleList my_module_list; 1627 my_module_list.Append(module_sp); 1628 ModulesDidUnload(my_module_list, false); 1629 } 1630 } 1631 1632 void Target::ModuleUpdated(const ModuleList &module_list, 1633 const ModuleSP &old_module_sp, 1634 const ModuleSP &new_module_sp) { 1635 // A module is replacing an already added module 1636 if (m_valid) { 1637 m_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced(old_module_sp, 1638 new_module_sp); 1639 m_internal_breakpoint_list.UpdateBreakpointsWhenModuleIsReplaced( 1640 old_module_sp, new_module_sp); 1641 } 1642 } 1643 1644 void Target::ModulesDidLoad(ModuleList &module_list) { 1645 if (m_valid && module_list.GetSize()) { 1646 m_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1647 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1648 if (m_process_sp) { 1649 m_process_sp->ModulesDidLoad(module_list); 1650 } 1651 BroadcastEvent(eBroadcastBitModulesLoaded, 1652 new TargetEventData(this->shared_from_this(), module_list)); 1653 } 1654 } 1655 1656 void Target::SymbolsDidLoad(ModuleList &module_list) { 1657 if (m_valid && module_list.GetSize()) { 1658 if (m_process_sp) { 1659 LanguageRuntime *runtime = 1660 m_process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC); 1661 if (runtime) { 1662 ObjCLanguageRuntime *objc_runtime = (ObjCLanguageRuntime *)runtime; 1663 objc_runtime->SymbolsDidLoad(module_list); 1664 } 1665 } 1666 1667 m_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1668 m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false); 1669 BroadcastEvent(eBroadcastBitSymbolsLoaded, 1670 new TargetEventData(this->shared_from_this(), module_list)); 1671 } 1672 } 1673 1674 void Target::ModulesDidUnload(ModuleList &module_list, bool delete_locations) { 1675 if (m_valid && module_list.GetSize()) { 1676 UnloadModuleSections(module_list); 1677 m_breakpoint_list.UpdateBreakpoints(module_list, false, delete_locations); 1678 m_internal_breakpoint_list.UpdateBreakpoints(module_list, false, 1679 delete_locations); 1680 BroadcastEvent(eBroadcastBitModulesUnloaded, 1681 new TargetEventData(this->shared_from_this(), module_list)); 1682 } 1683 } 1684 1685 bool Target::ModuleIsExcludedForUnconstrainedSearches( 1686 const FileSpec &module_file_spec) { 1687 if (GetBreakpointsConsultPlatformAvoidList()) { 1688 ModuleList matchingModules; 1689 ModuleSpec module_spec(module_file_spec); 1690 size_t num_modules = GetImages().FindModules(module_spec, matchingModules); 1691 1692 // If there is more than one module for this file spec, only return true if 1693 // ALL the modules are on the 1694 // black list. 1695 if (num_modules > 0) { 1696 for (size_t i = 0; i < num_modules; i++) { 1697 if (!ModuleIsExcludedForUnconstrainedSearches( 1698 matchingModules.GetModuleAtIndex(i))) 1699 return false; 1700 } 1701 return true; 1702 } 1703 } 1704 return false; 1705 } 1706 1707 bool Target::ModuleIsExcludedForUnconstrainedSearches( 1708 const lldb::ModuleSP &module_sp) { 1709 if (GetBreakpointsConsultPlatformAvoidList()) { 1710 if (m_platform_sp) 1711 return m_platform_sp->ModuleIsExcludedForUnconstrainedSearches(*this, 1712 module_sp); 1713 } 1714 return false; 1715 } 1716 1717 size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst, 1718 size_t dst_len, Status &error) { 1719 SectionSP section_sp(addr.GetSection()); 1720 if (section_sp) { 1721 // If the contents of this section are encrypted, the on-disk file is 1722 // unusable. Read only from live memory. 1723 if (section_sp->IsEncrypted()) { 1724 error.SetErrorString("section is encrypted"); 1725 return 0; 1726 } 1727 ModuleSP module_sp(section_sp->GetModule()); 1728 if (module_sp) { 1729 ObjectFile *objfile = section_sp->GetModule()->GetObjectFile(); 1730 if (objfile) { 1731 size_t bytes_read = objfile->ReadSectionData( 1732 section_sp.get(), addr.GetOffset(), dst, dst_len); 1733 if (bytes_read > 0) 1734 return bytes_read; 1735 else 1736 error.SetErrorStringWithFormat("error reading data from section %s", 1737 section_sp->GetName().GetCString()); 1738 } else 1739 error.SetErrorString("address isn't from a object file"); 1740 } else 1741 error.SetErrorString("address isn't in a module"); 1742 } else 1743 error.SetErrorString("address doesn't contain a section that points to a " 1744 "section in a object file"); 1745 1746 return 0; 1747 } 1748 1749 size_t Target::ReadMemory(const Address &addr, bool prefer_file_cache, 1750 void *dst, size_t dst_len, Status &error, 1751 lldb::addr_t *load_addr_ptr) { 1752 error.Clear(); 1753 1754 // if we end up reading this from process memory, we will fill this with the 1755 // actual load address 1756 if (load_addr_ptr) 1757 *load_addr_ptr = LLDB_INVALID_ADDRESS; 1758 1759 size_t bytes_read = 0; 1760 1761 addr_t load_addr = LLDB_INVALID_ADDRESS; 1762 addr_t file_addr = LLDB_INVALID_ADDRESS; 1763 Address resolved_addr; 1764 if (!addr.IsSectionOffset()) { 1765 SectionLoadList §ion_load_list = GetSectionLoadList(); 1766 if (section_load_list.IsEmpty()) { 1767 // No sections are loaded, so we must assume we are not running yet and 1768 // anything we are given is a file address. 1769 file_addr = addr.GetOffset(); // "addr" doesn't have a section, so its 1770 // offset is the file address 1771 m_images.ResolveFileAddress(file_addr, resolved_addr); 1772 } else { 1773 // We have at least one section loaded. This can be because we have 1774 // manually loaded some sections with "target modules load ..." or 1775 // because we have have a live process that has sections loaded through 1776 // the dynamic loader 1777 load_addr = addr.GetOffset(); // "addr" doesn't have a section, so its 1778 // offset is the load address 1779 section_load_list.ResolveLoadAddress(load_addr, resolved_addr); 1780 } 1781 } 1782 if (!resolved_addr.IsValid()) 1783 resolved_addr = addr; 1784 1785 if (prefer_file_cache) { 1786 bytes_read = ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error); 1787 if (bytes_read > 0) 1788 return bytes_read; 1789 } 1790 1791 if (ProcessIsValid()) { 1792 if (load_addr == LLDB_INVALID_ADDRESS) 1793 load_addr = resolved_addr.GetLoadAddress(this); 1794 1795 if (load_addr == LLDB_INVALID_ADDRESS) { 1796 ModuleSP addr_module_sp(resolved_addr.GetModule()); 1797 if (addr_module_sp && addr_module_sp->GetFileSpec()) 1798 error.SetErrorStringWithFormatv( 1799 "{0:F}[{1:x+}] can't be resolved, {0:F} is not currently loaded", 1800 addr_module_sp->GetFileSpec(), resolved_addr.GetFileAddress()); 1801 else 1802 error.SetErrorStringWithFormat("0x%" PRIx64 " can't be resolved", 1803 resolved_addr.GetFileAddress()); 1804 } else { 1805 bytes_read = m_process_sp->ReadMemory(load_addr, dst, dst_len, error); 1806 if (bytes_read != dst_len) { 1807 if (error.Success()) { 1808 if (bytes_read == 0) 1809 error.SetErrorStringWithFormat( 1810 "read memory from 0x%" PRIx64 " failed", load_addr); 1811 else 1812 error.SetErrorStringWithFormat( 1813 "only %" PRIu64 " of %" PRIu64 1814 " bytes were read from memory at 0x%" PRIx64, 1815 (uint64_t)bytes_read, (uint64_t)dst_len, load_addr); 1816 } 1817 } 1818 if (bytes_read) { 1819 if (load_addr_ptr) 1820 *load_addr_ptr = load_addr; 1821 return bytes_read; 1822 } 1823 // If the address is not section offset we have an address that doesn't 1824 // resolve to any address in any currently loaded shared libraries and we 1825 // failed to read memory so there isn't anything more we can do. If it is 1826 // section offset, we might be able to read cached memory from the object 1827 // file. 1828 if (!resolved_addr.IsSectionOffset()) 1829 return 0; 1830 } 1831 } 1832 1833 if (!prefer_file_cache && resolved_addr.IsSectionOffset()) { 1834 // If we didn't already try and read from the object file cache, then try 1835 // it after failing to read from the process. 1836 return ReadMemoryFromFileCache(resolved_addr, dst, dst_len, error); 1837 } 1838 return 0; 1839 } 1840 1841 size_t Target::ReadCStringFromMemory(const Address &addr, std::string &out_str, 1842 Status &error) { 1843 char buf[256]; 1844 out_str.clear(); 1845 addr_t curr_addr = addr.GetLoadAddress(this); 1846 Address address(addr); 1847 while (1) { 1848 size_t length = ReadCStringFromMemory(address, buf, sizeof(buf), error); 1849 if (length == 0) 1850 break; 1851 out_str.append(buf, length); 1852 // If we got "length - 1" bytes, we didn't get the whole C string, we need 1853 // to read some more characters 1854 if (length == sizeof(buf) - 1) 1855 curr_addr += length; 1856 else 1857 break; 1858 address = Address(curr_addr); 1859 } 1860 return out_str.size(); 1861 } 1862 1863 size_t Target::ReadCStringFromMemory(const Address &addr, char *dst, 1864 size_t dst_max_len, Status &result_error) { 1865 size_t total_cstr_len = 0; 1866 if (dst && dst_max_len) { 1867 result_error.Clear(); 1868 // NULL out everything just to be safe 1869 memset(dst, 0, dst_max_len); 1870 Status error; 1871 addr_t curr_addr = addr.GetLoadAddress(this); 1872 Address address(addr); 1873 1874 // We could call m_process_sp->GetMemoryCacheLineSize() but I don't think 1875 // this really needs to be tied to the memory cache subsystem's cache line 1876 // size, so leave this as a fixed constant. 1877 const size_t cache_line_size = 512; 1878 1879 size_t bytes_left = dst_max_len - 1; 1880 char *curr_dst = dst; 1881 1882 while (bytes_left > 0) { 1883 addr_t cache_line_bytes_left = 1884 cache_line_size - (curr_addr % cache_line_size); 1885 addr_t bytes_to_read = 1886 std::min<addr_t>(bytes_left, cache_line_bytes_left); 1887 size_t bytes_read = 1888 ReadMemory(address, false, curr_dst, bytes_to_read, error); 1889 1890 if (bytes_read == 0) { 1891 result_error = error; 1892 dst[total_cstr_len] = '\0'; 1893 break; 1894 } 1895 const size_t len = strlen(curr_dst); 1896 1897 total_cstr_len += len; 1898 1899 if (len < bytes_to_read) 1900 break; 1901 1902 curr_dst += bytes_read; 1903 curr_addr += bytes_read; 1904 bytes_left -= bytes_read; 1905 address = Address(curr_addr); 1906 } 1907 } else { 1908 if (dst == nullptr) 1909 result_error.SetErrorString("invalid arguments"); 1910 else 1911 result_error.Clear(); 1912 } 1913 return total_cstr_len; 1914 } 1915 1916 size_t Target::ReadScalarIntegerFromMemory(const Address &addr, 1917 bool prefer_file_cache, 1918 uint32_t byte_size, bool is_signed, 1919 Scalar &scalar, Status &error) { 1920 uint64_t uval; 1921 1922 if (byte_size <= sizeof(uval)) { 1923 size_t bytes_read = 1924 ReadMemory(addr, prefer_file_cache, &uval, byte_size, error); 1925 if (bytes_read == byte_size) { 1926 DataExtractor data(&uval, sizeof(uval), m_arch.GetSpec().GetByteOrder(), 1927 m_arch.GetSpec().GetAddressByteSize()); 1928 lldb::offset_t offset = 0; 1929 if (byte_size <= 4) 1930 scalar = data.GetMaxU32(&offset, byte_size); 1931 else 1932 scalar = data.GetMaxU64(&offset, byte_size); 1933 1934 if (is_signed) 1935 scalar.SignExtend(byte_size * 8); 1936 return bytes_read; 1937 } 1938 } else { 1939 error.SetErrorStringWithFormat( 1940 "byte size of %u is too large for integer scalar type", byte_size); 1941 } 1942 return 0; 1943 } 1944 1945 uint64_t Target::ReadUnsignedIntegerFromMemory(const Address &addr, 1946 bool prefer_file_cache, 1947 size_t integer_byte_size, 1948 uint64_t fail_value, 1949 Status &error) { 1950 Scalar scalar; 1951 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, integer_byte_size, 1952 false, scalar, error)) 1953 return scalar.ULongLong(fail_value); 1954 return fail_value; 1955 } 1956 1957 bool Target::ReadPointerFromMemory(const Address &addr, bool prefer_file_cache, 1958 Status &error, Address &pointer_addr) { 1959 Scalar scalar; 1960 if (ReadScalarIntegerFromMemory(addr, prefer_file_cache, 1961 m_arch.GetSpec().GetAddressByteSize(), false, scalar, 1962 error)) { 1963 addr_t pointer_vm_addr = scalar.ULongLong(LLDB_INVALID_ADDRESS); 1964 if (pointer_vm_addr != LLDB_INVALID_ADDRESS) { 1965 SectionLoadList §ion_load_list = GetSectionLoadList(); 1966 if (section_load_list.IsEmpty()) { 1967 // No sections are loaded, so we must assume we are not running yet and 1968 // anything we are given is a file address. 1969 m_images.ResolveFileAddress(pointer_vm_addr, pointer_addr); 1970 } else { 1971 // We have at least one section loaded. This can be because we have 1972 // manually loaded some sections with "target modules load ..." or 1973 // because we have have a live process that has sections loaded through 1974 // the dynamic loader 1975 section_load_list.ResolveLoadAddress(pointer_vm_addr, pointer_addr); 1976 } 1977 // We weren't able to resolve the pointer value, so just return an 1978 // address with no section 1979 if (!pointer_addr.IsValid()) 1980 pointer_addr.SetOffset(pointer_vm_addr); 1981 return true; 1982 } 1983 } 1984 return false; 1985 } 1986 1987 ModuleSP Target::GetSharedModule(const ModuleSpec &module_spec, 1988 Status *error_ptr) { 1989 ModuleSP module_sp; 1990 1991 Status error; 1992 1993 // First see if we already have this module in our module list. If we do, 1994 // then we're done, we don't need to consult the shared modules list. But 1995 // only do this if we are passed a UUID. 1996 1997 if (module_spec.GetUUID().IsValid()) 1998 module_sp = m_images.FindFirstModule(module_spec); 1999 2000 if (!module_sp) { 2001 ModuleSP old_module_sp; // This will get filled in if we have a new version 2002 // of the library 2003 bool did_create_module = false; 2004 2005 // If there are image search path entries, try to use them first to acquire 2006 // a suitable image. 2007 if (m_image_search_paths.GetSize()) { 2008 ModuleSpec transformed_spec(module_spec); 2009 if (m_image_search_paths.RemapPath( 2010 module_spec.GetFileSpec().GetDirectory(), 2011 transformed_spec.GetFileSpec().GetDirectory())) { 2012 transformed_spec.GetFileSpec().GetFilename() = 2013 module_spec.GetFileSpec().GetFilename(); 2014 error = ModuleList::GetSharedModule(transformed_spec, module_sp, 2015 &GetExecutableSearchPaths(), 2016 &old_module_sp, &did_create_module); 2017 } 2018 } 2019 2020 if (!module_sp) { 2021 // If we have a UUID, we can check our global shared module list in case 2022 // we already have it. If we don't have a valid UUID, then we can't since 2023 // the path in "module_spec" will be a platform path, and we will need to 2024 // let the platform find that file. For example, we could be asking for 2025 // "/usr/lib/dyld" and if we do not have a UUID, we don't want to pick 2026 // the local copy of "/usr/lib/dyld" since our platform could be a remote 2027 // platform that has its own "/usr/lib/dyld" in an SDK or in a local file 2028 // cache. 2029 if (module_spec.GetUUID().IsValid()) { 2030 // We have a UUID, it is OK to check the global module list... 2031 error = ModuleList::GetSharedModule(module_spec, module_sp, 2032 &GetExecutableSearchPaths(), 2033 &old_module_sp, &did_create_module); 2034 } 2035 2036 if (!module_sp) { 2037 // The platform is responsible for finding and caching an appropriate 2038 // module in the shared module cache. 2039 if (m_platform_sp) { 2040 error = m_platform_sp->GetSharedModule( 2041 module_spec, m_process_sp.get(), module_sp, 2042 &GetExecutableSearchPaths(), &old_module_sp, &did_create_module); 2043 } else { 2044 error.SetErrorString("no platform is currently set"); 2045 } 2046 } 2047 } 2048 2049 // We found a module that wasn't in our target list. Let's make sure that 2050 // there wasn't an equivalent module in the list already, and if there was, 2051 // let's remove it. 2052 if (module_sp) { 2053 ObjectFile *objfile = module_sp->GetObjectFile(); 2054 if (objfile) { 2055 switch (objfile->GetType()) { 2056 case ObjectFile::eTypeCoreFile: /// A core file that has a checkpoint of 2057 /// a program's execution state 2058 case ObjectFile::eTypeExecutable: /// A normal executable 2059 case ObjectFile::eTypeDynamicLinker: /// The platform's dynamic linker 2060 /// executable 2061 case ObjectFile::eTypeObjectFile: /// An intermediate object file 2062 case ObjectFile::eTypeSharedLibrary: /// A shared library that can be 2063 /// used during execution 2064 break; 2065 case ObjectFile::eTypeDebugInfo: /// An object file that contains only 2066 /// debug information 2067 if (error_ptr) 2068 error_ptr->SetErrorString("debug info files aren't valid target " 2069 "modules, please specify an executable"); 2070 return ModuleSP(); 2071 case ObjectFile::eTypeStubLibrary: /// A library that can be linked 2072 /// against but not used for 2073 /// execution 2074 if (error_ptr) 2075 error_ptr->SetErrorString("stub libraries aren't valid target " 2076 "modules, please specify an executable"); 2077 return ModuleSP(); 2078 default: 2079 if (error_ptr) 2080 error_ptr->SetErrorString( 2081 "unsupported file type, please specify an executable"); 2082 return ModuleSP(); 2083 } 2084 // GetSharedModule is not guaranteed to find the old shared module, for 2085 // instance in the common case where you pass in the UUID, it is only 2086 // going to find the one module matching the UUID. In fact, it has no 2087 // good way to know what the "old module" relevant to this target is, 2088 // since there might be many copies of a module with this file spec in 2089 // various running debug sessions, but only one of them will belong to 2090 // this target. So let's remove the UUID from the module list, and look 2091 // in the target's module list. Only do this if there is SOMETHING else 2092 // in the module spec... 2093 if (!old_module_sp) { 2094 if (module_spec.GetUUID().IsValid() && 2095 !module_spec.GetFileSpec().GetFilename().IsEmpty() && 2096 !module_spec.GetFileSpec().GetDirectory().IsEmpty()) { 2097 ModuleSpec module_spec_copy(module_spec.GetFileSpec()); 2098 module_spec_copy.GetUUID().Clear(); 2099 2100 ModuleList found_modules; 2101 size_t num_found = 2102 m_images.FindModules(module_spec_copy, found_modules); 2103 if (num_found == 1) { 2104 old_module_sp = found_modules.GetModuleAtIndex(0); 2105 } 2106 } 2107 } 2108 2109 // Preload symbols outside of any lock, so hopefully we can do this for 2110 // each library in parallel. 2111 if (GetPreloadSymbols()) 2112 module_sp->PreloadSymbols(); 2113 2114 if (old_module_sp && 2115 m_images.GetIndexForModule(old_module_sp.get()) != 2116 LLDB_INVALID_INDEX32) { 2117 m_images.ReplaceModule(old_module_sp, module_sp); 2118 Module *old_module_ptr = old_module_sp.get(); 2119 old_module_sp.reset(); 2120 ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr); 2121 } else 2122 m_images.Append(module_sp); 2123 } else 2124 module_sp.reset(); 2125 } 2126 } 2127 if (error_ptr) 2128 *error_ptr = error; 2129 return module_sp; 2130 } 2131 2132 TargetSP Target::CalculateTarget() { return shared_from_this(); } 2133 2134 ProcessSP Target::CalculateProcess() { return m_process_sp; } 2135 2136 ThreadSP Target::CalculateThread() { return ThreadSP(); } 2137 2138 StackFrameSP Target::CalculateStackFrame() { return StackFrameSP(); } 2139 2140 void Target::CalculateExecutionContext(ExecutionContext &exe_ctx) { 2141 exe_ctx.Clear(); 2142 exe_ctx.SetTargetPtr(this); 2143 } 2144 2145 PathMappingList &Target::GetImageSearchPathList() { 2146 return m_image_search_paths; 2147 } 2148 2149 void Target::ImageSearchPathsChanged(const PathMappingList &path_list, 2150 void *baton) { 2151 Target *target = (Target *)baton; 2152 ModuleSP exe_module_sp(target->GetExecutableModule()); 2153 if (exe_module_sp) 2154 target->SetExecutableModule(exe_module_sp, eLoadDependentsYes); 2155 } 2156 2157 TypeSystem *Target::GetScratchTypeSystemForLanguage(Status *error, 2158 lldb::LanguageType language, 2159 bool create_on_demand) { 2160 if (!m_valid) 2161 return nullptr; 2162 2163 if (error) { 2164 error->Clear(); 2165 } 2166 2167 if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all 2168 // assembly code 2169 || language == eLanguageTypeUnknown) { 2170 std::set<lldb::LanguageType> languages_for_types; 2171 std::set<lldb::LanguageType> languages_for_expressions; 2172 2173 Language::GetLanguagesSupportingTypeSystems(languages_for_types, 2174 languages_for_expressions); 2175 2176 if (languages_for_expressions.count(eLanguageTypeC)) { 2177 language = eLanguageTypeC; // LLDB's default. Override by setting the 2178 // target language. 2179 } else { 2180 if (languages_for_expressions.empty()) { 2181 return nullptr; 2182 } else { 2183 language = *languages_for_expressions.begin(); 2184 } 2185 } 2186 } 2187 2188 return m_scratch_type_system_map.GetTypeSystemForLanguage(language, this, 2189 create_on_demand); 2190 } 2191 2192 PersistentExpressionState * 2193 Target::GetPersistentExpressionStateForLanguage(lldb::LanguageType language) { 2194 TypeSystem *type_system = 2195 GetScratchTypeSystemForLanguage(nullptr, language, true); 2196 2197 if (type_system) { 2198 return type_system->GetPersistentExpressionState(); 2199 } else { 2200 return nullptr; 2201 } 2202 } 2203 2204 UserExpression *Target::GetUserExpressionForLanguage( 2205 llvm::StringRef expr, llvm::StringRef prefix, lldb::LanguageType language, 2206 Expression::ResultType desired_type, 2207 const EvaluateExpressionOptions &options, 2208 ValueObject *ctx_obj, Status &error) { 2209 Status type_system_error; 2210 2211 TypeSystem *type_system = 2212 GetScratchTypeSystemForLanguage(&type_system_error, language); 2213 UserExpression *user_expr = nullptr; 2214 2215 if (!type_system) { 2216 error.SetErrorStringWithFormat( 2217 "Could not find type system for language %s: %s", 2218 Language::GetNameForLanguageType(language), 2219 type_system_error.AsCString()); 2220 return nullptr; 2221 } 2222 2223 user_expr = type_system->GetUserExpression(expr, prefix, language, 2224 desired_type, options, ctx_obj); 2225 if (!user_expr) 2226 error.SetErrorStringWithFormat( 2227 "Could not create an expression for language %s", 2228 Language::GetNameForLanguageType(language)); 2229 2230 return user_expr; 2231 } 2232 2233 FunctionCaller *Target::GetFunctionCallerForLanguage( 2234 lldb::LanguageType language, const CompilerType &return_type, 2235 const Address &function_address, const ValueList &arg_value_list, 2236 const char *name, Status &error) { 2237 Status type_system_error; 2238 TypeSystem *type_system = 2239 GetScratchTypeSystemForLanguage(&type_system_error, language); 2240 FunctionCaller *persistent_fn = nullptr; 2241 2242 if (!type_system) { 2243 error.SetErrorStringWithFormat( 2244 "Could not find type system for language %s: %s", 2245 Language::GetNameForLanguageType(language), 2246 type_system_error.AsCString()); 2247 return persistent_fn; 2248 } 2249 2250 persistent_fn = type_system->GetFunctionCaller(return_type, function_address, 2251 arg_value_list, name); 2252 if (!persistent_fn) 2253 error.SetErrorStringWithFormat( 2254 "Could not create an expression for language %s", 2255 Language::GetNameForLanguageType(language)); 2256 2257 return persistent_fn; 2258 } 2259 2260 UtilityFunction * 2261 Target::GetUtilityFunctionForLanguage(const char *text, 2262 lldb::LanguageType language, 2263 const char *name, Status &error) { 2264 Status type_system_error; 2265 TypeSystem *type_system = 2266 GetScratchTypeSystemForLanguage(&type_system_error, language); 2267 UtilityFunction *utility_fn = nullptr; 2268 2269 if (!type_system) { 2270 error.SetErrorStringWithFormat( 2271 "Could not find type system for language %s: %s", 2272 Language::GetNameForLanguageType(language), 2273 type_system_error.AsCString()); 2274 return utility_fn; 2275 } 2276 2277 utility_fn = type_system->GetUtilityFunction(text, name); 2278 if (!utility_fn) 2279 error.SetErrorStringWithFormat( 2280 "Could not create an expression for language %s", 2281 Language::GetNameForLanguageType(language)); 2282 2283 return utility_fn; 2284 } 2285 2286 ClangASTContext *Target::GetScratchClangASTContext(bool create_on_demand) { 2287 if (m_valid) { 2288 if (TypeSystem *type_system = GetScratchTypeSystemForLanguage( 2289 nullptr, eLanguageTypeC, create_on_demand)) 2290 return llvm::dyn_cast<ClangASTContext>(type_system); 2291 } 2292 return nullptr; 2293 } 2294 2295 ClangASTImporterSP Target::GetClangASTImporter() { 2296 if (m_valid) { 2297 if (!m_ast_importer_sp) { 2298 m_ast_importer_sp = std::make_shared<ClangASTImporter>(); 2299 } 2300 return m_ast_importer_sp; 2301 } 2302 return ClangASTImporterSP(); 2303 } 2304 2305 void Target::SettingsInitialize() { Process::SettingsInitialize(); } 2306 2307 void Target::SettingsTerminate() { Process::SettingsTerminate(); } 2308 2309 FileSpecList Target::GetDefaultExecutableSearchPaths() { 2310 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2311 if (properties_sp) 2312 return properties_sp->GetExecutableSearchPaths(); 2313 return FileSpecList(); 2314 } 2315 2316 FileSpecList Target::GetDefaultDebugFileSearchPaths() { 2317 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2318 if (properties_sp) 2319 return properties_sp->GetDebugFileSearchPaths(); 2320 return FileSpecList(); 2321 } 2322 2323 FileSpecList Target::GetDefaultClangModuleSearchPaths() { 2324 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2325 if (properties_sp) 2326 return properties_sp->GetClangModuleSearchPaths(); 2327 return FileSpecList(); 2328 } 2329 2330 ArchSpec Target::GetDefaultArchitecture() { 2331 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2332 if (properties_sp) 2333 return properties_sp->GetDefaultArchitecture(); 2334 return ArchSpec(); 2335 } 2336 2337 void Target::SetDefaultArchitecture(const ArchSpec &arch) { 2338 TargetPropertiesSP properties_sp(Target::GetGlobalProperties()); 2339 if (properties_sp) { 2340 LogIfAnyCategoriesSet( 2341 LIBLLDB_LOG_TARGET, "Target::SetDefaultArchitecture setting target's " 2342 "default architecture to %s (%s)", 2343 arch.GetArchitectureName(), arch.GetTriple().getTriple().c_str()); 2344 return properties_sp->SetDefaultArchitecture(arch); 2345 } 2346 } 2347 2348 Target *Target::GetTargetFromContexts(const ExecutionContext *exe_ctx_ptr, 2349 const SymbolContext *sc_ptr) { 2350 // The target can either exist in the "process" of ExecutionContext, or in 2351 // the "target_sp" member of SymbolContext. This accessor helper function 2352 // will get the target from one of these locations. 2353 2354 Target *target = nullptr; 2355 if (sc_ptr != nullptr) 2356 target = sc_ptr->target_sp.get(); 2357 if (target == nullptr && exe_ctx_ptr) 2358 target = exe_ctx_ptr->GetTargetPtr(); 2359 return target; 2360 } 2361 2362 ExpressionResults Target::EvaluateExpression( 2363 llvm::StringRef expr, ExecutionContextScope *exe_scope, 2364 lldb::ValueObjectSP &result_valobj_sp, 2365 const EvaluateExpressionOptions &options, std::string *fixed_expression, 2366 ValueObject *ctx_obj) { 2367 result_valobj_sp.reset(); 2368 2369 ExpressionResults execution_results = eExpressionSetupError; 2370 2371 if (expr.empty()) 2372 return execution_results; 2373 2374 // We shouldn't run stop hooks in expressions. Be sure to reset this if you 2375 // return anywhere within this function. 2376 bool old_suppress_value = m_suppress_stop_hooks; 2377 m_suppress_stop_hooks = true; 2378 2379 ExecutionContext exe_ctx; 2380 2381 if (exe_scope) { 2382 exe_scope->CalculateExecutionContext(exe_ctx); 2383 } else if (m_process_sp) { 2384 m_process_sp->CalculateExecutionContext(exe_ctx); 2385 } else { 2386 CalculateExecutionContext(exe_ctx); 2387 } 2388 2389 // Make sure we aren't just trying to see the value of a persistent variable 2390 // (something like "$0") 2391 lldb::ExpressionVariableSP persistent_var_sp; 2392 // Only check for persistent variables the expression starts with a '$' 2393 if (expr[0] == '$') 2394 persistent_var_sp = GetScratchTypeSystemForLanguage(nullptr, eLanguageTypeC) 2395 ->GetPersistentExpressionState() 2396 ->GetVariable(expr); 2397 2398 if (persistent_var_sp) { 2399 result_valobj_sp = persistent_var_sp->GetValueObject(); 2400 execution_results = eExpressionCompleted; 2401 } else { 2402 llvm::StringRef prefix = GetExpressionPrefixContents(); 2403 Status error; 2404 execution_results = 2405 UserExpression::Evaluate(exe_ctx, options, expr, prefix, 2406 result_valobj_sp, error, fixed_expression, 2407 nullptr, // Module 2408 ctx_obj); 2409 } 2410 2411 m_suppress_stop_hooks = old_suppress_value; 2412 2413 return execution_results; 2414 } 2415 2416 lldb::ExpressionVariableSP 2417 Target::GetPersistentVariable(ConstString name) { 2418 lldb::ExpressionVariableSP variable_sp; 2419 m_scratch_type_system_map.ForEach( 2420 [name, &variable_sp](TypeSystem *type_system) -> bool { 2421 if (PersistentExpressionState *persistent_state = 2422 type_system->GetPersistentExpressionState()) { 2423 variable_sp = persistent_state->GetVariable(name); 2424 2425 if (variable_sp) 2426 return false; // Stop iterating the ForEach 2427 } 2428 return true; // Keep iterating the ForEach 2429 }); 2430 return variable_sp; 2431 } 2432 2433 lldb::addr_t Target::GetPersistentSymbol(ConstString name) { 2434 lldb::addr_t address = LLDB_INVALID_ADDRESS; 2435 2436 m_scratch_type_system_map.ForEach( 2437 [name, &address](TypeSystem *type_system) -> bool { 2438 if (PersistentExpressionState *persistent_state = 2439 type_system->GetPersistentExpressionState()) { 2440 address = persistent_state->LookupSymbol(name); 2441 if (address != LLDB_INVALID_ADDRESS) 2442 return false; // Stop iterating the ForEach 2443 } 2444 return true; // Keep iterating the ForEach 2445 }); 2446 return address; 2447 } 2448 2449 lldb::addr_t Target::GetCallableLoadAddress(lldb::addr_t load_addr, 2450 AddressClass addr_class) const { 2451 auto arch_plugin = GetArchitecturePlugin(); 2452 return arch_plugin ? 2453 arch_plugin->GetCallableLoadAddress(load_addr, addr_class) : load_addr; 2454 } 2455 2456 lldb::addr_t Target::GetOpcodeLoadAddress(lldb::addr_t load_addr, 2457 AddressClass addr_class) const { 2458 auto arch_plugin = GetArchitecturePlugin(); 2459 return arch_plugin ? 2460 arch_plugin->GetOpcodeLoadAddress(load_addr, addr_class) : load_addr; 2461 } 2462 2463 lldb::addr_t Target::GetBreakableLoadAddress(lldb::addr_t addr) { 2464 auto arch_plugin = GetArchitecturePlugin(); 2465 return arch_plugin ? 2466 arch_plugin->GetBreakableLoadAddress(addr, *this) : addr; 2467 } 2468 2469 SourceManager &Target::GetSourceManager() { 2470 if (!m_source_manager_up) 2471 m_source_manager_up.reset(new SourceManager(shared_from_this())); 2472 return *m_source_manager_up; 2473 } 2474 2475 ClangModulesDeclVendor *Target::GetClangModulesDeclVendor() { 2476 static std::mutex s_clang_modules_decl_vendor_mutex; // If this is contended 2477 // we can make it 2478 // per-target 2479 2480 { 2481 std::lock_guard<std::mutex> guard(s_clang_modules_decl_vendor_mutex); 2482 2483 if (!m_clang_modules_decl_vendor_up) { 2484 m_clang_modules_decl_vendor_up.reset( 2485 ClangModulesDeclVendor::Create(*this)); 2486 } 2487 } 2488 2489 return m_clang_modules_decl_vendor_up.get(); 2490 } 2491 2492 Target::StopHookSP Target::CreateStopHook() { 2493 lldb::user_id_t new_uid = ++m_stop_hook_next_id; 2494 Target::StopHookSP stop_hook_sp(new StopHook(shared_from_this(), new_uid)); 2495 m_stop_hooks[new_uid] = stop_hook_sp; 2496 return stop_hook_sp; 2497 } 2498 2499 bool Target::RemoveStopHookByID(lldb::user_id_t user_id) { 2500 size_t num_removed = m_stop_hooks.erase(user_id); 2501 return (num_removed != 0); 2502 } 2503 2504 void Target::RemoveAllStopHooks() { m_stop_hooks.clear(); } 2505 2506 Target::StopHookSP Target::GetStopHookByID(lldb::user_id_t user_id) { 2507 StopHookSP found_hook; 2508 2509 StopHookCollection::iterator specified_hook_iter; 2510 specified_hook_iter = m_stop_hooks.find(user_id); 2511 if (specified_hook_iter != m_stop_hooks.end()) 2512 found_hook = (*specified_hook_iter).second; 2513 return found_hook; 2514 } 2515 2516 bool Target::SetStopHookActiveStateByID(lldb::user_id_t user_id, 2517 bool active_state) { 2518 StopHookCollection::iterator specified_hook_iter; 2519 specified_hook_iter = m_stop_hooks.find(user_id); 2520 if (specified_hook_iter == m_stop_hooks.end()) 2521 return false; 2522 2523 (*specified_hook_iter).second->SetIsActive(active_state); 2524 return true; 2525 } 2526 2527 void Target::SetAllStopHooksActiveState(bool active_state) { 2528 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2529 for (pos = m_stop_hooks.begin(); pos != end; pos++) { 2530 (*pos).second->SetIsActive(active_state); 2531 } 2532 } 2533 2534 void Target::RunStopHooks() { 2535 if (m_suppress_stop_hooks) 2536 return; 2537 2538 if (!m_process_sp) 2539 return; 2540 2541 // Somebody might have restarted the process: 2542 if (m_process_sp->GetState() != eStateStopped) 2543 return; 2544 2545 // <rdar://problem/12027563> make sure we check that we are not stopped 2546 // because of us running a user expression since in that case we do not want 2547 // to run the stop-hooks 2548 if (m_process_sp->GetModIDRef().IsLastResumeForUserExpression()) 2549 return; 2550 2551 if (m_stop_hooks.empty()) 2552 return; 2553 2554 StopHookCollection::iterator pos, end = m_stop_hooks.end(); 2555 2556 // If there aren't any active stop hooks, don't bother either. 2557 // Also see if any of the active hooks want to auto-continue. 2558 bool any_active_hooks = false; 2559 bool auto_continue = false; 2560 for (auto hook : m_stop_hooks) { 2561 if (hook.second->IsActive()) { 2562 any_active_hooks = true; 2563 auto_continue |= hook.second->GetAutoContinue(); 2564 } 2565 } 2566 if (!any_active_hooks) 2567 return; 2568 2569 CommandReturnObject result; 2570 2571 std::vector<ExecutionContext> exc_ctx_with_reasons; 2572 std::vector<SymbolContext> sym_ctx_with_reasons; 2573 2574 ThreadList &cur_threadlist = m_process_sp->GetThreadList(); 2575 size_t num_threads = cur_threadlist.GetSize(); 2576 for (size_t i = 0; i < num_threads; i++) { 2577 lldb::ThreadSP cur_thread_sp = cur_threadlist.GetThreadAtIndex(i); 2578 if (cur_thread_sp->ThreadStoppedForAReason()) { 2579 lldb::StackFrameSP cur_frame_sp = cur_thread_sp->GetStackFrameAtIndex(0); 2580 exc_ctx_with_reasons.push_back(ExecutionContext( 2581 m_process_sp.get(), cur_thread_sp.get(), cur_frame_sp.get())); 2582 sym_ctx_with_reasons.push_back( 2583 cur_frame_sp->GetSymbolContext(eSymbolContextEverything)); 2584 } 2585 } 2586 2587 // If no threads stopped for a reason, don't run the stop-hooks. 2588 size_t num_exe_ctx = exc_ctx_with_reasons.size(); 2589 if (num_exe_ctx == 0) 2590 return; 2591 2592 result.SetImmediateOutputStream(m_debugger.GetAsyncOutputStream()); 2593 result.SetImmediateErrorStream(m_debugger.GetAsyncErrorStream()); 2594 2595 bool keep_going = true; 2596 bool hooks_ran = false; 2597 bool print_hook_header = (m_stop_hooks.size() != 1); 2598 bool print_thread_header = (num_exe_ctx != 1); 2599 bool did_restart = false; 2600 2601 for (pos = m_stop_hooks.begin(); keep_going && pos != end; pos++) { 2602 // result.Clear(); 2603 StopHookSP cur_hook_sp = (*pos).second; 2604 if (!cur_hook_sp->IsActive()) 2605 continue; 2606 2607 bool any_thread_matched = false; 2608 for (size_t i = 0; keep_going && i < num_exe_ctx; i++) { 2609 if ((cur_hook_sp->GetSpecifier() == nullptr || 2610 cur_hook_sp->GetSpecifier()->SymbolContextMatches( 2611 sym_ctx_with_reasons[i])) && 2612 (cur_hook_sp->GetThreadSpecifier() == nullptr || 2613 cur_hook_sp->GetThreadSpecifier()->ThreadPassesBasicTests( 2614 exc_ctx_with_reasons[i].GetThreadRef()))) { 2615 if (!hooks_ran) { 2616 hooks_ran = true; 2617 } 2618 if (print_hook_header && !any_thread_matched) { 2619 const char *cmd = 2620 (cur_hook_sp->GetCommands().GetSize() == 1 2621 ? cur_hook_sp->GetCommands().GetStringAtIndex(0) 2622 : nullptr); 2623 if (cmd) 2624 result.AppendMessageWithFormat("\n- Hook %" PRIu64 " (%s)\n", 2625 cur_hook_sp->GetID(), cmd); 2626 else 2627 result.AppendMessageWithFormat("\n- Hook %" PRIu64 "\n", 2628 cur_hook_sp->GetID()); 2629 any_thread_matched = true; 2630 } 2631 2632 if (print_thread_header) 2633 result.AppendMessageWithFormat( 2634 "-- Thread %d\n", 2635 exc_ctx_with_reasons[i].GetThreadPtr()->GetIndexID()); 2636 2637 CommandInterpreterRunOptions options; 2638 options.SetStopOnContinue(true); 2639 options.SetStopOnError(true); 2640 options.SetEchoCommands(false); 2641 options.SetPrintResults(true); 2642 options.SetAddToHistory(false); 2643 2644 // Force Async: 2645 bool old_async = GetDebugger().GetAsyncExecution(); 2646 GetDebugger().SetAsyncExecution(true); 2647 GetDebugger().GetCommandInterpreter().HandleCommands( 2648 cur_hook_sp->GetCommands(), &exc_ctx_with_reasons[i], options, 2649 result); 2650 GetDebugger().SetAsyncExecution(old_async); 2651 // If the command started the target going again, we should bag out of 2652 // running the stop hooks. 2653 if ((result.GetStatus() == eReturnStatusSuccessContinuingNoResult) || 2654 (result.GetStatus() == eReturnStatusSuccessContinuingResult)) { 2655 // But only complain if there were more stop hooks to do: 2656 StopHookCollection::iterator tmp = pos; 2657 if (++tmp != end) 2658 result.AppendMessageWithFormat("\nAborting stop hooks, hook %" PRIu64 2659 " set the program running.\n" 2660 " Consider using '-G true' to make " 2661 "stop hooks auto-continue.\n", 2662 cur_hook_sp->GetID()); 2663 keep_going = false; 2664 did_restart = true; 2665 } 2666 } 2667 } 2668 } 2669 // Finally, if auto-continue was requested, do it now: 2670 if (!did_restart && auto_continue) 2671 m_process_sp->PrivateResume(); 2672 2673 result.GetImmediateOutputStream()->Flush(); 2674 result.GetImmediateErrorStream()->Flush(); 2675 } 2676 2677 const TargetPropertiesSP &Target::GetGlobalProperties() { 2678 // NOTE: intentional leak so we don't crash if global destructor chain gets 2679 // called as other threads still use the result of this function 2680 static TargetPropertiesSP *g_settings_sp_ptr = 2681 new TargetPropertiesSP(new TargetProperties(nullptr)); 2682 return *g_settings_sp_ptr; 2683 } 2684 2685 Status Target::Install(ProcessLaunchInfo *launch_info) { 2686 Status error; 2687 PlatformSP platform_sp(GetPlatform()); 2688 if (platform_sp) { 2689 if (platform_sp->IsRemote()) { 2690 if (platform_sp->IsConnected()) { 2691 // Install all files that have an install path, and always install the 2692 // main executable when connected to a remote platform 2693 const ModuleList &modules = GetImages(); 2694 const size_t num_images = modules.GetSize(); 2695 for (size_t idx = 0; idx < num_images; ++idx) { 2696 ModuleSP module_sp(modules.GetModuleAtIndex(idx)); 2697 if (module_sp) { 2698 const bool is_main_executable = module_sp == GetExecutableModule(); 2699 FileSpec local_file(module_sp->GetFileSpec()); 2700 if (local_file) { 2701 FileSpec remote_file(module_sp->GetRemoteInstallFileSpec()); 2702 if (!remote_file) { 2703 if (is_main_executable) // TODO: add setting for always 2704 // installing main executable??? 2705 { 2706 // Always install the main executable 2707 remote_file = platform_sp->GetRemoteWorkingDirectory(); 2708 remote_file.AppendPathComponent( 2709 module_sp->GetFileSpec().GetFilename().GetCString()); 2710 } 2711 } 2712 if (remote_file) { 2713 error = platform_sp->Install(local_file, remote_file); 2714 if (error.Success()) { 2715 module_sp->SetPlatformFileSpec(remote_file); 2716 if (is_main_executable) { 2717 platform_sp->SetFilePermissions(remote_file, 0700); 2718 if (launch_info) 2719 launch_info->SetExecutableFile(remote_file, false); 2720 } 2721 } else 2722 break; 2723 } 2724 } 2725 } 2726 } 2727 } 2728 } 2729 } 2730 return error; 2731 } 2732 2733 bool Target::ResolveLoadAddress(addr_t load_addr, Address &so_addr, 2734 uint32_t stop_id) { 2735 return m_section_load_history.ResolveLoadAddress(stop_id, load_addr, so_addr); 2736 } 2737 2738 bool Target::ResolveFileAddress(lldb::addr_t file_addr, 2739 Address &resolved_addr) { 2740 return m_images.ResolveFileAddress(file_addr, resolved_addr); 2741 } 2742 2743 bool Target::SetSectionLoadAddress(const SectionSP §ion_sp, 2744 addr_t new_section_load_addr, 2745 bool warn_multiple) { 2746 const addr_t old_section_load_addr = 2747 m_section_load_history.GetSectionLoadAddress( 2748 SectionLoadHistory::eStopIDNow, section_sp); 2749 if (old_section_load_addr != new_section_load_addr) { 2750 uint32_t stop_id = 0; 2751 ProcessSP process_sp(GetProcessSP()); 2752 if (process_sp) 2753 stop_id = process_sp->GetStopID(); 2754 else 2755 stop_id = m_section_load_history.GetLastStopID(); 2756 if (m_section_load_history.SetSectionLoadAddress( 2757 stop_id, section_sp, new_section_load_addr, warn_multiple)) 2758 return true; // Return true if the section load address was changed... 2759 } 2760 return false; // Return false to indicate nothing changed 2761 } 2762 2763 size_t Target::UnloadModuleSections(const ModuleList &module_list) { 2764 size_t section_unload_count = 0; 2765 size_t num_modules = module_list.GetSize(); 2766 for (size_t i = 0; i < num_modules; ++i) { 2767 section_unload_count += 2768 UnloadModuleSections(module_list.GetModuleAtIndex(i)); 2769 } 2770 return section_unload_count; 2771 } 2772 2773 size_t Target::UnloadModuleSections(const lldb::ModuleSP &module_sp) { 2774 uint32_t stop_id = 0; 2775 ProcessSP process_sp(GetProcessSP()); 2776 if (process_sp) 2777 stop_id = process_sp->GetStopID(); 2778 else 2779 stop_id = m_section_load_history.GetLastStopID(); 2780 SectionList *sections = module_sp->GetSectionList(); 2781 size_t section_unload_count = 0; 2782 if (sections) { 2783 const uint32_t num_sections = sections->GetNumSections(0); 2784 for (uint32_t i = 0; i < num_sections; ++i) { 2785 section_unload_count += m_section_load_history.SetSectionUnloaded( 2786 stop_id, sections->GetSectionAtIndex(i)); 2787 } 2788 } 2789 return section_unload_count; 2790 } 2791 2792 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp) { 2793 uint32_t stop_id = 0; 2794 ProcessSP process_sp(GetProcessSP()); 2795 if (process_sp) 2796 stop_id = process_sp->GetStopID(); 2797 else 2798 stop_id = m_section_load_history.GetLastStopID(); 2799 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp); 2800 } 2801 2802 bool Target::SetSectionUnloaded(const lldb::SectionSP §ion_sp, 2803 addr_t load_addr) { 2804 uint32_t stop_id = 0; 2805 ProcessSP process_sp(GetProcessSP()); 2806 if (process_sp) 2807 stop_id = process_sp->GetStopID(); 2808 else 2809 stop_id = m_section_load_history.GetLastStopID(); 2810 return m_section_load_history.SetSectionUnloaded(stop_id, section_sp, 2811 load_addr); 2812 } 2813 2814 void Target::ClearAllLoadedSections() { m_section_load_history.Clear(); } 2815 2816 Status Target::Launch(ProcessLaunchInfo &launch_info, Stream *stream) { 2817 Status error; 2818 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_TARGET)); 2819 2820 if (log) 2821 log->Printf("Target::%s() called for %s", __FUNCTION__, 2822 launch_info.GetExecutableFile().GetPath().c_str()); 2823 2824 StateType state = eStateInvalid; 2825 2826 // Scope to temporarily get the process state in case someone has manually 2827 // remotely connected already to a process and we can skip the platform 2828 // launching. 2829 { 2830 ProcessSP process_sp(GetProcessSP()); 2831 2832 if (process_sp) { 2833 state = process_sp->GetState(); 2834 if (log) 2835 log->Printf( 2836 "Target::%s the process exists, and its current state is %s", 2837 __FUNCTION__, StateAsCString(state)); 2838 } else { 2839 if (log) 2840 log->Printf("Target::%s the process instance doesn't currently exist.", 2841 __FUNCTION__); 2842 } 2843 } 2844 2845 launch_info.GetFlags().Set(eLaunchFlagDebug); 2846 2847 // Get the value of synchronous execution here. If you wait till after you 2848 // have started to run, then you could have hit a breakpoint, whose command 2849 // might switch the value, and then you'll pick up that incorrect value. 2850 Debugger &debugger = GetDebugger(); 2851 const bool synchronous_execution = 2852 debugger.GetCommandInterpreter().GetSynchronous(); 2853 2854 PlatformSP platform_sp(GetPlatform()); 2855 2856 FinalizeFileActions(launch_info); 2857 2858 if (state == eStateConnected) { 2859 if (launch_info.GetFlags().Test(eLaunchFlagLaunchInTTY)) { 2860 error.SetErrorString( 2861 "can't launch in tty when launching through a remote connection"); 2862 return error; 2863 } 2864 } 2865 2866 if (!launch_info.GetArchitecture().IsValid()) 2867 launch_info.GetArchitecture() = GetArchitecture(); 2868 2869 // If we're not already connected to the process, and if we have a platform 2870 // that can launch a process for debugging, go ahead and do that here. 2871 if (state != eStateConnected && platform_sp && 2872 platform_sp->CanDebugProcess()) { 2873 if (log) 2874 log->Printf("Target::%s asking the platform to debug the process", 2875 __FUNCTION__); 2876 2877 // If there was a previous process, delete it before we make the new one. 2878 // One subtle point, we delete the process before we release the reference 2879 // to m_process_sp. That way even if we are the last owner, the process 2880 // will get Finalized before it gets destroyed. 2881 DeleteCurrentProcess(); 2882 2883 m_process_sp = 2884 GetPlatform()->DebugProcess(launch_info, debugger, this, error); 2885 2886 } else { 2887 if (log) 2888 log->Printf("Target::%s the platform doesn't know how to debug a " 2889 "process, getting a process plugin to do this for us.", 2890 __FUNCTION__); 2891 2892 if (state == eStateConnected) { 2893 assert(m_process_sp); 2894 } else { 2895 // Use a Process plugin to construct the process. 2896 const char *plugin_name = launch_info.GetProcessPluginName(); 2897 CreateProcess(launch_info.GetListener(), plugin_name, nullptr); 2898 } 2899 2900 // Since we didn't have a platform launch the process, launch it here. 2901 if (m_process_sp) 2902 error = m_process_sp->Launch(launch_info); 2903 } 2904 2905 if (!m_process_sp) { 2906 if (error.Success()) 2907 error.SetErrorString("failed to launch or debug process"); 2908 return error; 2909 } 2910 2911 if (error.Success()) { 2912 if (synchronous_execution || 2913 !launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) { 2914 ListenerSP hijack_listener_sp(launch_info.GetHijackListener()); 2915 if (!hijack_listener_sp) { 2916 hijack_listener_sp = 2917 Listener::MakeListener("lldb.Target.Launch.hijack"); 2918 launch_info.SetHijackListener(hijack_listener_sp); 2919 m_process_sp->HijackProcessEvents(hijack_listener_sp); 2920 } 2921 2922 StateType state = m_process_sp->WaitForProcessToStop( 2923 llvm::None, nullptr, false, hijack_listener_sp, nullptr); 2924 2925 if (state == eStateStopped) { 2926 if (!launch_info.GetFlags().Test(eLaunchFlagStopAtEntry)) { 2927 if (synchronous_execution) { 2928 // Now we have handled the stop-from-attach, and we are just switching 2929 // to a synchronous resume. So we should switch to the SyncResume 2930 // hijacker. 2931 m_process_sp->RestoreProcessEvents(); 2932 m_process_sp->ResumeSynchronous(stream); 2933 } else { 2934 m_process_sp->RestoreProcessEvents(); 2935 error = m_process_sp->PrivateResume(); 2936 } 2937 if (!error.Success()) { 2938 Status error2; 2939 error2.SetErrorStringWithFormat( 2940 "process resume at entry point failed: %s", error.AsCString()); 2941 error = error2; 2942 } 2943 } 2944 } else if (state == eStateExited) { 2945 bool with_shell = !!launch_info.GetShell(); 2946 const int exit_status = m_process_sp->GetExitStatus(); 2947 const char *exit_desc = m_process_sp->GetExitDescription(); 2948 #define LAUNCH_SHELL_MESSAGE \ 2949 "\n'r' and 'run' are aliases that default to launching through a " \ 2950 "shell.\nTry launching without going through a shell by using 'process " \ 2951 "launch'." 2952 if (exit_desc && exit_desc[0]) { 2953 if (with_shell) 2954 error.SetErrorStringWithFormat( 2955 "process exited with status %i (%s)" LAUNCH_SHELL_MESSAGE, 2956 exit_status, exit_desc); 2957 else 2958 error.SetErrorStringWithFormat("process exited with status %i (%s)", 2959 exit_status, exit_desc); 2960 } else { 2961 if (with_shell) 2962 error.SetErrorStringWithFormat( 2963 "process exited with status %i" LAUNCH_SHELL_MESSAGE, 2964 exit_status); 2965 else 2966 error.SetErrorStringWithFormat("process exited with status %i", 2967 exit_status); 2968 } 2969 } else { 2970 error.SetErrorStringWithFormat( 2971 "initial process state wasn't stopped: %s", StateAsCString(state)); 2972 } 2973 } 2974 m_process_sp->RestoreProcessEvents(); 2975 } else { 2976 Status error2; 2977 error2.SetErrorStringWithFormat("process launch failed: %s", 2978 error.AsCString()); 2979 error = error2; 2980 } 2981 return error; 2982 } 2983 2984 Status Target::Attach(ProcessAttachInfo &attach_info, Stream *stream) { 2985 auto state = eStateInvalid; 2986 auto process_sp = GetProcessSP(); 2987 if (process_sp) { 2988 state = process_sp->GetState(); 2989 if (process_sp->IsAlive() && state != eStateConnected) { 2990 if (state == eStateAttaching) 2991 return Status("process attach is in progress"); 2992 return Status("a process is already being debugged"); 2993 } 2994 } 2995 2996 const ModuleSP old_exec_module_sp = GetExecutableModule(); 2997 2998 // If no process info was specified, then use the target executable name as 2999 // the process to attach to by default 3000 if (!attach_info.ProcessInfoSpecified()) { 3001 if (old_exec_module_sp) 3002 attach_info.GetExecutableFile().GetFilename() = 3003 old_exec_module_sp->GetPlatformFileSpec().GetFilename(); 3004 3005 if (!attach_info.ProcessInfoSpecified()) { 3006 return Status("no process specified, create a target with a file, or " 3007 "specify the --pid or --name"); 3008 } 3009 } 3010 3011 const auto platform_sp = 3012 GetDebugger().GetPlatformList().GetSelectedPlatform(); 3013 ListenerSP hijack_listener_sp; 3014 const bool async = attach_info.GetAsync(); 3015 if (!async) { 3016 hijack_listener_sp = 3017 Listener::MakeListener("lldb.Target.Attach.attach.hijack"); 3018 attach_info.SetHijackListener(hijack_listener_sp); 3019 } 3020 3021 Status error; 3022 if (state != eStateConnected && platform_sp != nullptr && 3023 platform_sp->CanDebugProcess()) { 3024 SetPlatform(platform_sp); 3025 process_sp = platform_sp->Attach(attach_info, GetDebugger(), this, error); 3026 } else { 3027 if (state != eStateConnected) { 3028 const char *plugin_name = attach_info.GetProcessPluginName(); 3029 process_sp = 3030 CreateProcess(attach_info.GetListenerForProcess(GetDebugger()), 3031 plugin_name, nullptr); 3032 if (process_sp == nullptr) { 3033 error.SetErrorStringWithFormat( 3034 "failed to create process using plugin %s", 3035 (plugin_name) ? plugin_name : "null"); 3036 return error; 3037 } 3038 } 3039 if (hijack_listener_sp) 3040 process_sp->HijackProcessEvents(hijack_listener_sp); 3041 error = process_sp->Attach(attach_info); 3042 } 3043 3044 if (error.Success() && process_sp) { 3045 if (async) { 3046 process_sp->RestoreProcessEvents(); 3047 } else { 3048 state = process_sp->WaitForProcessToStop( 3049 llvm::None, nullptr, false, attach_info.GetHijackListener(), stream); 3050 process_sp->RestoreProcessEvents(); 3051 3052 if (state != eStateStopped) { 3053 const char *exit_desc = process_sp->GetExitDescription(); 3054 if (exit_desc) 3055 error.SetErrorStringWithFormat("%s", exit_desc); 3056 else 3057 error.SetErrorString( 3058 "process did not stop (no such process or permission problem?)"); 3059 process_sp->Destroy(false); 3060 } 3061 } 3062 } 3063 return error; 3064 } 3065 3066 void Target::FinalizeFileActions(ProcessLaunchInfo &info) { 3067 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS)); 3068 3069 // Finalize the file actions, and if none were given, default to opening up a 3070 // pseudo terminal 3071 PlatformSP platform_sp = GetPlatform(); 3072 const bool default_to_use_pty = 3073 m_platform_sp ? m_platform_sp->IsHost() : false; 3074 LLDB_LOG( 3075 log, 3076 "have platform={0}, platform_sp->IsHost()={1}, default_to_use_pty={2}", 3077 bool(platform_sp), 3078 platform_sp ? (platform_sp->IsHost() ? "true" : "false") : "n/a", 3079 default_to_use_pty); 3080 3081 // If nothing for stdin or stdout or stderr was specified, then check the 3082 // process for any default settings that were set with "settings set" 3083 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr || 3084 info.GetFileActionForFD(STDOUT_FILENO) == nullptr || 3085 info.GetFileActionForFD(STDERR_FILENO) == nullptr) { 3086 LLDB_LOG(log, "at least one of stdin/stdout/stderr was not set, evaluating " 3087 "default handling"); 3088 3089 if (info.GetFlags().Test(eLaunchFlagLaunchInTTY)) { 3090 // Do nothing, if we are launching in a remote terminal no file actions 3091 // should be done at all. 3092 return; 3093 } 3094 3095 if (info.GetFlags().Test(eLaunchFlagDisableSTDIO)) { 3096 LLDB_LOG(log, "eLaunchFlagDisableSTDIO set, adding suppression action " 3097 "for stdin, stdout and stderr"); 3098 info.AppendSuppressFileAction(STDIN_FILENO, true, false); 3099 info.AppendSuppressFileAction(STDOUT_FILENO, false, true); 3100 info.AppendSuppressFileAction(STDERR_FILENO, false, true); 3101 } else { 3102 // Check for any values that might have gotten set with any of: (lldb) 3103 // settings set target.input-path (lldb) settings set target.output-path 3104 // (lldb) settings set target.error-path 3105 FileSpec in_file_spec; 3106 FileSpec out_file_spec; 3107 FileSpec err_file_spec; 3108 // Only override with the target settings if we don't already have an 3109 // action for in, out or error 3110 if (info.GetFileActionForFD(STDIN_FILENO) == nullptr) 3111 in_file_spec = GetStandardInputPath(); 3112 if (info.GetFileActionForFD(STDOUT_FILENO) == nullptr) 3113 out_file_spec = GetStandardOutputPath(); 3114 if (info.GetFileActionForFD(STDERR_FILENO) == nullptr) 3115 err_file_spec = GetStandardErrorPath(); 3116 3117 LLDB_LOG(log, "target stdin='{0}', target stdout='{1}', stderr='{1}'", 3118 in_file_spec, out_file_spec, err_file_spec); 3119 3120 if (in_file_spec) { 3121 info.AppendOpenFileAction(STDIN_FILENO, in_file_spec, true, false); 3122 LLDB_LOG(log, "appended stdin open file action for {0}", in_file_spec); 3123 } 3124 3125 if (out_file_spec) { 3126 info.AppendOpenFileAction(STDOUT_FILENO, out_file_spec, false, true); 3127 LLDB_LOG(log, "appended stdout open file action for {0}", 3128 out_file_spec); 3129 } 3130 3131 if (err_file_spec) { 3132 info.AppendOpenFileAction(STDERR_FILENO, err_file_spec, false, true); 3133 LLDB_LOG(log, "appended stderr open file action for {0}", 3134 err_file_spec); 3135 } 3136 3137 if (default_to_use_pty && 3138 (!in_file_spec || !out_file_spec || !err_file_spec)) { 3139 llvm::Error Err = info.SetUpPtyRedirection(); 3140 LLDB_LOG_ERROR(log, std::move(Err), "SetUpPtyRedirection failed: {0}"); 3141 } 3142 } 3143 } 3144 } 3145 3146 //-------------------------------------------------------------- 3147 // Target::StopHook 3148 //-------------------------------------------------------------- 3149 Target::StopHook::StopHook(lldb::TargetSP target_sp, lldb::user_id_t uid) 3150 : UserID(uid), m_target_sp(target_sp), m_commands(), m_specifier_sp(), 3151 m_thread_spec_up() {} 3152 3153 Target::StopHook::StopHook(const StopHook &rhs) 3154 : UserID(rhs.GetID()), m_target_sp(rhs.m_target_sp), 3155 m_commands(rhs.m_commands), m_specifier_sp(rhs.m_specifier_sp), 3156 m_thread_spec_up(), m_active(rhs.m_active), 3157 m_auto_continue(rhs.m_auto_continue) { 3158 if (rhs.m_thread_spec_up) 3159 m_thread_spec_up.reset(new ThreadSpec(*rhs.m_thread_spec_up)); 3160 } 3161 3162 Target::StopHook::~StopHook() = default; 3163 3164 void Target::StopHook::SetSpecifier(SymbolContextSpecifier *specifier) { 3165 m_specifier_sp.reset(specifier); 3166 } 3167 3168 void Target::StopHook::SetThreadSpecifier(ThreadSpec *specifier) { 3169 m_thread_spec_up.reset(specifier); 3170 } 3171 3172 void Target::StopHook::GetDescription(Stream *s, 3173 lldb::DescriptionLevel level) const { 3174 int indent_level = s->GetIndentLevel(); 3175 3176 s->SetIndentLevel(indent_level + 2); 3177 3178 s->Printf("Hook: %" PRIu64 "\n", GetID()); 3179 if (m_active) 3180 s->Indent("State: enabled\n"); 3181 else 3182 s->Indent("State: disabled\n"); 3183 3184 if (m_auto_continue) 3185 s->Indent("AutoContinue on\n"); 3186 3187 if (m_specifier_sp) { 3188 s->Indent(); 3189 s->PutCString("Specifier:\n"); 3190 s->SetIndentLevel(indent_level + 4); 3191 m_specifier_sp->GetDescription(s, level); 3192 s->SetIndentLevel(indent_level + 2); 3193 } 3194 3195 if (m_thread_spec_up) { 3196 StreamString tmp; 3197 s->Indent("Thread:\n"); 3198 m_thread_spec_up->GetDescription(&tmp, level); 3199 s->SetIndentLevel(indent_level + 4); 3200 s->Indent(tmp.GetString()); 3201 s->PutCString("\n"); 3202 s->SetIndentLevel(indent_level + 2); 3203 } 3204 3205 s->Indent("Commands: \n"); 3206 s->SetIndentLevel(indent_level + 4); 3207 uint32_t num_commands = m_commands.GetSize(); 3208 for (uint32_t i = 0; i < num_commands; i++) { 3209 s->Indent(m_commands.GetStringAtIndex(i)); 3210 s->PutCString("\n"); 3211 } 3212 s->SetIndentLevel(indent_level); 3213 } 3214 3215 //-------------------------------------------------------------- 3216 // class TargetProperties 3217 //-------------------------------------------------------------- 3218 3219 // clang-format off 3220 static constexpr OptionEnumValueElement g_dynamic_value_types[] = { 3221 {eNoDynamicValues, "no-dynamic-values", 3222 "Don't calculate the dynamic type of values"}, 3223 {eDynamicCanRunTarget, "run-target", "Calculate the dynamic type of values " 3224 "even if you have to run the target."}, 3225 {eDynamicDontRunTarget, "no-run-target", 3226 "Calculate the dynamic type of values, but don't run the target."} }; 3227 3228 OptionEnumValues lldb_private::GetDynamicValueTypes() { 3229 return OptionEnumValues(g_dynamic_value_types); 3230 } 3231 3232 static constexpr OptionEnumValueElement g_inline_breakpoint_enums[] = { 3233 {eInlineBreakpointsNever, "never", "Never look for inline breakpoint " 3234 "locations (fastest). This setting " 3235 "should only be used if you know that " 3236 "no inlining occurs in your programs."}, 3237 {eInlineBreakpointsHeaders, "headers", 3238 "Only check for inline breakpoint locations when setting breakpoints in " 3239 "header files, but not when setting breakpoint in implementation source " 3240 "files (default)."}, 3241 {eInlineBreakpointsAlways, "always", 3242 "Always look for inline breakpoint locations when setting file and line " 3243 "breakpoints (slower but most accurate)."} }; 3244 3245 typedef enum x86DisassemblyFlavor { 3246 eX86DisFlavorDefault, 3247 eX86DisFlavorIntel, 3248 eX86DisFlavorATT 3249 } x86DisassemblyFlavor; 3250 3251 static constexpr OptionEnumValueElement g_x86_dis_flavor_value_types[] = { 3252 {eX86DisFlavorDefault, "default", "Disassembler default (currently att)."}, 3253 {eX86DisFlavorIntel, "intel", "Intel disassembler flavor."}, 3254 {eX86DisFlavorATT, "att", "AT&T disassembler flavor."} }; 3255 3256 static constexpr OptionEnumValueElement g_hex_immediate_style_values[] = { 3257 {Disassembler::eHexStyleC, "c", "C-style (0xffff)."}, 3258 {Disassembler::eHexStyleAsm, "asm", "Asm-style (0ffffh)."} }; 3259 3260 static constexpr OptionEnumValueElement g_load_script_from_sym_file_values[] = { 3261 {eLoadScriptFromSymFileTrue, "true", 3262 "Load debug scripts inside symbol files"}, 3263 {eLoadScriptFromSymFileFalse, "false", 3264 "Do not load debug scripts inside symbol files."}, 3265 {eLoadScriptFromSymFileWarn, "warn", 3266 "Warn about debug scripts inside symbol files but do not load them."} }; 3267 3268 static constexpr 3269 OptionEnumValueElement g_load_current_working_dir_lldbinit_values[] = { 3270 {eLoadCWDlldbinitTrue, "true", 3271 "Load .lldbinit files from current directory"}, 3272 {eLoadCWDlldbinitFalse, "false", 3273 "Do not load .lldbinit files from current directory"}, 3274 {eLoadCWDlldbinitWarn, "warn", 3275 "Warn about loading .lldbinit files from current directory"} }; 3276 3277 static constexpr OptionEnumValueElement g_memory_module_load_level_values[] = { 3278 {eMemoryModuleLoadLevelMinimal, "minimal", 3279 "Load minimal information when loading modules from memory. Currently " 3280 "this setting loads sections only."}, 3281 {eMemoryModuleLoadLevelPartial, "partial", 3282 "Load partial information when loading modules from memory. Currently " 3283 "this setting loads sections and function bounds."}, 3284 {eMemoryModuleLoadLevelComplete, "complete", 3285 "Load complete information when loading modules from memory. Currently " 3286 "this setting loads sections and all symbols."} }; 3287 3288 static constexpr PropertyDefinition g_properties[] = { 3289 {"default-arch", OptionValue::eTypeArch, true, 0, nullptr, {}, 3290 "Default architecture to choose, when there's a choice."}, 3291 {"move-to-nearest-code", OptionValue::eTypeBoolean, false, true, nullptr, 3292 {}, "Move breakpoints to nearest code."}, 3293 {"language", OptionValue::eTypeLanguage, false, eLanguageTypeUnknown, 3294 nullptr, {}, 3295 "The language to use when interpreting expressions entered in commands."}, 3296 {"expr-prefix", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3297 "Path to a file containing expressions to be prepended to all " 3298 "expressions."}, 3299 {"prefer-dynamic-value", OptionValue::eTypeEnum, false, 3300 eDynamicDontRunTarget, nullptr, OptionEnumValues(g_dynamic_value_types), 3301 "Should printed values be shown as their dynamic value."}, 3302 {"enable-synthetic-value", OptionValue::eTypeBoolean, false, true, nullptr, 3303 {}, "Should synthetic values be used by default whenever available."}, 3304 {"skip-prologue", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3305 "Skip function prologues when setting breakpoints by name."}, 3306 {"source-map", OptionValue::eTypePathMap, false, 0, nullptr, {}, 3307 "Source path remappings are used to track the change of location between " 3308 "a source file when built, and " 3309 "where it exists on the current system. It consists of an array of " 3310 "duples, the first element of each duple is " 3311 "some part (starting at the root) of the path to the file when it was " 3312 "built, " 3313 "and the second is where the remainder of the original build hierarchy is " 3314 "rooted on the local system. " 3315 "Each element of the array is checked in order and the first one that " 3316 "results in a match wins."}, 3317 {"exec-search-paths", OptionValue::eTypeFileSpecList, false, 0, nullptr, 3318 {}, "Executable search paths to use when locating executable files " 3319 "whose paths don't match the local file system."}, 3320 {"debug-file-search-paths", OptionValue::eTypeFileSpecList, false, 0, 3321 nullptr, {}, 3322 "List of directories to be searched when locating debug symbol files. " 3323 "See also symbols.enable-external-lookup."}, 3324 {"clang-module-search-paths", OptionValue::eTypeFileSpecList, false, 0, 3325 nullptr, {}, 3326 "List of directories to be searched when locating modules for Clang."}, 3327 {"auto-import-clang-modules", OptionValue::eTypeBoolean, false, true, 3328 nullptr, {}, 3329 "Automatically load Clang modules referred to by the program."}, 3330 {"import-std-module", OptionValue::eTypeBoolean, false, false, 3331 nullptr, {}, 3332 "Import the C++ std module to improve debugging STL containers."}, 3333 {"auto-apply-fixits", OptionValue::eTypeBoolean, false, true, nullptr, 3334 {}, "Automatically apply fix-it hints to expressions."}, 3335 {"notify-about-fixits", OptionValue::eTypeBoolean, false, true, nullptr, 3336 {}, "Print the fixed expression text."}, 3337 {"save-jit-objects", OptionValue::eTypeBoolean, false, false, nullptr, 3338 {}, "Save intermediate object files generated by the LLVM JIT"}, 3339 {"max-children-count", OptionValue::eTypeSInt64, false, 256, nullptr, 3340 {}, "Maximum number of children to expand in any level of depth."}, 3341 {"max-string-summary-length", OptionValue::eTypeSInt64, false, 1024, 3342 nullptr, {}, 3343 "Maximum number of characters to show when using %s in summary strings."}, 3344 {"max-memory-read-size", OptionValue::eTypeSInt64, false, 1024, nullptr, 3345 {}, "Maximum number of bytes that 'memory read' will fetch before " 3346 "--force must be specified."}, 3347 {"breakpoints-use-platform-avoid-list", OptionValue::eTypeBoolean, false, 3348 true, nullptr, {}, "Consult the platform module avoid list when " 3349 "setting non-module specific breakpoints."}, 3350 {"arg0", OptionValue::eTypeString, false, 0, nullptr, {}, 3351 "The first argument passed to the program in the argument array which can " 3352 "be different from the executable itself."}, 3353 {"run-args", OptionValue::eTypeArgs, false, 0, nullptr, {}, 3354 "A list containing all the arguments to be passed to the executable when " 3355 "it is run. Note that this does NOT include the argv[0] which is in " 3356 "target.arg0."}, 3357 {"env-vars", OptionValue::eTypeDictionary, false, OptionValue::eTypeString, 3358 nullptr, {}, "A list of all the environment variables to be passed " 3359 "to the executable's environment, and their values."}, 3360 {"inherit-env", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3361 "Inherit the environment from the process that is running LLDB."}, 3362 {"input-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3363 "The file/path to be used by the executable program for reading its " 3364 "standard input."}, 3365 {"output-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3366 "The file/path to be used by the executable program for writing its " 3367 "standard output."}, 3368 {"error-path", OptionValue::eTypeFileSpec, false, 0, nullptr, {}, 3369 "The file/path to be used by the executable program for writing its " 3370 "standard error."}, 3371 {"detach-on-error", OptionValue::eTypeBoolean, false, true, nullptr, 3372 {}, "debugserver will detach (rather than killing) a process if it " 3373 "loses connection with lldb."}, 3374 {"preload-symbols", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3375 "Enable loading of symbol tables before they are needed."}, 3376 {"disable-aslr", OptionValue::eTypeBoolean, false, true, nullptr, {}, 3377 "Disable Address Space Layout Randomization (ASLR)"}, 3378 {"disable-stdio", OptionValue::eTypeBoolean, false, false, nullptr, {}, 3379 "Disable stdin/stdout for process (e.g. for a GUI application)"}, 3380 {"inline-breakpoint-strategy", OptionValue::eTypeEnum, false, 3381 eInlineBreakpointsAlways, nullptr, 3382 OptionEnumValues(g_inline_breakpoint_enums), 3383 "The strategy to use when settings breakpoints by file and line. " 3384 "Breakpoint locations can end up being inlined by the compiler, so that a " 3385 "compile unit 'a.c' might contain an inlined function from another source " 3386 "file. " 3387 "Usually this is limited to breakpoint locations from inlined functions " 3388 "from header or other include files, or more accurately " 3389 "non-implementation source files. " 3390 "Sometimes code might #include implementation files and cause inlined " 3391 "breakpoint locations in inlined implementation files. " 3392 "Always checking for inlined breakpoint locations can be expensive " 3393 "(memory and time), so if you have a project with many headers " 3394 "and find that setting breakpoints is slow, then you can change this " 3395 "setting to headers. " 3396 "This setting allows you to control exactly which strategy is used when " 3397 "setting " 3398 "file and line breakpoints."}, 3399 // FIXME: This is the wrong way to do per-architecture settings, but we 3400 // don't have a general per architecture settings system in place yet. 3401 {"x86-disassembly-flavor", OptionValue::eTypeEnum, false, 3402 eX86DisFlavorDefault, nullptr, 3403 OptionEnumValues(g_x86_dis_flavor_value_types), 3404 "The default disassembly flavor to use for x86 or x86-64 targets."}, 3405 {"use-hex-immediates", OptionValue::eTypeBoolean, false, true, nullptr, 3406 {}, "Show immediates in disassembly as hexadecimal."}, 3407 {"hex-immediate-style", OptionValue::eTypeEnum, false, 3408 Disassembler::eHexStyleC, nullptr, 3409 OptionEnumValues(g_hex_immediate_style_values), 3410 "Which style to use for printing hexadecimal disassembly values."}, 3411 {"use-fast-stepping", OptionValue::eTypeBoolean, false, true, nullptr, 3412 {}, "Use a fast stepping algorithm based on running from branch to " 3413 "branch rather than instruction single-stepping."}, 3414 {"load-script-from-symbol-file", OptionValue::eTypeEnum, false, 3415 eLoadScriptFromSymFileWarn, nullptr, 3416 OptionEnumValues(g_load_script_from_sym_file_values), 3417 "Allow LLDB to load scripting resources embedded in symbol files when " 3418 "available."}, 3419 {"load-cwd-lldbinit", OptionValue::eTypeEnum, false, eLoadCWDlldbinitWarn, 3420 nullptr, OptionEnumValues(g_load_current_working_dir_lldbinit_values), 3421 "Allow LLDB to .lldbinit files from the current directory automatically."}, 3422 {"memory-module-load-level", OptionValue::eTypeEnum, false, 3423 eMemoryModuleLoadLevelComplete, nullptr, 3424 OptionEnumValues(g_memory_module_load_level_values), 3425 "Loading modules from memory can be slow as reading the symbol tables and " 3426 "other data can take a long time depending on your connection to the " 3427 "debug target. " 3428 "This setting helps users control how much information gets loaded when " 3429 "loading modules from memory." 3430 "'complete' is the default value for this setting which will load all " 3431 "sections and symbols by reading them from memory (slowest, most " 3432 "accurate). " 3433 "'partial' will load sections and attempt to find function bounds without " 3434 "downloading the symbol table (faster, still accurate, missing symbol " 3435 "names). " 3436 "'minimal' is the fastest setting and will load section data with no " 3437 "symbols, but should rarely be used as stack frames in these memory " 3438 "regions will be inaccurate and not provide any context (fastest). "}, 3439 {"display-expression-in-crashlogs", OptionValue::eTypeBoolean, false, false, 3440 nullptr, {}, "Expressions that crash will show up in crash logs if " 3441 "the host system supports executable specific crash log " 3442 "strings and this setting is set to true."}, 3443 {"trap-handler-names", OptionValue::eTypeArray, true, 3444 OptionValue::eTypeString, nullptr, {}, 3445 "A list of trap handler function names, e.g. a common Unix user process " 3446 "one is _sigtramp."}, 3447 {"display-runtime-support-values", OptionValue::eTypeBoolean, false, false, 3448 nullptr, {}, "If true, LLDB will show variables that are meant to " 3449 "support the operation of a language's runtime support."}, 3450 {"display-recognized-arguments", OptionValue::eTypeBoolean, false, false, 3451 nullptr, {}, "Show recognized arguments in variable listings by default."}, 3452 {"non-stop-mode", OptionValue::eTypeBoolean, false, 0, nullptr, {}, 3453 "Disable lock-step debugging, instead control threads independently."}, 3454 {"require-hardware-breakpoint", OptionValue::eTypeBoolean, false, 0, 3455 nullptr, {}, "Require all breakpoints to be hardware breakpoints."}}; 3456 // clang-format on 3457 3458 enum { 3459 ePropertyDefaultArch, 3460 ePropertyMoveToNearestCode, 3461 ePropertyLanguage, 3462 ePropertyExprPrefix, 3463 ePropertyPreferDynamic, 3464 ePropertyEnableSynthetic, 3465 ePropertySkipPrologue, 3466 ePropertySourceMap, 3467 ePropertyExecutableSearchPaths, 3468 ePropertyDebugFileSearchPaths, 3469 ePropertyClangModuleSearchPaths, 3470 ePropertyAutoImportClangModules, 3471 ePropertyImportStdModule, 3472 ePropertyAutoApplyFixIts, 3473 ePropertyNotifyAboutFixIts, 3474 ePropertySaveObjects, 3475 ePropertyMaxChildrenCount, 3476 ePropertyMaxSummaryLength, 3477 ePropertyMaxMemReadSize, 3478 ePropertyBreakpointUseAvoidList, 3479 ePropertyArg0, 3480 ePropertyRunArgs, 3481 ePropertyEnvVars, 3482 ePropertyInheritEnv, 3483 ePropertyInputPath, 3484 ePropertyOutputPath, 3485 ePropertyErrorPath, 3486 ePropertyDetachOnError, 3487 ePropertyPreloadSymbols, 3488 ePropertyDisableASLR, 3489 ePropertyDisableSTDIO, 3490 ePropertyInlineStrategy, 3491 ePropertyDisassemblyFlavor, 3492 ePropertyUseHexImmediates, 3493 ePropertyHexImmediateStyle, 3494 ePropertyUseFastStepping, 3495 ePropertyLoadScriptFromSymbolFile, 3496 ePropertyLoadCWDlldbinitFile, 3497 ePropertyMemoryModuleLoadLevel, 3498 ePropertyDisplayExpressionsInCrashlogs, 3499 ePropertyTrapHandlerNames, 3500 ePropertyDisplayRuntimeSupportValues, 3501 ePropertyDisplayRecognizedArguments, 3502 ePropertyNonStopModeEnabled, 3503 ePropertyRequireHardwareBreakpoints, 3504 ePropertyExperimental, 3505 }; 3506 3507 class TargetOptionValueProperties : public OptionValueProperties { 3508 public: 3509 TargetOptionValueProperties(ConstString name) 3510 : OptionValueProperties(name), m_target(nullptr), m_got_host_env(false) {} 3511 3512 // This constructor is used when creating TargetOptionValueProperties when it 3513 // is part of a new lldb_private::Target instance. It will copy all current 3514 // global property values as needed 3515 TargetOptionValueProperties(Target *target, 3516 const TargetPropertiesSP &target_properties_sp) 3517 : OptionValueProperties(*target_properties_sp->GetValueProperties()), 3518 m_target(target), m_got_host_env(false) {} 3519 3520 const Property *GetPropertyAtIndex(const ExecutionContext *exe_ctx, 3521 bool will_modify, 3522 uint32_t idx) const override { 3523 // When getting the value for a key from the target options, we will always 3524 // try and grab the setting from the current target if there is one. Else 3525 // we just use the one from this instance. 3526 if (idx == ePropertyEnvVars) 3527 GetHostEnvironmentIfNeeded(); 3528 3529 if (exe_ctx) { 3530 Target *target = exe_ctx->GetTargetPtr(); 3531 if (target) { 3532 TargetOptionValueProperties *target_properties = 3533 static_cast<TargetOptionValueProperties *>( 3534 target->GetValueProperties().get()); 3535 if (this != target_properties) 3536 return target_properties->ProtectedGetPropertyAtIndex(idx); 3537 } 3538 } 3539 return ProtectedGetPropertyAtIndex(idx); 3540 } 3541 3542 lldb::TargetSP GetTargetSP() { return m_target->shared_from_this(); } 3543 3544 protected: 3545 void GetHostEnvironmentIfNeeded() const { 3546 if (!m_got_host_env) { 3547 if (m_target) { 3548 m_got_host_env = true; 3549 const uint32_t idx = ePropertyInheritEnv; 3550 if (GetPropertyAtIndexAsBoolean( 3551 nullptr, idx, g_properties[idx].default_uint_value != 0)) { 3552 PlatformSP platform_sp(m_target->GetPlatform()); 3553 if (platform_sp) { 3554 Environment env = platform_sp->GetEnvironment(); 3555 OptionValueDictionary *env_dict = 3556 GetPropertyAtIndexAsOptionValueDictionary(nullptr, 3557 ePropertyEnvVars); 3558 if (env_dict) { 3559 const bool can_replace = false; 3560 for (const auto &KV : env) { 3561 // Don't allow existing keys to be replaced with ones we get 3562 // from the platform environment 3563 env_dict->SetValueForKey( 3564 ConstString(KV.first()), 3565 OptionValueSP(new OptionValueString(KV.second.c_str())), 3566 can_replace); 3567 } 3568 } 3569 } 3570 } 3571 } 3572 } 3573 } 3574 Target *m_target; 3575 mutable bool m_got_host_env; 3576 }; 3577 3578 //---------------------------------------------------------------------- 3579 // TargetProperties 3580 //---------------------------------------------------------------------- 3581 static constexpr PropertyDefinition g_experimental_properties[]{ 3582 {"inject-local-vars", OptionValue::eTypeBoolean, true, true, nullptr, 3583 {}, 3584 "If true, inject local variables explicitly into the expression text. " 3585 "This will fix symbol resolution when there are name collisions between " 3586 "ivars and local variables. " 3587 "But it can make expressions run much more slowly."}, 3588 {"use-modern-type-lookup", OptionValue::eTypeBoolean, true, false, nullptr, 3589 {}, "If true, use Clang's modern type lookup infrastructure."}}; 3590 3591 enum { ePropertyInjectLocalVars = 0, ePropertyUseModernTypeLookup }; 3592 3593 class TargetExperimentalOptionValueProperties : public OptionValueProperties { 3594 public: 3595 TargetExperimentalOptionValueProperties() 3596 : OptionValueProperties( 3597 ConstString(Properties::GetExperimentalSettingsName())) {} 3598 }; 3599 3600 TargetExperimentalProperties::TargetExperimentalProperties() 3601 : Properties(OptionValuePropertiesSP( 3602 new TargetExperimentalOptionValueProperties())) { 3603 m_collection_sp->Initialize(g_experimental_properties); 3604 } 3605 3606 //---------------------------------------------------------------------- 3607 // TargetProperties 3608 //---------------------------------------------------------------------- 3609 TargetProperties::TargetProperties(Target *target) 3610 : Properties(), m_launch_info() { 3611 if (target) { 3612 m_collection_sp = std::make_shared<TargetOptionValueProperties>( 3613 target, Target::GetGlobalProperties()); 3614 3615 // Set callbacks to update launch_info whenever "settins set" updated any 3616 // of these properties 3617 m_collection_sp->SetValueChangedCallback( 3618 ePropertyArg0, TargetProperties::Arg0ValueChangedCallback, this); 3619 m_collection_sp->SetValueChangedCallback( 3620 ePropertyRunArgs, TargetProperties::RunArgsValueChangedCallback, this); 3621 m_collection_sp->SetValueChangedCallback( 3622 ePropertyEnvVars, TargetProperties::EnvVarsValueChangedCallback, this); 3623 m_collection_sp->SetValueChangedCallback( 3624 ePropertyInputPath, TargetProperties::InputPathValueChangedCallback, 3625 this); 3626 m_collection_sp->SetValueChangedCallback( 3627 ePropertyOutputPath, TargetProperties::OutputPathValueChangedCallback, 3628 this); 3629 m_collection_sp->SetValueChangedCallback( 3630 ePropertyErrorPath, TargetProperties::ErrorPathValueChangedCallback, 3631 this); 3632 m_collection_sp->SetValueChangedCallback( 3633 ePropertyDetachOnError, 3634 TargetProperties::DetachOnErrorValueChangedCallback, this); 3635 m_collection_sp->SetValueChangedCallback( 3636 ePropertyDisableASLR, TargetProperties::DisableASLRValueChangedCallback, 3637 this); 3638 m_collection_sp->SetValueChangedCallback( 3639 ePropertyDisableSTDIO, 3640 TargetProperties::DisableSTDIOValueChangedCallback, this); 3641 3642 m_experimental_properties_up.reset(new TargetExperimentalProperties()); 3643 m_collection_sp->AppendProperty( 3644 ConstString(Properties::GetExperimentalSettingsName()), 3645 ConstString("Experimental settings - setting these won't produce " 3646 "errors if the setting is not present."), 3647 true, m_experimental_properties_up->GetValueProperties()); 3648 3649 // Update m_launch_info once it was created 3650 Arg0ValueChangedCallback(this, nullptr); 3651 RunArgsValueChangedCallback(this, nullptr); 3652 // EnvVarsValueChangedCallback(this, nullptr); // FIXME: cause segfault in 3653 // Target::GetPlatform() 3654 InputPathValueChangedCallback(this, nullptr); 3655 OutputPathValueChangedCallback(this, nullptr); 3656 ErrorPathValueChangedCallback(this, nullptr); 3657 DetachOnErrorValueChangedCallback(this, nullptr); 3658 DisableASLRValueChangedCallback(this, nullptr); 3659 DisableSTDIOValueChangedCallback(this, nullptr); 3660 } else { 3661 m_collection_sp = 3662 std::make_shared<TargetOptionValueProperties>(ConstString("target")); 3663 m_collection_sp->Initialize(g_properties); 3664 m_experimental_properties_up.reset(new TargetExperimentalProperties()); 3665 m_collection_sp->AppendProperty( 3666 ConstString(Properties::GetExperimentalSettingsName()), 3667 ConstString("Experimental settings - setting these won't produce " 3668 "errors if the setting is not present."), 3669 true, m_experimental_properties_up->GetValueProperties()); 3670 m_collection_sp->AppendProperty( 3671 ConstString("process"), ConstString("Settings specific to processes."), 3672 true, Process::GetGlobalProperties()->GetValueProperties()); 3673 } 3674 } 3675 3676 TargetProperties::~TargetProperties() = default; 3677 3678 bool TargetProperties::GetInjectLocalVariables( 3679 ExecutionContext *exe_ctx) const { 3680 const Property *exp_property = m_collection_sp->GetPropertyAtIndex( 3681 exe_ctx, false, ePropertyExperimental); 3682 OptionValueProperties *exp_values = 3683 exp_property->GetValue()->GetAsProperties(); 3684 if (exp_values) 3685 return exp_values->GetPropertyAtIndexAsBoolean( 3686 exe_ctx, ePropertyInjectLocalVars, true); 3687 else 3688 return true; 3689 } 3690 3691 void TargetProperties::SetInjectLocalVariables(ExecutionContext *exe_ctx, 3692 bool b) { 3693 const Property *exp_property = 3694 m_collection_sp->GetPropertyAtIndex(exe_ctx, true, ePropertyExperimental); 3695 OptionValueProperties *exp_values = 3696 exp_property->GetValue()->GetAsProperties(); 3697 if (exp_values) 3698 exp_values->SetPropertyAtIndexAsBoolean(exe_ctx, ePropertyInjectLocalVars, 3699 true); 3700 } 3701 3702 bool TargetProperties::GetUseModernTypeLookup() const { 3703 const Property *exp_property = m_collection_sp->GetPropertyAtIndex( 3704 nullptr, false, ePropertyExperimental); 3705 OptionValueProperties *exp_values = 3706 exp_property->GetValue()->GetAsProperties(); 3707 if (exp_values) 3708 return exp_values->GetPropertyAtIndexAsBoolean( 3709 nullptr, ePropertyUseModernTypeLookup, true); 3710 else 3711 return true; 3712 } 3713 3714 ArchSpec TargetProperties::GetDefaultArchitecture() const { 3715 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch( 3716 nullptr, ePropertyDefaultArch); 3717 if (value) 3718 return value->GetCurrentValue(); 3719 return ArchSpec(); 3720 } 3721 3722 void TargetProperties::SetDefaultArchitecture(const ArchSpec &arch) { 3723 OptionValueArch *value = m_collection_sp->GetPropertyAtIndexAsOptionValueArch( 3724 nullptr, ePropertyDefaultArch); 3725 if (value) 3726 return value->SetCurrentValue(arch, true); 3727 } 3728 3729 bool TargetProperties::GetMoveToNearestCode() const { 3730 const uint32_t idx = ePropertyMoveToNearestCode; 3731 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3732 nullptr, idx, g_properties[idx].default_uint_value != 0); 3733 } 3734 3735 lldb::DynamicValueType TargetProperties::GetPreferDynamicValue() const { 3736 const uint32_t idx = ePropertyPreferDynamic; 3737 return (lldb::DynamicValueType) 3738 m_collection_sp->GetPropertyAtIndexAsEnumeration( 3739 nullptr, idx, g_properties[idx].default_uint_value); 3740 } 3741 3742 bool TargetProperties::SetPreferDynamicValue(lldb::DynamicValueType d) { 3743 const uint32_t idx = ePropertyPreferDynamic; 3744 return m_collection_sp->SetPropertyAtIndexAsEnumeration(nullptr, idx, d); 3745 } 3746 3747 bool TargetProperties::GetPreloadSymbols() const { 3748 const uint32_t idx = ePropertyPreloadSymbols; 3749 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3750 nullptr, idx, g_properties[idx].default_uint_value != 0); 3751 } 3752 3753 void TargetProperties::SetPreloadSymbols(bool b) { 3754 const uint32_t idx = ePropertyPreloadSymbols; 3755 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3756 } 3757 3758 bool TargetProperties::GetDisableASLR() const { 3759 const uint32_t idx = ePropertyDisableASLR; 3760 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3761 nullptr, idx, g_properties[idx].default_uint_value != 0); 3762 } 3763 3764 void TargetProperties::SetDisableASLR(bool b) { 3765 const uint32_t idx = ePropertyDisableASLR; 3766 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3767 } 3768 3769 bool TargetProperties::GetDetachOnError() const { 3770 const uint32_t idx = ePropertyDetachOnError; 3771 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3772 nullptr, idx, g_properties[idx].default_uint_value != 0); 3773 } 3774 3775 void TargetProperties::SetDetachOnError(bool b) { 3776 const uint32_t idx = ePropertyDetachOnError; 3777 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3778 } 3779 3780 bool TargetProperties::GetDisableSTDIO() const { 3781 const uint32_t idx = ePropertyDisableSTDIO; 3782 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3783 nullptr, idx, g_properties[idx].default_uint_value != 0); 3784 } 3785 3786 void TargetProperties::SetDisableSTDIO(bool b) { 3787 const uint32_t idx = ePropertyDisableSTDIO; 3788 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 3789 } 3790 3791 const char *TargetProperties::GetDisassemblyFlavor() const { 3792 const uint32_t idx = ePropertyDisassemblyFlavor; 3793 const char *return_value; 3794 3795 x86DisassemblyFlavor flavor_value = 3796 (x86DisassemblyFlavor)m_collection_sp->GetPropertyAtIndexAsEnumeration( 3797 nullptr, idx, g_properties[idx].default_uint_value); 3798 return_value = g_x86_dis_flavor_value_types[flavor_value].string_value; 3799 return return_value; 3800 } 3801 3802 InlineStrategy TargetProperties::GetInlineStrategy() const { 3803 const uint32_t idx = ePropertyInlineStrategy; 3804 return (InlineStrategy)m_collection_sp->GetPropertyAtIndexAsEnumeration( 3805 nullptr, idx, g_properties[idx].default_uint_value); 3806 } 3807 3808 llvm::StringRef TargetProperties::GetArg0() const { 3809 const uint32_t idx = ePropertyArg0; 3810 return m_collection_sp->GetPropertyAtIndexAsString(nullptr, idx, llvm::StringRef()); 3811 } 3812 3813 void TargetProperties::SetArg0(llvm::StringRef arg) { 3814 const uint32_t idx = ePropertyArg0; 3815 m_collection_sp->SetPropertyAtIndexAsString( 3816 nullptr, idx, arg); 3817 m_launch_info.SetArg0(arg); 3818 } 3819 3820 bool TargetProperties::GetRunArguments(Args &args) const { 3821 const uint32_t idx = ePropertyRunArgs; 3822 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args); 3823 } 3824 3825 void TargetProperties::SetRunArguments(const Args &args) { 3826 const uint32_t idx = ePropertyRunArgs; 3827 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args); 3828 m_launch_info.GetArguments() = args; 3829 } 3830 3831 Environment TargetProperties::GetEnvironment() const { 3832 // TODO: Get rid of the Args intermediate step 3833 Args env; 3834 const uint32_t idx = ePropertyEnvVars; 3835 m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, env); 3836 return Environment(env); 3837 } 3838 3839 void TargetProperties::SetEnvironment(Environment env) { 3840 // TODO: Get rid of the Args intermediate step 3841 const uint32_t idx = ePropertyEnvVars; 3842 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, Args(env)); 3843 m_launch_info.GetEnvironment() = std::move(env); 3844 } 3845 3846 bool TargetProperties::GetSkipPrologue() const { 3847 const uint32_t idx = ePropertySkipPrologue; 3848 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3849 nullptr, idx, g_properties[idx].default_uint_value != 0); 3850 } 3851 3852 PathMappingList &TargetProperties::GetSourcePathMap() const { 3853 const uint32_t idx = ePropertySourceMap; 3854 OptionValuePathMappings *option_value = 3855 m_collection_sp->GetPropertyAtIndexAsOptionValuePathMappings(nullptr, 3856 false, idx); 3857 assert(option_value); 3858 return option_value->GetCurrentValue(); 3859 } 3860 3861 FileSpecList &TargetProperties::GetExecutableSearchPaths() { 3862 const uint32_t idx = ePropertyExecutableSearchPaths; 3863 OptionValueFileSpecList *option_value = 3864 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3865 false, idx); 3866 assert(option_value); 3867 return option_value->GetCurrentValue(); 3868 } 3869 3870 FileSpecList &TargetProperties::GetDebugFileSearchPaths() { 3871 const uint32_t idx = ePropertyDebugFileSearchPaths; 3872 OptionValueFileSpecList *option_value = 3873 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3874 false, idx); 3875 assert(option_value); 3876 return option_value->GetCurrentValue(); 3877 } 3878 3879 FileSpecList &TargetProperties::GetClangModuleSearchPaths() { 3880 const uint32_t idx = ePropertyClangModuleSearchPaths; 3881 OptionValueFileSpecList *option_value = 3882 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpecList(nullptr, 3883 false, idx); 3884 assert(option_value); 3885 return option_value->GetCurrentValue(); 3886 } 3887 3888 bool TargetProperties::GetEnableAutoImportClangModules() const { 3889 const uint32_t idx = ePropertyAutoImportClangModules; 3890 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3891 nullptr, idx, g_properties[idx].default_uint_value != 0); 3892 } 3893 3894 bool TargetProperties::GetEnableImportStdModule() const { 3895 const uint32_t idx = ePropertyImportStdModule; 3896 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3897 nullptr, idx, g_properties[idx].default_uint_value != 0); 3898 } 3899 3900 bool TargetProperties::GetEnableAutoApplyFixIts() const { 3901 const uint32_t idx = ePropertyAutoApplyFixIts; 3902 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3903 nullptr, idx, g_properties[idx].default_uint_value != 0); 3904 } 3905 3906 bool TargetProperties::GetEnableNotifyAboutFixIts() const { 3907 const uint32_t idx = ePropertyNotifyAboutFixIts; 3908 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3909 nullptr, idx, g_properties[idx].default_uint_value != 0); 3910 } 3911 3912 bool TargetProperties::GetEnableSaveObjects() const { 3913 const uint32_t idx = ePropertySaveObjects; 3914 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3915 nullptr, idx, g_properties[idx].default_uint_value != 0); 3916 } 3917 3918 bool TargetProperties::GetEnableSyntheticValue() const { 3919 const uint32_t idx = ePropertyEnableSynthetic; 3920 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3921 nullptr, idx, g_properties[idx].default_uint_value != 0); 3922 } 3923 3924 uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const { 3925 const uint32_t idx = ePropertyMaxChildrenCount; 3926 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3927 nullptr, idx, g_properties[idx].default_uint_value); 3928 } 3929 3930 uint32_t TargetProperties::GetMaximumSizeOfStringSummary() const { 3931 const uint32_t idx = ePropertyMaxSummaryLength; 3932 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3933 nullptr, idx, g_properties[idx].default_uint_value); 3934 } 3935 3936 uint32_t TargetProperties::GetMaximumMemReadSize() const { 3937 const uint32_t idx = ePropertyMaxMemReadSize; 3938 return m_collection_sp->GetPropertyAtIndexAsSInt64( 3939 nullptr, idx, g_properties[idx].default_uint_value); 3940 } 3941 3942 FileSpec TargetProperties::GetStandardInputPath() const { 3943 const uint32_t idx = ePropertyInputPath; 3944 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3945 } 3946 3947 void TargetProperties::SetStandardInputPath(llvm::StringRef path) { 3948 const uint32_t idx = ePropertyInputPath; 3949 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3950 } 3951 3952 FileSpec TargetProperties::GetStandardOutputPath() const { 3953 const uint32_t idx = ePropertyOutputPath; 3954 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3955 } 3956 3957 void TargetProperties::SetStandardOutputPath(llvm::StringRef path) { 3958 const uint32_t idx = ePropertyOutputPath; 3959 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3960 } 3961 3962 FileSpec TargetProperties::GetStandardErrorPath() const { 3963 const uint32_t idx = ePropertyErrorPath; 3964 return m_collection_sp->GetPropertyAtIndexAsFileSpec(nullptr, idx); 3965 } 3966 3967 void TargetProperties::SetStandardErrorPath(llvm::StringRef path) { 3968 const uint32_t idx = ePropertyErrorPath; 3969 m_collection_sp->SetPropertyAtIndexAsString(nullptr, idx, path); 3970 } 3971 3972 LanguageType TargetProperties::GetLanguage() const { 3973 OptionValueLanguage *value = 3974 m_collection_sp->GetPropertyAtIndexAsOptionValueLanguage( 3975 nullptr, ePropertyLanguage); 3976 if (value) 3977 return value->GetCurrentValue(); 3978 return LanguageType(); 3979 } 3980 3981 llvm::StringRef TargetProperties::GetExpressionPrefixContents() { 3982 const uint32_t idx = ePropertyExprPrefix; 3983 OptionValueFileSpec *file = 3984 m_collection_sp->GetPropertyAtIndexAsOptionValueFileSpec(nullptr, false, 3985 idx); 3986 if (file) { 3987 DataBufferSP data_sp(file->GetFileContents()); 3988 if (data_sp) 3989 return llvm::StringRef( 3990 reinterpret_cast<const char *>(data_sp->GetBytes()), 3991 data_sp->GetByteSize()); 3992 } 3993 return ""; 3994 } 3995 3996 bool TargetProperties::GetBreakpointsConsultPlatformAvoidList() { 3997 const uint32_t idx = ePropertyBreakpointUseAvoidList; 3998 return m_collection_sp->GetPropertyAtIndexAsBoolean( 3999 nullptr, idx, g_properties[idx].default_uint_value != 0); 4000 } 4001 4002 bool TargetProperties::GetUseHexImmediates() const { 4003 const uint32_t idx = ePropertyUseHexImmediates; 4004 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4005 nullptr, idx, g_properties[idx].default_uint_value != 0); 4006 } 4007 4008 bool TargetProperties::GetUseFastStepping() const { 4009 const uint32_t idx = ePropertyUseFastStepping; 4010 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4011 nullptr, idx, g_properties[idx].default_uint_value != 0); 4012 } 4013 4014 bool TargetProperties::GetDisplayExpressionsInCrashlogs() const { 4015 const uint32_t idx = ePropertyDisplayExpressionsInCrashlogs; 4016 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4017 nullptr, idx, g_properties[idx].default_uint_value != 0); 4018 } 4019 4020 LoadScriptFromSymFile TargetProperties::GetLoadScriptFromSymbolFile() const { 4021 const uint32_t idx = ePropertyLoadScriptFromSymbolFile; 4022 return (LoadScriptFromSymFile) 4023 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4024 nullptr, idx, g_properties[idx].default_uint_value); 4025 } 4026 4027 LoadCWDlldbinitFile TargetProperties::GetLoadCWDlldbinitFile() const { 4028 const uint32_t idx = ePropertyLoadCWDlldbinitFile; 4029 return (LoadCWDlldbinitFile)m_collection_sp->GetPropertyAtIndexAsEnumeration( 4030 nullptr, idx, g_properties[idx].default_uint_value); 4031 } 4032 4033 Disassembler::HexImmediateStyle TargetProperties::GetHexImmediateStyle() const { 4034 const uint32_t idx = ePropertyHexImmediateStyle; 4035 return (Disassembler::HexImmediateStyle) 4036 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4037 nullptr, idx, g_properties[idx].default_uint_value); 4038 } 4039 4040 MemoryModuleLoadLevel TargetProperties::GetMemoryModuleLoadLevel() const { 4041 const uint32_t idx = ePropertyMemoryModuleLoadLevel; 4042 return (MemoryModuleLoadLevel) 4043 m_collection_sp->GetPropertyAtIndexAsEnumeration( 4044 nullptr, idx, g_properties[idx].default_uint_value); 4045 } 4046 4047 bool TargetProperties::GetUserSpecifiedTrapHandlerNames(Args &args) const { 4048 const uint32_t idx = ePropertyTrapHandlerNames; 4049 return m_collection_sp->GetPropertyAtIndexAsArgs(nullptr, idx, args); 4050 } 4051 4052 void TargetProperties::SetUserSpecifiedTrapHandlerNames(const Args &args) { 4053 const uint32_t idx = ePropertyTrapHandlerNames; 4054 m_collection_sp->SetPropertyAtIndexFromArgs(nullptr, idx, args); 4055 } 4056 4057 bool TargetProperties::GetDisplayRuntimeSupportValues() const { 4058 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 4059 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4060 } 4061 4062 void TargetProperties::SetDisplayRuntimeSupportValues(bool b) { 4063 const uint32_t idx = ePropertyDisplayRuntimeSupportValues; 4064 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4065 } 4066 4067 bool TargetProperties::GetDisplayRecognizedArguments() const { 4068 const uint32_t idx = ePropertyDisplayRecognizedArguments; 4069 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4070 } 4071 4072 void TargetProperties::SetDisplayRecognizedArguments(bool b) { 4073 const uint32_t idx = ePropertyDisplayRecognizedArguments; 4074 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4075 } 4076 4077 bool TargetProperties::GetNonStopModeEnabled() const { 4078 const uint32_t idx = ePropertyNonStopModeEnabled; 4079 return m_collection_sp->GetPropertyAtIndexAsBoolean(nullptr, idx, false); 4080 } 4081 4082 void TargetProperties::SetNonStopModeEnabled(bool b) { 4083 const uint32_t idx = ePropertyNonStopModeEnabled; 4084 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4085 } 4086 4087 const ProcessLaunchInfo &TargetProperties::GetProcessLaunchInfo() { 4088 m_launch_info.SetArg0(GetArg0()); // FIXME: Arg0 callback doesn't work 4089 return m_launch_info; 4090 } 4091 4092 void TargetProperties::SetProcessLaunchInfo( 4093 const ProcessLaunchInfo &launch_info) { 4094 m_launch_info = launch_info; 4095 SetArg0(launch_info.GetArg0()); 4096 SetRunArguments(launch_info.GetArguments()); 4097 SetEnvironment(launch_info.GetEnvironment()); 4098 const FileAction *input_file_action = 4099 launch_info.GetFileActionForFD(STDIN_FILENO); 4100 if (input_file_action) { 4101 SetStandardInputPath(input_file_action->GetPath()); 4102 } 4103 const FileAction *output_file_action = 4104 launch_info.GetFileActionForFD(STDOUT_FILENO); 4105 if (output_file_action) { 4106 SetStandardOutputPath(output_file_action->GetPath()); 4107 } 4108 const FileAction *error_file_action = 4109 launch_info.GetFileActionForFD(STDERR_FILENO); 4110 if (error_file_action) { 4111 SetStandardErrorPath(error_file_action->GetPath()); 4112 } 4113 SetDetachOnError(launch_info.GetFlags().Test(lldb::eLaunchFlagDetachOnError)); 4114 SetDisableASLR(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableASLR)); 4115 SetDisableSTDIO(launch_info.GetFlags().Test(lldb::eLaunchFlagDisableSTDIO)); 4116 } 4117 4118 bool TargetProperties::GetRequireHardwareBreakpoints() const { 4119 const uint32_t idx = ePropertyRequireHardwareBreakpoints; 4120 return m_collection_sp->GetPropertyAtIndexAsBoolean( 4121 nullptr, idx, g_properties[idx].default_uint_value != 0); 4122 } 4123 4124 void TargetProperties::SetRequireHardwareBreakpoints(bool b) { 4125 const uint32_t idx = ePropertyRequireHardwareBreakpoints; 4126 m_collection_sp->SetPropertyAtIndexAsBoolean(nullptr, idx, b); 4127 } 4128 4129 void TargetProperties::Arg0ValueChangedCallback(void *target_property_ptr, 4130 OptionValue *) { 4131 TargetProperties *this_ = 4132 reinterpret_cast<TargetProperties *>(target_property_ptr); 4133 this_->m_launch_info.SetArg0(this_->GetArg0()); 4134 } 4135 4136 void TargetProperties::RunArgsValueChangedCallback(void *target_property_ptr, 4137 OptionValue *) { 4138 TargetProperties *this_ = 4139 reinterpret_cast<TargetProperties *>(target_property_ptr); 4140 Args args; 4141 if (this_->GetRunArguments(args)) 4142 this_->m_launch_info.GetArguments() = args; 4143 } 4144 4145 void TargetProperties::EnvVarsValueChangedCallback(void *target_property_ptr, 4146 OptionValue *) { 4147 TargetProperties *this_ = 4148 reinterpret_cast<TargetProperties *>(target_property_ptr); 4149 this_->m_launch_info.GetEnvironment() = this_->GetEnvironment(); 4150 } 4151 4152 void TargetProperties::InputPathValueChangedCallback(void *target_property_ptr, 4153 OptionValue *) { 4154 TargetProperties *this_ = 4155 reinterpret_cast<TargetProperties *>(target_property_ptr); 4156 this_->m_launch_info.AppendOpenFileAction( 4157 STDIN_FILENO, this_->GetStandardInputPath(), true, false); 4158 } 4159 4160 void TargetProperties::OutputPathValueChangedCallback(void *target_property_ptr, 4161 OptionValue *) { 4162 TargetProperties *this_ = 4163 reinterpret_cast<TargetProperties *>(target_property_ptr); 4164 this_->m_launch_info.AppendOpenFileAction( 4165 STDOUT_FILENO, this_->GetStandardOutputPath(), false, true); 4166 } 4167 4168 void TargetProperties::ErrorPathValueChangedCallback(void *target_property_ptr, 4169 OptionValue *) { 4170 TargetProperties *this_ = 4171 reinterpret_cast<TargetProperties *>(target_property_ptr); 4172 this_->m_launch_info.AppendOpenFileAction( 4173 STDERR_FILENO, this_->GetStandardErrorPath(), false, true); 4174 } 4175 4176 void TargetProperties::DetachOnErrorValueChangedCallback( 4177 void *target_property_ptr, OptionValue *) { 4178 TargetProperties *this_ = 4179 reinterpret_cast<TargetProperties *>(target_property_ptr); 4180 if (this_->GetDetachOnError()) 4181 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDetachOnError); 4182 else 4183 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDetachOnError); 4184 } 4185 4186 void TargetProperties::DisableASLRValueChangedCallback( 4187 void *target_property_ptr, OptionValue *) { 4188 TargetProperties *this_ = 4189 reinterpret_cast<TargetProperties *>(target_property_ptr); 4190 if (this_->GetDisableASLR()) 4191 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableASLR); 4192 else 4193 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableASLR); 4194 } 4195 4196 void TargetProperties::DisableSTDIOValueChangedCallback( 4197 void *target_property_ptr, OptionValue *) { 4198 TargetProperties *this_ = 4199 reinterpret_cast<TargetProperties *>(target_property_ptr); 4200 if (this_->GetDisableSTDIO()) 4201 this_->m_launch_info.GetFlags().Set(lldb::eLaunchFlagDisableSTDIO); 4202 else 4203 this_->m_launch_info.GetFlags().Clear(lldb::eLaunchFlagDisableSTDIO); 4204 } 4205 4206 //---------------------------------------------------------------------- 4207 // Target::TargetEventData 4208 //---------------------------------------------------------------------- 4209 4210 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp) 4211 : EventData(), m_target_sp(target_sp), m_module_list() {} 4212 4213 Target::TargetEventData::TargetEventData(const lldb::TargetSP &target_sp, 4214 const ModuleList &module_list) 4215 : EventData(), m_target_sp(target_sp), m_module_list(module_list) {} 4216 4217 Target::TargetEventData::~TargetEventData() = default; 4218 4219 ConstString Target::TargetEventData::GetFlavorString() { 4220 static ConstString g_flavor("Target::TargetEventData"); 4221 return g_flavor; 4222 } 4223 4224 void Target::TargetEventData::Dump(Stream *s) const { 4225 for (size_t i = 0; i < m_module_list.GetSize(); ++i) { 4226 if (i != 0) 4227 *s << ", "; 4228 m_module_list.GetModuleAtIndex(i)->GetDescription( 4229 s, lldb::eDescriptionLevelBrief); 4230 } 4231 } 4232 4233 const Target::TargetEventData * 4234 Target::TargetEventData::GetEventDataFromEvent(const Event *event_ptr) { 4235 if (event_ptr) { 4236 const EventData *event_data = event_ptr->GetData(); 4237 if (event_data && 4238 event_data->GetFlavor() == TargetEventData::GetFlavorString()) 4239 return static_cast<const TargetEventData *>(event_ptr->GetData()); 4240 } 4241 return nullptr; 4242 } 4243 4244 TargetSP Target::TargetEventData::GetTargetFromEvent(const Event *event_ptr) { 4245 TargetSP target_sp; 4246 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr); 4247 if (event_data) 4248 target_sp = event_data->m_target_sp; 4249 return target_sp; 4250 } 4251 4252 ModuleList 4253 Target::TargetEventData::GetModuleListFromEvent(const Event *event_ptr) { 4254 ModuleList module_list; 4255 const TargetEventData *event_data = GetEventDataFromEvent(event_ptr); 4256 if (event_data) 4257 module_list = event_data->m_module_list; 4258 return module_list; 4259 } 4260