1 //===-- SBFrame.cpp -------------------------------------------------------===// 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 <algorithm> 10 #include <set> 11 #include <string> 12 13 #include "lldb/API/SBFrame.h" 14 15 #include "lldb/lldb-types.h" 16 17 #include "Utils.h" 18 #include "lldb/Core/Address.h" 19 #include "lldb/Core/Debugger.h" 20 #include "lldb/Core/StreamFile.h" 21 #include "lldb/Core/ValueObjectRegister.h" 22 #include "lldb/Core/ValueObjectVariable.h" 23 #include "lldb/Core/ValueObjectConstResult.h" 24 #include "lldb/Expression/ExpressionVariable.h" 25 #include "lldb/Expression/UserExpression.h" 26 #include "lldb/Host/Host.h" 27 #include "lldb/Symbol/Block.h" 28 #include "lldb/Symbol/Function.h" 29 #include "lldb/Symbol/Symbol.h" 30 #include "lldb/Symbol/SymbolContext.h" 31 #include "lldb/Symbol/Variable.h" 32 #include "lldb/Symbol/VariableList.h" 33 #include "lldb/Target/ExecutionContext.h" 34 #include "lldb/Target/Process.h" 35 #include "lldb/Target/RegisterContext.h" 36 #include "lldb/Target/StackFrame.h" 37 #include "lldb/Target/StackFrameRecognizer.h" 38 #include "lldb/Target/StackID.h" 39 #include "lldb/Target/Target.h" 40 #include "lldb/Target/Thread.h" 41 #include "lldb/Utility/ConstString.h" 42 #include "lldb/Utility/Instrumentation.h" 43 #include "lldb/Utility/LLDBLog.h" 44 #include "lldb/Utility/Stream.h" 45 46 #include "lldb/API/SBAddress.h" 47 #include "lldb/API/SBDebugger.h" 48 #include "lldb/API/SBExpressionOptions.h" 49 #include "lldb/API/SBStream.h" 50 #include "lldb/API/SBSymbolContext.h" 51 #include "lldb/API/SBThread.h" 52 #include "lldb/API/SBValue.h" 53 #include "lldb/API/SBVariablesOptions.h" 54 55 #include "llvm/Support/PrettyStackTrace.h" 56 57 using namespace lldb; 58 using namespace lldb_private; 59 60 SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) { 61 LLDB_INSTRUMENT_VA(this); 62 } 63 64 SBFrame::SBFrame(const StackFrameSP &lldb_object_sp) 65 : m_opaque_sp(new ExecutionContextRef(lldb_object_sp)) { 66 LLDB_INSTRUMENT_VA(this, lldb_object_sp); 67 } 68 69 SBFrame::SBFrame(const SBFrame &rhs) { 70 LLDB_INSTRUMENT_VA(this, rhs); 71 72 m_opaque_sp = clone(rhs.m_opaque_sp); 73 } 74 75 SBFrame::~SBFrame() = default; 76 77 const SBFrame &SBFrame::operator=(const SBFrame &rhs) { 78 LLDB_INSTRUMENT_VA(this, rhs); 79 80 if (this != &rhs) 81 m_opaque_sp = clone(rhs.m_opaque_sp); 82 return *this; 83 } 84 85 StackFrameSP SBFrame::GetFrameSP() const { 86 return (m_opaque_sp ? m_opaque_sp->GetFrameSP() : StackFrameSP()); 87 } 88 89 void SBFrame::SetFrameSP(const StackFrameSP &lldb_object_sp) { 90 return m_opaque_sp->SetFrameSP(lldb_object_sp); 91 } 92 93 bool SBFrame::IsValid() const { 94 LLDB_INSTRUMENT_VA(this); 95 return this->operator bool(); 96 } 97 SBFrame::operator bool() const { 98 LLDB_INSTRUMENT_VA(this); 99 100 std::unique_lock<std::recursive_mutex> lock; 101 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 102 103 Target *target = exe_ctx.GetTargetPtr(); 104 Process *process = exe_ctx.GetProcessPtr(); 105 if (target && process) { 106 Process::StopLocker stop_locker; 107 if (stop_locker.TryLock(&process->GetRunLock())) 108 return GetFrameSP().get() != nullptr; 109 } 110 111 // Without a target & process we can't have a valid stack frame. 112 return false; 113 } 114 115 SBSymbolContext SBFrame::GetSymbolContext(uint32_t resolve_scope) const { 116 LLDB_INSTRUMENT_VA(this, resolve_scope); 117 118 SBSymbolContext sb_sym_ctx; 119 std::unique_lock<std::recursive_mutex> lock; 120 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 121 SymbolContextItem scope = static_cast<SymbolContextItem>(resolve_scope); 122 Target *target = exe_ctx.GetTargetPtr(); 123 Process *process = exe_ctx.GetProcessPtr(); 124 if (target && process) { 125 Process::StopLocker stop_locker; 126 if (stop_locker.TryLock(&process->GetRunLock())) { 127 if (StackFrame *frame = exe_ctx.GetFramePtr()) 128 sb_sym_ctx = frame->GetSymbolContext(scope); 129 } 130 } 131 132 return sb_sym_ctx; 133 } 134 135 SBModule SBFrame::GetModule() const { 136 LLDB_INSTRUMENT_VA(this); 137 138 SBModule sb_module; 139 ModuleSP module_sp; 140 std::unique_lock<std::recursive_mutex> lock; 141 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 142 143 StackFrame *frame = nullptr; 144 Target *target = exe_ctx.GetTargetPtr(); 145 Process *process = exe_ctx.GetProcessPtr(); 146 if (target && process) { 147 Process::StopLocker stop_locker; 148 if (stop_locker.TryLock(&process->GetRunLock())) { 149 frame = exe_ctx.GetFramePtr(); 150 if (frame) { 151 module_sp = frame->GetSymbolContext(eSymbolContextModule).module_sp; 152 sb_module.SetSP(module_sp); 153 } 154 } 155 } 156 157 return sb_module; 158 } 159 160 SBCompileUnit SBFrame::GetCompileUnit() const { 161 LLDB_INSTRUMENT_VA(this); 162 163 SBCompileUnit sb_comp_unit; 164 std::unique_lock<std::recursive_mutex> lock; 165 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 166 167 StackFrame *frame = nullptr; 168 Target *target = exe_ctx.GetTargetPtr(); 169 Process *process = exe_ctx.GetProcessPtr(); 170 if (target && process) { 171 Process::StopLocker stop_locker; 172 if (stop_locker.TryLock(&process->GetRunLock())) { 173 frame = exe_ctx.GetFramePtr(); 174 if (frame) { 175 sb_comp_unit.reset( 176 frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit); 177 } 178 } 179 } 180 181 return sb_comp_unit; 182 } 183 184 SBFunction SBFrame::GetFunction() const { 185 LLDB_INSTRUMENT_VA(this); 186 187 SBFunction sb_function; 188 std::unique_lock<std::recursive_mutex> lock; 189 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 190 191 StackFrame *frame = nullptr; 192 Target *target = exe_ctx.GetTargetPtr(); 193 Process *process = exe_ctx.GetProcessPtr(); 194 if (target && process) { 195 Process::StopLocker stop_locker; 196 if (stop_locker.TryLock(&process->GetRunLock())) { 197 frame = exe_ctx.GetFramePtr(); 198 if (frame) { 199 sb_function.reset( 200 frame->GetSymbolContext(eSymbolContextFunction).function); 201 } 202 } 203 } 204 205 return sb_function; 206 } 207 208 SBSymbol SBFrame::GetSymbol() const { 209 LLDB_INSTRUMENT_VA(this); 210 211 SBSymbol sb_symbol; 212 std::unique_lock<std::recursive_mutex> lock; 213 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 214 215 StackFrame *frame = nullptr; 216 Target *target = exe_ctx.GetTargetPtr(); 217 Process *process = exe_ctx.GetProcessPtr(); 218 if (target && process) { 219 Process::StopLocker stop_locker; 220 if (stop_locker.TryLock(&process->GetRunLock())) { 221 frame = exe_ctx.GetFramePtr(); 222 if (frame) { 223 sb_symbol.reset(frame->GetSymbolContext(eSymbolContextSymbol).symbol); 224 } 225 } 226 } 227 228 return sb_symbol; 229 } 230 231 SBBlock SBFrame::GetBlock() const { 232 LLDB_INSTRUMENT_VA(this); 233 234 SBBlock sb_block; 235 std::unique_lock<std::recursive_mutex> lock; 236 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 237 238 StackFrame *frame = nullptr; 239 Target *target = exe_ctx.GetTargetPtr(); 240 Process *process = exe_ctx.GetProcessPtr(); 241 if (target && process) { 242 Process::StopLocker stop_locker; 243 if (stop_locker.TryLock(&process->GetRunLock())) { 244 frame = exe_ctx.GetFramePtr(); 245 if (frame) 246 sb_block.SetPtr(frame->GetSymbolContext(eSymbolContextBlock).block); 247 } 248 } 249 return sb_block; 250 } 251 252 SBBlock SBFrame::GetFrameBlock() const { 253 LLDB_INSTRUMENT_VA(this); 254 255 SBBlock sb_block; 256 std::unique_lock<std::recursive_mutex> lock; 257 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 258 259 StackFrame *frame = nullptr; 260 Target *target = exe_ctx.GetTargetPtr(); 261 Process *process = exe_ctx.GetProcessPtr(); 262 if (target && process) { 263 Process::StopLocker stop_locker; 264 if (stop_locker.TryLock(&process->GetRunLock())) { 265 frame = exe_ctx.GetFramePtr(); 266 if (frame) 267 sb_block.SetPtr(frame->GetFrameBlock()); 268 } 269 } 270 return sb_block; 271 } 272 273 SBLineEntry SBFrame::GetLineEntry() const { 274 LLDB_INSTRUMENT_VA(this); 275 276 SBLineEntry sb_line_entry; 277 std::unique_lock<std::recursive_mutex> lock; 278 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 279 280 StackFrame *frame = nullptr; 281 Target *target = exe_ctx.GetTargetPtr(); 282 Process *process = exe_ctx.GetProcessPtr(); 283 if (target && process) { 284 Process::StopLocker stop_locker; 285 if (stop_locker.TryLock(&process->GetRunLock())) { 286 frame = exe_ctx.GetFramePtr(); 287 if (frame) { 288 sb_line_entry.SetLineEntry( 289 frame->GetSymbolContext(eSymbolContextLineEntry).line_entry); 290 } 291 } 292 } 293 return sb_line_entry; 294 } 295 296 uint32_t SBFrame::GetFrameID() const { 297 LLDB_INSTRUMENT_VA(this); 298 299 uint32_t frame_idx = UINT32_MAX; 300 301 std::unique_lock<std::recursive_mutex> lock; 302 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 303 304 StackFrame *frame = exe_ctx.GetFramePtr(); 305 if (frame) 306 frame_idx = frame->GetFrameIndex(); 307 308 return frame_idx; 309 } 310 311 lldb::addr_t SBFrame::GetCFA() const { 312 LLDB_INSTRUMENT_VA(this); 313 314 std::unique_lock<std::recursive_mutex> lock; 315 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 316 317 StackFrame *frame = exe_ctx.GetFramePtr(); 318 if (frame) 319 return frame->GetStackID().GetCallFrameAddress(); 320 return LLDB_INVALID_ADDRESS; 321 } 322 323 addr_t SBFrame::GetPC() const { 324 LLDB_INSTRUMENT_VA(this); 325 326 addr_t addr = LLDB_INVALID_ADDRESS; 327 std::unique_lock<std::recursive_mutex> lock; 328 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 329 330 StackFrame *frame = nullptr; 331 Target *target = exe_ctx.GetTargetPtr(); 332 Process *process = exe_ctx.GetProcessPtr(); 333 if (target && process) { 334 Process::StopLocker stop_locker; 335 if (stop_locker.TryLock(&process->GetRunLock())) { 336 frame = exe_ctx.GetFramePtr(); 337 if (frame) { 338 addr = frame->GetFrameCodeAddress().GetOpcodeLoadAddress( 339 target, AddressClass::eCode); 340 } 341 } 342 } 343 344 return addr; 345 } 346 347 bool SBFrame::SetPC(addr_t new_pc) { 348 LLDB_INSTRUMENT_VA(this, new_pc); 349 350 bool ret_val = false; 351 std::unique_lock<std::recursive_mutex> lock; 352 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 353 354 Target *target = exe_ctx.GetTargetPtr(); 355 Process *process = exe_ctx.GetProcessPtr(); 356 if (target && process) { 357 Process::StopLocker stop_locker; 358 if (stop_locker.TryLock(&process->GetRunLock())) { 359 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 360 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 361 ret_val = reg_ctx_sp->SetPC(new_pc); 362 } 363 } 364 } 365 } 366 367 return ret_val; 368 } 369 370 addr_t SBFrame::GetSP() const { 371 LLDB_INSTRUMENT_VA(this); 372 373 addr_t addr = LLDB_INVALID_ADDRESS; 374 std::unique_lock<std::recursive_mutex> lock; 375 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 376 377 Target *target = exe_ctx.GetTargetPtr(); 378 Process *process = exe_ctx.GetProcessPtr(); 379 if (target && process) { 380 Process::StopLocker stop_locker; 381 if (stop_locker.TryLock(&process->GetRunLock())) { 382 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 383 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 384 addr = reg_ctx_sp->GetSP(); 385 } 386 } 387 } 388 } 389 390 return addr; 391 } 392 393 addr_t SBFrame::GetFP() const { 394 LLDB_INSTRUMENT_VA(this); 395 396 addr_t addr = LLDB_INVALID_ADDRESS; 397 std::unique_lock<std::recursive_mutex> lock; 398 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 399 400 Target *target = exe_ctx.GetTargetPtr(); 401 Process *process = exe_ctx.GetProcessPtr(); 402 if (target && process) { 403 Process::StopLocker stop_locker; 404 if (stop_locker.TryLock(&process->GetRunLock())) { 405 if (StackFrame *frame = exe_ctx.GetFramePtr()) { 406 if (RegisterContextSP reg_ctx_sp = frame->GetRegisterContext()) { 407 addr = reg_ctx_sp->GetFP(); 408 } 409 } 410 } 411 } 412 413 return addr; 414 } 415 416 SBAddress SBFrame::GetPCAddress() const { 417 LLDB_INSTRUMENT_VA(this); 418 419 SBAddress sb_addr; 420 std::unique_lock<std::recursive_mutex> lock; 421 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 422 423 StackFrame *frame = exe_ctx.GetFramePtr(); 424 Target *target = exe_ctx.GetTargetPtr(); 425 Process *process = exe_ctx.GetProcessPtr(); 426 if (target && process) { 427 Process::StopLocker stop_locker; 428 if (stop_locker.TryLock(&process->GetRunLock())) { 429 frame = exe_ctx.GetFramePtr(); 430 if (frame) 431 sb_addr.SetAddress(frame->GetFrameCodeAddress()); 432 } 433 } 434 return sb_addr; 435 } 436 437 void SBFrame::Clear() { 438 LLDB_INSTRUMENT_VA(this); 439 440 m_opaque_sp->Clear(); 441 } 442 443 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path) { 444 LLDB_INSTRUMENT_VA(this, var_path); 445 446 SBValue sb_value; 447 std::unique_lock<std::recursive_mutex> lock; 448 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 449 450 StackFrame *frame = exe_ctx.GetFramePtr(); 451 Target *target = exe_ctx.GetTargetPtr(); 452 if (frame && target) { 453 lldb::DynamicValueType use_dynamic = 454 frame->CalculateTarget()->GetPreferDynamicValue(); 455 sb_value = GetValueForVariablePath(var_path, use_dynamic); 456 } 457 return sb_value; 458 } 459 460 lldb::SBValue SBFrame::GetValueForVariablePath(const char *var_path, 461 DynamicValueType use_dynamic) { 462 LLDB_INSTRUMENT_VA(this, var_path, use_dynamic); 463 464 SBValue sb_value; 465 if (var_path == nullptr || var_path[0] == '\0') { 466 return sb_value; 467 } 468 469 std::unique_lock<std::recursive_mutex> lock; 470 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 471 472 StackFrame *frame = nullptr; 473 Target *target = exe_ctx.GetTargetPtr(); 474 Process *process = exe_ctx.GetProcessPtr(); 475 if (target && process) { 476 Process::StopLocker stop_locker; 477 if (stop_locker.TryLock(&process->GetRunLock())) { 478 frame = exe_ctx.GetFramePtr(); 479 if (frame) { 480 VariableSP var_sp; 481 Status error; 482 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath( 483 var_path, eNoDynamicValues, 484 StackFrame::eExpressionPathOptionCheckPtrVsMember | 485 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess, 486 var_sp, error)); 487 sb_value.SetSP(value_sp, use_dynamic); 488 } 489 } 490 } 491 return sb_value; 492 } 493 494 SBValue SBFrame::FindVariable(const char *name) { 495 LLDB_INSTRUMENT_VA(this, name); 496 497 SBValue value; 498 std::unique_lock<std::recursive_mutex> lock; 499 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 500 501 StackFrame *frame = exe_ctx.GetFramePtr(); 502 Target *target = exe_ctx.GetTargetPtr(); 503 if (frame && target) { 504 lldb::DynamicValueType use_dynamic = 505 frame->CalculateTarget()->GetPreferDynamicValue(); 506 value = FindVariable(name, use_dynamic); 507 } 508 return value; 509 } 510 511 SBValue SBFrame::FindVariable(const char *name, 512 lldb::DynamicValueType use_dynamic) { 513 LLDB_INSTRUMENT_VA(this, name, use_dynamic); 514 515 VariableSP var_sp; 516 SBValue sb_value; 517 518 if (name == nullptr || name[0] == '\0') { 519 return sb_value; 520 } 521 522 ValueObjectSP value_sp; 523 std::unique_lock<std::recursive_mutex> lock; 524 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 525 526 StackFrame *frame = nullptr; 527 Target *target = exe_ctx.GetTargetPtr(); 528 Process *process = exe_ctx.GetProcessPtr(); 529 if (target && process) { 530 Process::StopLocker stop_locker; 531 if (stop_locker.TryLock(&process->GetRunLock())) { 532 frame = exe_ctx.GetFramePtr(); 533 if (frame) { 534 value_sp = frame->FindVariable(ConstString(name)); 535 536 if (value_sp) 537 sb_value.SetSP(value_sp, use_dynamic); 538 } 539 } 540 } 541 542 return sb_value; 543 } 544 545 SBValue SBFrame::FindValue(const char *name, ValueType value_type) { 546 LLDB_INSTRUMENT_VA(this, name, value_type); 547 548 SBValue value; 549 std::unique_lock<std::recursive_mutex> lock; 550 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 551 552 StackFrame *frame = exe_ctx.GetFramePtr(); 553 Target *target = exe_ctx.GetTargetPtr(); 554 if (frame && target) { 555 lldb::DynamicValueType use_dynamic = 556 frame->CalculateTarget()->GetPreferDynamicValue(); 557 value = FindValue(name, value_type, use_dynamic); 558 } 559 return value; 560 } 561 562 SBValue SBFrame::FindValue(const char *name, ValueType value_type, 563 lldb::DynamicValueType use_dynamic) { 564 LLDB_INSTRUMENT_VA(this, name, value_type, use_dynamic); 565 566 SBValue sb_value; 567 568 if (name == nullptr || name[0] == '\0') { 569 return sb_value; 570 } 571 572 ValueObjectSP value_sp; 573 std::unique_lock<std::recursive_mutex> lock; 574 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 575 576 StackFrame *frame = nullptr; 577 Target *target = exe_ctx.GetTargetPtr(); 578 Process *process = exe_ctx.GetProcessPtr(); 579 if (target && process) { 580 Process::StopLocker stop_locker; 581 if (stop_locker.TryLock(&process->GetRunLock())) { 582 frame = exe_ctx.GetFramePtr(); 583 if (frame) { 584 VariableList variable_list; 585 586 switch (value_type) { 587 case eValueTypeVariableGlobal: // global variable 588 case eValueTypeVariableStatic: // static variable 589 case eValueTypeVariableArgument: // function argument variables 590 case eValueTypeVariableLocal: // function local variables 591 case eValueTypeVariableThreadLocal: // thread local variables 592 { 593 SymbolContext sc(frame->GetSymbolContext(eSymbolContextBlock)); 594 595 const bool can_create = true; 596 const bool get_parent_variables = true; 597 const bool stop_if_block_is_inlined_function = true; 598 599 if (sc.block) 600 sc.block->AppendVariables( 601 can_create, get_parent_variables, 602 stop_if_block_is_inlined_function, 603 [frame](Variable *v) { return v->IsInScope(frame); }, 604 &variable_list); 605 if (value_type == eValueTypeVariableGlobal 606 || value_type == eValueTypeVariableStatic) { 607 const bool get_file_globals = true; 608 VariableList *frame_vars = frame->GetVariableList(get_file_globals, 609 nullptr); 610 if (frame_vars) 611 frame_vars->AppendVariablesIfUnique(variable_list); 612 } 613 ConstString const_name(name); 614 VariableSP variable_sp( 615 variable_list.FindVariable(const_name, value_type)); 616 if (variable_sp) { 617 value_sp = frame->GetValueObjectForFrameVariable(variable_sp, 618 eNoDynamicValues); 619 sb_value.SetSP(value_sp, use_dynamic); 620 } 621 } break; 622 623 case eValueTypeRegister: // stack frame register value 624 { 625 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 626 if (reg_ctx) { 627 if (const RegisterInfo *reg_info = 628 reg_ctx->GetRegisterInfoByName(name)) { 629 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 630 sb_value.SetSP(value_sp); 631 } 632 } 633 } break; 634 635 case eValueTypeRegisterSet: // A collection of stack frame register 636 // values 637 { 638 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 639 if (reg_ctx) { 640 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 641 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 642 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx); 643 if (reg_set && 644 (llvm::StringRef(reg_set->name).equals_insensitive(name) || 645 llvm::StringRef(reg_set->short_name) 646 .equals_insensitive(name))) { 647 value_sp = 648 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx); 649 sb_value.SetSP(value_sp); 650 break; 651 } 652 } 653 } 654 } break; 655 656 case eValueTypeConstResult: // constant result variables 657 { 658 ConstString const_name(name); 659 ExpressionVariableSP expr_var_sp( 660 target->GetPersistentVariable(const_name)); 661 if (expr_var_sp) { 662 value_sp = expr_var_sp->GetValueObject(); 663 sb_value.SetSP(value_sp, use_dynamic); 664 } 665 } break; 666 667 default: 668 break; 669 } 670 } 671 } 672 } 673 674 return sb_value; 675 } 676 677 bool SBFrame::IsEqual(const SBFrame &that) const { 678 LLDB_INSTRUMENT_VA(this, that); 679 680 lldb::StackFrameSP this_sp = GetFrameSP(); 681 lldb::StackFrameSP that_sp = that.GetFrameSP(); 682 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID()); 683 } 684 685 bool SBFrame::operator==(const SBFrame &rhs) const { 686 LLDB_INSTRUMENT_VA(this, rhs); 687 688 return IsEqual(rhs); 689 } 690 691 bool SBFrame::operator!=(const SBFrame &rhs) const { 692 LLDB_INSTRUMENT_VA(this, rhs); 693 694 return !IsEqual(rhs); 695 } 696 697 SBThread SBFrame::GetThread() const { 698 LLDB_INSTRUMENT_VA(this); 699 700 std::unique_lock<std::recursive_mutex> lock; 701 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 702 703 ThreadSP thread_sp(exe_ctx.GetThreadSP()); 704 SBThread sb_thread(thread_sp); 705 706 return sb_thread; 707 } 708 709 const char *SBFrame::Disassemble() const { 710 LLDB_INSTRUMENT_VA(this); 711 712 std::unique_lock<std::recursive_mutex> lock; 713 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 714 Target *target = exe_ctx.GetTargetPtr(); 715 Process *process = exe_ctx.GetProcessPtr(); 716 if (!target || !process) 717 return nullptr; 718 719 Process::StopLocker stop_locker; 720 if (stop_locker.TryLock(&process->GetRunLock())) { 721 if (auto *frame = exe_ctx.GetFramePtr()) 722 return ConstString(frame->Disassemble()).GetCString(); 723 } 724 725 return nullptr; 726 } 727 728 SBValueList SBFrame::GetVariables(bool arguments, bool locals, bool statics, 729 bool in_scope_only) { 730 LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only); 731 732 SBValueList value_list; 733 std::unique_lock<std::recursive_mutex> lock; 734 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 735 736 StackFrame *frame = exe_ctx.GetFramePtr(); 737 Target *target = exe_ctx.GetTargetPtr(); 738 if (frame && target) { 739 lldb::DynamicValueType use_dynamic = 740 frame->CalculateTarget()->GetPreferDynamicValue(); 741 const bool include_runtime_support_values = 742 target->GetDisplayRuntimeSupportValues(); 743 744 SBVariablesOptions options; 745 options.SetIncludeArguments(arguments); 746 options.SetIncludeLocals(locals); 747 options.SetIncludeStatics(statics); 748 options.SetInScopeOnly(in_scope_only); 749 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 750 options.SetUseDynamic(use_dynamic); 751 752 value_list = GetVariables(options); 753 } 754 return value_list; 755 } 756 757 lldb::SBValueList SBFrame::GetVariables(bool arguments, bool locals, 758 bool statics, bool in_scope_only, 759 lldb::DynamicValueType use_dynamic) { 760 LLDB_INSTRUMENT_VA(this, arguments, locals, statics, in_scope_only, 761 use_dynamic); 762 763 std::unique_lock<std::recursive_mutex> lock; 764 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 765 766 Target *target = exe_ctx.GetTargetPtr(); 767 const bool include_runtime_support_values = 768 target ? target->GetDisplayRuntimeSupportValues() : false; 769 SBVariablesOptions options; 770 options.SetIncludeArguments(arguments); 771 options.SetIncludeLocals(locals); 772 options.SetIncludeStatics(statics); 773 options.SetInScopeOnly(in_scope_only); 774 options.SetIncludeRuntimeSupportValues(include_runtime_support_values); 775 options.SetUseDynamic(use_dynamic); 776 return GetVariables(options); 777 } 778 779 SBValueList SBFrame::GetVariables(const lldb::SBVariablesOptions &options) { 780 LLDB_INSTRUMENT_VA(this, options); 781 782 SBValueList value_list; 783 std::unique_lock<std::recursive_mutex> lock; 784 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 785 786 StackFrame *frame = nullptr; 787 Target *target = exe_ctx.GetTargetPtr(); 788 789 const bool statics = options.GetIncludeStatics(); 790 const bool arguments = options.GetIncludeArguments(); 791 const bool recognized_arguments = 792 options.GetIncludeRecognizedArguments(SBTarget(exe_ctx.GetTargetSP())); 793 const bool locals = options.GetIncludeLocals(); 794 const bool in_scope_only = options.GetInScopeOnly(); 795 const bool include_runtime_support_values = 796 options.GetIncludeRuntimeSupportValues(); 797 const lldb::DynamicValueType use_dynamic = options.GetUseDynamic(); 798 799 800 std::set<VariableSP> variable_set; 801 Process *process = exe_ctx.GetProcessPtr(); 802 if (target && process) { 803 Process::StopLocker stop_locker; 804 if (stop_locker.TryLock(&process->GetRunLock())) { 805 frame = exe_ctx.GetFramePtr(); 806 if (frame) { 807 Debugger &dbg = process->GetTarget().GetDebugger(); 808 VariableList *variable_list = nullptr; 809 Status var_error; 810 variable_list = frame->GetVariableList(true, &var_error); 811 if (var_error.Fail()) 812 value_list.SetError(var_error); 813 if (variable_list) { 814 const size_t num_variables = variable_list->GetSize(); 815 if (num_variables) { 816 size_t num_produced = 0; 817 for (const VariableSP &variable_sp : *variable_list) { 818 if (INTERRUPT_REQUESTED(dbg, 819 "Interrupted getting frame variables with {0} of {1} " 820 "produced.", num_produced, num_variables)) 821 return {}; 822 823 if (variable_sp) { 824 bool add_variable = false; 825 switch (variable_sp->GetScope()) { 826 case eValueTypeVariableGlobal: 827 case eValueTypeVariableStatic: 828 case eValueTypeVariableThreadLocal: 829 add_variable = statics; 830 break; 831 832 case eValueTypeVariableArgument: 833 add_variable = arguments; 834 break; 835 836 case eValueTypeVariableLocal: 837 add_variable = locals; 838 break; 839 840 default: 841 break; 842 } 843 if (add_variable) { 844 // Only add variables once so we don't end up with duplicates 845 if (variable_set.find(variable_sp) == variable_set.end()) 846 variable_set.insert(variable_sp); 847 else 848 continue; 849 850 if (in_scope_only && !variable_sp->IsInScope(frame)) 851 continue; 852 853 ValueObjectSP valobj_sp(frame->GetValueObjectForFrameVariable( 854 variable_sp, eNoDynamicValues)); 855 856 if (!include_runtime_support_values && valobj_sp != nullptr && 857 valobj_sp->IsRuntimeSupportValue()) 858 continue; 859 860 SBValue value_sb; 861 value_sb.SetSP(valobj_sp, use_dynamic); 862 value_list.Append(value_sb); 863 } 864 } 865 } 866 num_produced++; 867 } 868 } 869 if (recognized_arguments) { 870 auto recognized_frame = frame->GetRecognizedFrame(); 871 if (recognized_frame) { 872 ValueObjectListSP recognized_arg_list = 873 recognized_frame->GetRecognizedArguments(); 874 if (recognized_arg_list) { 875 for (auto &rec_value_sp : recognized_arg_list->GetObjects()) { 876 SBValue value_sb; 877 value_sb.SetSP(rec_value_sp, use_dynamic); 878 value_list.Append(value_sb); 879 } 880 } 881 } 882 } 883 } 884 } 885 } 886 887 return value_list; 888 } 889 890 SBValueList SBFrame::GetRegisters() { 891 LLDB_INSTRUMENT_VA(this); 892 893 SBValueList value_list; 894 std::unique_lock<std::recursive_mutex> lock; 895 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 896 897 StackFrame *frame = nullptr; 898 Target *target = exe_ctx.GetTargetPtr(); 899 Process *process = exe_ctx.GetProcessPtr(); 900 if (target && process) { 901 Process::StopLocker stop_locker; 902 if (stop_locker.TryLock(&process->GetRunLock())) { 903 frame = exe_ctx.GetFramePtr(); 904 if (frame) { 905 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 906 if (reg_ctx) { 907 const uint32_t num_sets = reg_ctx->GetRegisterSetCount(); 908 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) { 909 value_list.Append( 910 ValueObjectRegisterSet::Create(frame, reg_ctx, set_idx)); 911 } 912 } 913 } 914 } 915 } 916 917 return value_list; 918 } 919 920 SBValue SBFrame::FindRegister(const char *name) { 921 LLDB_INSTRUMENT_VA(this, name); 922 923 SBValue result; 924 ValueObjectSP value_sp; 925 std::unique_lock<std::recursive_mutex> lock; 926 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 927 928 StackFrame *frame = nullptr; 929 Target *target = exe_ctx.GetTargetPtr(); 930 Process *process = exe_ctx.GetProcessPtr(); 931 if (target && process) { 932 Process::StopLocker stop_locker; 933 if (stop_locker.TryLock(&process->GetRunLock())) { 934 frame = exe_ctx.GetFramePtr(); 935 if (frame) { 936 RegisterContextSP reg_ctx(frame->GetRegisterContext()); 937 if (reg_ctx) { 938 if (const RegisterInfo *reg_info = 939 reg_ctx->GetRegisterInfoByName(name)) { 940 value_sp = ValueObjectRegister::Create(frame, reg_ctx, reg_info); 941 result.SetSP(value_sp); 942 } 943 } 944 } 945 } 946 } 947 948 return result; 949 } 950 951 bool SBFrame::GetDescription(SBStream &description) { 952 LLDB_INSTRUMENT_VA(this, description); 953 954 Stream &strm = description.ref(); 955 956 std::unique_lock<std::recursive_mutex> lock; 957 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 958 959 StackFrame *frame; 960 Target *target = exe_ctx.GetTargetPtr(); 961 Process *process = exe_ctx.GetProcessPtr(); 962 if (target && process) { 963 Process::StopLocker stop_locker; 964 if (stop_locker.TryLock(&process->GetRunLock())) { 965 frame = exe_ctx.GetFramePtr(); 966 if (frame) { 967 frame->DumpUsingSettingsFormat(&strm); 968 } 969 } 970 971 } else 972 strm.PutCString("No value"); 973 974 return true; 975 } 976 977 SBValue SBFrame::EvaluateExpression(const char *expr) { 978 LLDB_INSTRUMENT_VA(this, expr); 979 980 SBValue result; 981 std::unique_lock<std::recursive_mutex> lock; 982 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 983 984 StackFrame *frame = exe_ctx.GetFramePtr(); 985 Target *target = exe_ctx.GetTargetPtr(); 986 if (frame && target) { 987 SBExpressionOptions options; 988 lldb::DynamicValueType fetch_dynamic_value = 989 frame->CalculateTarget()->GetPreferDynamicValue(); 990 options.SetFetchDynamicValue(fetch_dynamic_value); 991 options.SetUnwindOnError(true); 992 options.SetIgnoreBreakpoints(true); 993 if (target->GetLanguage() != eLanguageTypeUnknown) 994 options.SetLanguage(target->GetLanguage()); 995 else 996 options.SetLanguage(frame->GetLanguage()); 997 return EvaluateExpression(expr, options); 998 } else { 999 Status error; 1000 error.SetErrorString("can't evaluate expressions when the " 1001 "process is running."); 1002 ValueObjectSP error_val_sp = ValueObjectConstResult::Create(nullptr, error); 1003 result.SetSP(error_val_sp, false); 1004 } 1005 return result; 1006 } 1007 1008 SBValue 1009 SBFrame::EvaluateExpression(const char *expr, 1010 lldb::DynamicValueType fetch_dynamic_value) { 1011 LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value); 1012 1013 SBExpressionOptions options; 1014 options.SetFetchDynamicValue(fetch_dynamic_value); 1015 options.SetUnwindOnError(true); 1016 options.SetIgnoreBreakpoints(true); 1017 std::unique_lock<std::recursive_mutex> lock; 1018 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1019 1020 StackFrame *frame = exe_ctx.GetFramePtr(); 1021 Target *target = exe_ctx.GetTargetPtr(); 1022 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1023 options.SetLanguage(target->GetLanguage()); 1024 else if (frame) 1025 options.SetLanguage(frame->GetLanguage()); 1026 return EvaluateExpression(expr, options); 1027 } 1028 1029 SBValue SBFrame::EvaluateExpression(const char *expr, 1030 lldb::DynamicValueType fetch_dynamic_value, 1031 bool unwind_on_error) { 1032 LLDB_INSTRUMENT_VA(this, expr, fetch_dynamic_value, unwind_on_error); 1033 1034 SBExpressionOptions options; 1035 std::unique_lock<std::recursive_mutex> lock; 1036 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1037 1038 options.SetFetchDynamicValue(fetch_dynamic_value); 1039 options.SetUnwindOnError(unwind_on_error); 1040 options.SetIgnoreBreakpoints(true); 1041 StackFrame *frame = exe_ctx.GetFramePtr(); 1042 Target *target = exe_ctx.GetTargetPtr(); 1043 if (target && target->GetLanguage() != eLanguageTypeUnknown) 1044 options.SetLanguage(target->GetLanguage()); 1045 else if (frame) 1046 options.SetLanguage(frame->GetLanguage()); 1047 return EvaluateExpression(expr, options); 1048 } 1049 1050 lldb::SBValue SBFrame::EvaluateExpression(const char *expr, 1051 const SBExpressionOptions &options) { 1052 LLDB_INSTRUMENT_VA(this, expr, options); 1053 1054 Log *expr_log = GetLog(LLDBLog::Expressions); 1055 1056 SBValue expr_result; 1057 1058 if (expr == nullptr || expr[0] == '\0') { 1059 return expr_result; 1060 } 1061 1062 ValueObjectSP expr_value_sp; 1063 1064 std::unique_lock<std::recursive_mutex> lock; 1065 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1066 1067 StackFrame *frame = nullptr; 1068 Target *target = exe_ctx.GetTargetPtr(); 1069 Process *process = exe_ctx.GetProcessPtr(); 1070 1071 if (target && process) { 1072 Process::StopLocker stop_locker; 1073 if (stop_locker.TryLock(&process->GetRunLock())) { 1074 frame = exe_ctx.GetFramePtr(); 1075 if (frame) { 1076 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace; 1077 if (target->GetDisplayExpressionsInCrashlogs()) { 1078 StreamString frame_description; 1079 frame->DumpUsingSettingsFormat(&frame_description); 1080 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>( 1081 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value " 1082 "= %u) %s", 1083 expr, options.GetFetchDynamicValue(), 1084 frame_description.GetData()); 1085 } 1086 1087 target->EvaluateExpression(expr, frame, expr_value_sp, options.ref()); 1088 expr_result.SetSP(expr_value_sp, options.GetFetchDynamicValue()); 1089 } 1090 } else { 1091 Status error; 1092 error.SetErrorString("can't evaluate expressions when the " 1093 "process is running."); 1094 expr_value_sp = ValueObjectConstResult::Create(nullptr, error); 1095 expr_result.SetSP(expr_value_sp, false); 1096 } 1097 } else { 1098 Status error; 1099 error.SetErrorString("sbframe object is not valid."); 1100 expr_value_sp = ValueObjectConstResult::Create(nullptr, error); 1101 expr_result.SetSP(expr_value_sp, false); 1102 } 1103 1104 if (expr_result.GetError().Success()) 1105 LLDB_LOGF(expr_log, 1106 "** [SBFrame::EvaluateExpression] Expression result is " 1107 "%s, summary %s **", 1108 expr_result.GetValue(), expr_result.GetSummary()); 1109 else 1110 LLDB_LOGF(expr_log, 1111 "** [SBFrame::EvaluateExpression] Expression evaluation failed: " 1112 "%s **", 1113 expr_result.GetError().GetCString()); 1114 1115 return expr_result; 1116 } 1117 1118 bool SBFrame::IsInlined() { 1119 LLDB_INSTRUMENT_VA(this); 1120 1121 return static_cast<const SBFrame *>(this)->IsInlined(); 1122 } 1123 1124 bool SBFrame::IsInlined() const { 1125 LLDB_INSTRUMENT_VA(this); 1126 1127 std::unique_lock<std::recursive_mutex> lock; 1128 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1129 1130 StackFrame *frame = nullptr; 1131 Target *target = exe_ctx.GetTargetPtr(); 1132 Process *process = exe_ctx.GetProcessPtr(); 1133 if (target && process) { 1134 Process::StopLocker stop_locker; 1135 if (stop_locker.TryLock(&process->GetRunLock())) { 1136 frame = exe_ctx.GetFramePtr(); 1137 if (frame) { 1138 1139 Block *block = frame->GetSymbolContext(eSymbolContextBlock).block; 1140 if (block) 1141 return block->GetContainingInlinedBlock() != nullptr; 1142 } 1143 } 1144 } 1145 return false; 1146 } 1147 1148 bool SBFrame::IsArtificial() { 1149 LLDB_INSTRUMENT_VA(this); 1150 1151 return static_cast<const SBFrame *>(this)->IsArtificial(); 1152 } 1153 1154 bool SBFrame::IsArtificial() const { 1155 LLDB_INSTRUMENT_VA(this); 1156 1157 std::unique_lock<std::recursive_mutex> lock; 1158 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1159 1160 StackFrame *frame = exe_ctx.GetFramePtr(); 1161 if (frame) 1162 return frame->IsArtificial(); 1163 1164 return false; 1165 } 1166 1167 const char *SBFrame::GetFunctionName() { 1168 LLDB_INSTRUMENT_VA(this); 1169 1170 return static_cast<const SBFrame *>(this)->GetFunctionName(); 1171 } 1172 1173 lldb::LanguageType SBFrame::GuessLanguage() const { 1174 LLDB_INSTRUMENT_VA(this); 1175 1176 std::unique_lock<std::recursive_mutex> lock; 1177 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1178 1179 StackFrame *frame = nullptr; 1180 Target *target = exe_ctx.GetTargetPtr(); 1181 Process *process = exe_ctx.GetProcessPtr(); 1182 if (target && process) { 1183 Process::StopLocker stop_locker; 1184 if (stop_locker.TryLock(&process->GetRunLock())) { 1185 frame = exe_ctx.GetFramePtr(); 1186 if (frame) { 1187 return frame->GuessLanguage(); 1188 } 1189 } 1190 } 1191 return eLanguageTypeUnknown; 1192 } 1193 1194 const char *SBFrame::GetFunctionName() const { 1195 LLDB_INSTRUMENT_VA(this); 1196 1197 const char *name = nullptr; 1198 std::unique_lock<std::recursive_mutex> lock; 1199 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1200 1201 StackFrame *frame = nullptr; 1202 Target *target = exe_ctx.GetTargetPtr(); 1203 Process *process = exe_ctx.GetProcessPtr(); 1204 if (target && process) { 1205 Process::StopLocker stop_locker; 1206 if (stop_locker.TryLock(&process->GetRunLock())) { 1207 frame = exe_ctx.GetFramePtr(); 1208 if (frame) { 1209 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1210 eSymbolContextBlock | 1211 eSymbolContextSymbol)); 1212 if (sc.block) { 1213 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1214 if (inlined_block) { 1215 const InlineFunctionInfo *inlined_info = 1216 inlined_block->GetInlinedFunctionInfo(); 1217 name = inlined_info->GetName().AsCString(); 1218 } 1219 } 1220 1221 if (name == nullptr) { 1222 if (sc.function) 1223 name = sc.function->GetName().GetCString(); 1224 } 1225 1226 if (name == nullptr) { 1227 if (sc.symbol) 1228 name = sc.symbol->GetName().GetCString(); 1229 } 1230 } 1231 } 1232 } 1233 return name; 1234 } 1235 1236 const char *SBFrame::GetDisplayFunctionName() { 1237 LLDB_INSTRUMENT_VA(this); 1238 1239 const char *name = nullptr; 1240 1241 std::unique_lock<std::recursive_mutex> lock; 1242 ExecutionContext exe_ctx(m_opaque_sp.get(), lock); 1243 1244 StackFrame *frame = nullptr; 1245 Target *target = exe_ctx.GetTargetPtr(); 1246 Process *process = exe_ctx.GetProcessPtr(); 1247 if (target && process) { 1248 Process::StopLocker stop_locker; 1249 if (stop_locker.TryLock(&process->GetRunLock())) { 1250 frame = exe_ctx.GetFramePtr(); 1251 if (frame) { 1252 SymbolContext sc(frame->GetSymbolContext(eSymbolContextFunction | 1253 eSymbolContextBlock | 1254 eSymbolContextSymbol)); 1255 if (sc.block) { 1256 Block *inlined_block = sc.block->GetContainingInlinedBlock(); 1257 if (inlined_block) { 1258 const InlineFunctionInfo *inlined_info = 1259 inlined_block->GetInlinedFunctionInfo(); 1260 name = inlined_info->GetDisplayName().AsCString(); 1261 } 1262 } 1263 1264 if (name == nullptr) { 1265 if (sc.function) 1266 name = sc.function->GetDisplayName().GetCString(); 1267 } 1268 1269 if (name == nullptr) { 1270 if (sc.symbol) 1271 name = sc.symbol->GetDisplayName().GetCString(); 1272 } 1273 } 1274 } 1275 } 1276 return name; 1277 } 1278