1 //===-- SBFrame.cpp -------------------------------------------------------===//
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
7 //===----------------------------------------------------------------------===//
13 #include "lldb/API/SBFrame.h"
15 #include "lldb/lldb-types.h"
18 #include "lldb/Core/Address.h"
19 #include "lldb/Core/Debugger.h"
20 #include "lldb/Core/ValueObjectRegister.h"
21 #include "lldb/Core/ValueObjectVariable.h"
22 #include "lldb/Core/ValueObjectConstResult.h"
23 #include "lldb/Expression/ExpressionVariable.h"
24 #include "lldb/Expression/UserExpression.h"
25 #include "lldb/Host/Host.h"
26 #include "lldb/Symbol/Block.h"
27 #include "lldb/Symbol/Function.h"
28 #include "lldb/Symbol/Symbol.h"
29 #include "lldb/Symbol/SymbolContext.h"
30 #include "lldb/Symbol/Variable.h"
31 #include "lldb/Symbol/VariableList.h"
32 #include "lldb/Target/ExecutionContext.h"
33 #include "lldb/Target/Process.h"
34 #include "lldb/Target/RegisterContext.h"
35 #include "lldb/Target/StackFrame.h"
36 #include "lldb/Target/StackFrameRecognizer.h"
37 #include "lldb/Target/StackID.h"
38 #include "lldb/Target/Target.h"
39 #include "lldb/Target/Thread.h"
40 #include "lldb/Utility/ConstString.h"
41 #include "lldb/Utility/Instrumentation.h"
42 #include "lldb/Utility/LLDBLog.h"
43 #include "lldb/Utility/Stream.h"
45 #include "lldb/API/SBAddress.h"
46 #include "lldb/API/SBDebugger.h"
47 #include "lldb/API/SBExpressionOptions.h"
48 #include "lldb/API/SBFormat.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"
55 #include "llvm/Support/PrettyStackTrace.h"
58 using namespace lldb_private
;
60 SBFrame::SBFrame() : m_opaque_sp(new ExecutionContextRef()) {
61 LLDB_INSTRUMENT_VA(this);
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
);
69 SBFrame::SBFrame(const SBFrame
&rhs
) {
70 LLDB_INSTRUMENT_VA(this, rhs
);
72 m_opaque_sp
= clone(rhs
.m_opaque_sp
);
75 SBFrame::~SBFrame() = default;
77 const SBFrame
&SBFrame::operator=(const SBFrame
&rhs
) {
78 LLDB_INSTRUMENT_VA(this, rhs
);
81 m_opaque_sp
= clone(rhs
.m_opaque_sp
);
85 StackFrameSP
SBFrame::GetFrameSP() const {
86 return (m_opaque_sp
? m_opaque_sp
->GetFrameSP() : StackFrameSP());
89 void SBFrame::SetFrameSP(const StackFrameSP
&lldb_object_sp
) {
90 return m_opaque_sp
->SetFrameSP(lldb_object_sp
);
93 bool SBFrame::IsValid() const {
94 LLDB_INSTRUMENT_VA(this);
95 return this->operator bool();
97 SBFrame::operator bool() const {
98 LLDB_INSTRUMENT_VA(this);
100 std::unique_lock
<std::recursive_mutex
> lock
;
101 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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;
111 // Without a target & process we can't have a valid stack frame.
115 SBSymbolContext
SBFrame::GetSymbolContext(uint32_t resolve_scope
) const {
116 LLDB_INSTRUMENT_VA(this, resolve_scope
);
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
);
135 SBModule
SBFrame::GetModule() const {
136 LLDB_INSTRUMENT_VA(this);
140 std::unique_lock
<std::recursive_mutex
> lock
;
141 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
151 module_sp
= frame
->GetSymbolContext(eSymbolContextModule
).module_sp
;
152 sb_module
.SetSP(module_sp
);
160 SBCompileUnit
SBFrame::GetCompileUnit() const {
161 LLDB_INSTRUMENT_VA(this);
163 SBCompileUnit sb_comp_unit
;
164 std::unique_lock
<std::recursive_mutex
> lock
;
165 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
176 frame
->GetSymbolContext(eSymbolContextCompUnit
).comp_unit
);
184 SBFunction
SBFrame::GetFunction() const {
185 LLDB_INSTRUMENT_VA(this);
187 SBFunction sb_function
;
188 std::unique_lock
<std::recursive_mutex
> lock
;
189 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
200 frame
->GetSymbolContext(eSymbolContextFunction
).function
);
208 SBSymbol
SBFrame::GetSymbol() const {
209 LLDB_INSTRUMENT_VA(this);
212 std::unique_lock
<std::recursive_mutex
> lock
;
213 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
223 sb_symbol
.reset(frame
->GetSymbolContext(eSymbolContextSymbol
).symbol
);
231 SBBlock
SBFrame::GetBlock() const {
232 LLDB_INSTRUMENT_VA(this);
235 std::unique_lock
<std::recursive_mutex
> lock
;
236 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
246 sb_block
.SetPtr(frame
->GetSymbolContext(eSymbolContextBlock
).block
);
252 SBBlock
SBFrame::GetFrameBlock() const {
253 LLDB_INSTRUMENT_VA(this);
256 std::unique_lock
<std::recursive_mutex
> lock
;
257 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
267 sb_block
.SetPtr(frame
->GetFrameBlock());
273 SBLineEntry
SBFrame::GetLineEntry() const {
274 LLDB_INSTRUMENT_VA(this);
276 SBLineEntry sb_line_entry
;
277 std::unique_lock
<std::recursive_mutex
> lock
;
278 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
288 sb_line_entry
.SetLineEntry(
289 frame
->GetSymbolContext(eSymbolContextLineEntry
).line_entry
);
293 return sb_line_entry
;
296 uint32_t SBFrame::GetFrameID() const {
297 LLDB_INSTRUMENT_VA(this);
299 uint32_t frame_idx
= UINT32_MAX
;
301 std::unique_lock
<std::recursive_mutex
> lock
;
302 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
304 StackFrame
*frame
= exe_ctx
.GetFramePtr();
306 frame_idx
= frame
->GetFrameIndex();
311 lldb::addr_t
SBFrame::GetCFA() const {
312 LLDB_INSTRUMENT_VA(this);
314 std::unique_lock
<std::recursive_mutex
> lock
;
315 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
317 StackFrame
*frame
= exe_ctx
.GetFramePtr();
319 return frame
->GetStackID().GetCallFrameAddress();
320 return LLDB_INVALID_ADDRESS
;
323 addr_t
SBFrame::GetPC() const {
324 LLDB_INSTRUMENT_VA(this);
326 addr_t addr
= LLDB_INVALID_ADDRESS
;
327 std::unique_lock
<std::recursive_mutex
> lock
;
328 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
338 addr
= frame
->GetFrameCodeAddress().GetOpcodeLoadAddress(
339 target
, AddressClass::eCode
);
347 bool SBFrame::SetPC(addr_t new_pc
) {
348 LLDB_INSTRUMENT_VA(this, new_pc
);
350 bool ret_val
= false;
351 std::unique_lock
<std::recursive_mutex
> lock
;
352 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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
);
370 addr_t
SBFrame::GetSP() const {
371 LLDB_INSTRUMENT_VA(this);
373 addr_t addr
= LLDB_INVALID_ADDRESS
;
374 std::unique_lock
<std::recursive_mutex
> lock
;
375 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
393 addr_t
SBFrame::GetFP() const {
394 LLDB_INSTRUMENT_VA(this);
396 addr_t addr
= LLDB_INVALID_ADDRESS
;
397 std::unique_lock
<std::recursive_mutex
> lock
;
398 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
416 SBAddress
SBFrame::GetPCAddress() const {
417 LLDB_INSTRUMENT_VA(this);
420 std::unique_lock
<std::recursive_mutex
> lock
;
421 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
431 sb_addr
.SetAddress(frame
->GetFrameCodeAddress());
437 void SBFrame::Clear() {
438 LLDB_INSTRUMENT_VA(this);
440 m_opaque_sp
->Clear();
443 lldb::SBValue
SBFrame::GetValueForVariablePath(const char *var_path
) {
444 LLDB_INSTRUMENT_VA(this, var_path
);
447 std::unique_lock
<std::recursive_mutex
> lock
;
448 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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
);
460 lldb::SBValue
SBFrame::GetValueForVariablePath(const char *var_path
,
461 DynamicValueType use_dynamic
) {
462 LLDB_INSTRUMENT_VA(this, var_path
, use_dynamic
);
465 if (var_path
== nullptr || var_path
[0] == '\0') {
469 std::unique_lock
<std::recursive_mutex
> lock
;
470 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
482 ValueObjectSP
value_sp(frame
->GetValueForVariableExpressionPath(
483 var_path
, eNoDynamicValues
,
484 StackFrame::eExpressionPathOptionCheckPtrVsMember
|
485 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess
,
487 sb_value
.SetSP(value_sp
, use_dynamic
);
494 SBValue
SBFrame::FindVariable(const char *name
) {
495 LLDB_INSTRUMENT_VA(this, name
);
498 std::unique_lock
<std::recursive_mutex
> lock
;
499 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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
);
511 SBValue
SBFrame::FindVariable(const char *name
,
512 lldb::DynamicValueType use_dynamic
) {
513 LLDB_INSTRUMENT_VA(this, name
, use_dynamic
);
518 if (name
== nullptr || name
[0] == '\0') {
522 ValueObjectSP value_sp
;
523 std::unique_lock
<std::recursive_mutex
> lock
;
524 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
534 value_sp
= frame
->FindVariable(ConstString(name
));
537 sb_value
.SetSP(value_sp
, use_dynamic
);
545 SBValue
SBFrame::FindValue(const char *name
, ValueType value_type
) {
546 LLDB_INSTRUMENT_VA(this, name
, value_type
);
549 std::unique_lock
<std::recursive_mutex
> lock
;
550 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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
);
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
);
568 if (name
== nullptr || name
[0] == '\0') {
572 ValueObjectSP value_sp
;
573 std::unique_lock
<std::recursive_mutex
> lock
;
574 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
584 VariableList variable_list
;
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
593 SymbolContext
sc(frame
->GetSymbolContext(eSymbolContextBlock
));
595 const bool can_create
= true;
596 const bool get_parent_variables
= true;
597 const bool stop_if_block_is_inlined_function
= true;
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
); },
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
,
611 frame_vars
->AppendVariablesIfUnique(variable_list
);
613 ConstString
const_name(name
);
614 VariableSP
variable_sp(
615 variable_list
.FindVariable(const_name
, value_type
));
617 value_sp
= frame
->GetValueObjectForFrameVariable(variable_sp
,
619 sb_value
.SetSP(value_sp
, use_dynamic
);
623 case eValueTypeRegister
: // stack frame register value
625 RegisterContextSP
reg_ctx(frame
->GetRegisterContext());
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
);
635 case eValueTypeRegisterSet
: // A collection of stack frame register
638 RegisterContextSP
reg_ctx(frame
->GetRegisterContext());
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
);
644 (llvm::StringRef(reg_set
->name
).equals_insensitive(name
) ||
645 llvm::StringRef(reg_set
->short_name
)
646 .equals_insensitive(name
))) {
648 ValueObjectRegisterSet::Create(frame
, reg_ctx
, set_idx
);
649 sb_value
.SetSP(value_sp
);
656 case eValueTypeConstResult
: // constant result variables
658 ConstString
const_name(name
);
659 ExpressionVariableSP
expr_var_sp(
660 target
->GetPersistentVariable(const_name
));
662 value_sp
= expr_var_sp
->GetValueObject();
663 sb_value
.SetSP(value_sp
, use_dynamic
);
677 bool SBFrame::IsEqual(const SBFrame
&that
) const {
678 LLDB_INSTRUMENT_VA(this, that
);
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());
685 bool SBFrame::operator==(const SBFrame
&rhs
) const {
686 LLDB_INSTRUMENT_VA(this, rhs
);
691 bool SBFrame::operator!=(const SBFrame
&rhs
) const {
692 LLDB_INSTRUMENT_VA(this, rhs
);
694 return !IsEqual(rhs
);
697 SBThread
SBFrame::GetThread() const {
698 LLDB_INSTRUMENT_VA(this);
700 std::unique_lock
<std::recursive_mutex
> lock
;
701 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
703 ThreadSP
thread_sp(exe_ctx
.GetThreadSP());
704 SBThread
sb_thread(thread_sp
);
709 const char *SBFrame::Disassemble() const {
710 LLDB_INSTRUMENT_VA(this);
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
)
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();
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
);
732 SBValueList value_list
;
733 std::unique_lock
<std::recursive_mutex
> lock
;
734 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
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
);
752 value_list
= GetVariables(options
);
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
,
763 std::unique_lock
<std::recursive_mutex
> lock
;
764 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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
);
779 SBValueList
SBFrame::GetVariables(const lldb::SBVariablesOptions
&options
) {
780 LLDB_INSTRUMENT_VA(this, options
);
782 SBValueList value_list
;
783 std::unique_lock
<std::recursive_mutex
> lock
;
784 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
786 StackFrame
*frame
= nullptr;
787 Target
*target
= exe_ctx
.GetTargetPtr();
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();
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();
807 Debugger
&dbg
= process
->GetTarget().GetDebugger();
808 VariableList
*variable_list
= nullptr;
810 variable_list
= frame
->GetVariableList(true, &var_error
);
811 if (var_error
.Fail())
812 value_list
.SetError(var_error
);
814 const size_t num_variables
= variable_list
->GetSize();
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
))
824 bool add_variable
= false;
825 switch (variable_sp
->GetScope()) {
826 case eValueTypeVariableGlobal
:
827 case eValueTypeVariableStatic
:
828 case eValueTypeVariableThreadLocal
:
829 add_variable
= statics
;
832 case eValueTypeVariableArgument
:
833 add_variable
= arguments
;
836 case eValueTypeVariableLocal
:
837 add_variable
= locals
;
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
);
850 if (in_scope_only
&& !variable_sp
->IsInScope(frame
))
853 ValueObjectSP
valobj_sp(frame
->GetValueObjectForFrameVariable(
854 variable_sp
, eNoDynamicValues
));
856 if (!include_runtime_support_values
&& valobj_sp
!= nullptr &&
857 valobj_sp
->IsRuntimeSupportValue())
861 value_sb
.SetSP(valobj_sp
, use_dynamic
);
862 value_list
.Append(value_sb
);
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()) {
877 value_sb
.SetSP(rec_value_sp
, use_dynamic
);
878 value_list
.Append(value_sb
);
890 SBValueList
SBFrame::GetRegisters() {
891 LLDB_INSTRUMENT_VA(this);
893 SBValueList value_list
;
894 std::unique_lock
<std::recursive_mutex
> lock
;
895 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
905 RegisterContextSP
reg_ctx(frame
->GetRegisterContext());
907 const uint32_t num_sets
= reg_ctx
->GetRegisterSetCount();
908 for (uint32_t set_idx
= 0; set_idx
< num_sets
; ++set_idx
) {
910 ValueObjectRegisterSet::Create(frame
, reg_ctx
, set_idx
));
920 SBValue
SBFrame::FindRegister(const char *name
) {
921 LLDB_INSTRUMENT_VA(this, name
);
924 ValueObjectSP value_sp
;
925 std::unique_lock
<std::recursive_mutex
> lock
;
926 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
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();
936 RegisterContextSP
reg_ctx(frame
->GetRegisterContext());
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
);
951 SBError
SBFrame::GetDescriptionWithFormat(const SBFormat
&format
,
953 Stream
&strm
= output
.ref();
955 std::unique_lock
<std::recursive_mutex
> lock
;
956 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
958 StackFrame
*frame
= nullptr;
959 Target
*target
= exe_ctx
.GetTargetPtr();
960 Process
*process
= exe_ctx
.GetProcessPtr();
964 error
.SetErrorString("The provided SBFormat object is invalid");
968 if (target
&& process
) {
969 Process::StopLocker stop_locker
;
970 if (stop_locker
.TryLock(&process
->GetRunLock())) {
971 frame
= exe_ctx
.GetFramePtr();
973 frame
->DumpUsingFormat(strm
, format
.GetFormatEntrySP().get())) {
978 error
.SetErrorStringWithFormat(
979 "It was not possible to generate a frame "
980 "description with the given format string '%s'",
981 format
.GetFormatEntrySP()->string
.c_str());
985 bool SBFrame::GetDescription(SBStream
&description
) {
986 LLDB_INSTRUMENT_VA(this, description
);
988 Stream
&strm
= description
.ref();
990 std::unique_lock
<std::recursive_mutex
> lock
;
991 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
994 Target
*target
= exe_ctx
.GetTargetPtr();
995 Process
*process
= exe_ctx
.GetProcessPtr();
996 if (target
&& process
) {
997 Process::StopLocker stop_locker
;
998 if (stop_locker
.TryLock(&process
->GetRunLock())) {
999 frame
= exe_ctx
.GetFramePtr();
1001 frame
->DumpUsingSettingsFormat(&strm
);
1006 strm
.PutCString("No value");
1011 SBValue
SBFrame::EvaluateExpression(const char *expr
) {
1012 LLDB_INSTRUMENT_VA(this, expr
);
1015 std::unique_lock
<std::recursive_mutex
> lock
;
1016 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1018 StackFrame
*frame
= exe_ctx
.GetFramePtr();
1019 Target
*target
= exe_ctx
.GetTargetPtr();
1020 if (frame
&& target
) {
1021 SBExpressionOptions options
;
1022 lldb::DynamicValueType fetch_dynamic_value
=
1023 frame
->CalculateTarget()->GetPreferDynamicValue();
1024 options
.SetFetchDynamicValue(fetch_dynamic_value
);
1025 options
.SetUnwindOnError(true);
1026 options
.SetIgnoreBreakpoints(true);
1027 if (target
->GetLanguage() != eLanguageTypeUnknown
)
1028 options
.SetLanguage(target
->GetLanguage());
1030 options
.SetLanguage(frame
->GetLanguage());
1031 return EvaluateExpression(expr
, options
);
1034 error
.SetErrorString("can't evaluate expressions when the "
1035 "process is running.");
1036 ValueObjectSP error_val_sp
= ValueObjectConstResult::Create(nullptr, error
);
1037 result
.SetSP(error_val_sp
, false);
1043 SBFrame::EvaluateExpression(const char *expr
,
1044 lldb::DynamicValueType fetch_dynamic_value
) {
1045 LLDB_INSTRUMENT_VA(this, expr
, fetch_dynamic_value
);
1047 SBExpressionOptions options
;
1048 options
.SetFetchDynamicValue(fetch_dynamic_value
);
1049 options
.SetUnwindOnError(true);
1050 options
.SetIgnoreBreakpoints(true);
1051 std::unique_lock
<std::recursive_mutex
> lock
;
1052 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1054 StackFrame
*frame
= exe_ctx
.GetFramePtr();
1055 Target
*target
= exe_ctx
.GetTargetPtr();
1056 if (target
&& target
->GetLanguage() != eLanguageTypeUnknown
)
1057 options
.SetLanguage(target
->GetLanguage());
1059 options
.SetLanguage(frame
->GetLanguage());
1060 return EvaluateExpression(expr
, options
);
1063 SBValue
SBFrame::EvaluateExpression(const char *expr
,
1064 lldb::DynamicValueType fetch_dynamic_value
,
1065 bool unwind_on_error
) {
1066 LLDB_INSTRUMENT_VA(this, expr
, fetch_dynamic_value
, unwind_on_error
);
1068 SBExpressionOptions options
;
1069 std::unique_lock
<std::recursive_mutex
> lock
;
1070 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1072 options
.SetFetchDynamicValue(fetch_dynamic_value
);
1073 options
.SetUnwindOnError(unwind_on_error
);
1074 options
.SetIgnoreBreakpoints(true);
1075 StackFrame
*frame
= exe_ctx
.GetFramePtr();
1076 Target
*target
= exe_ctx
.GetTargetPtr();
1077 if (target
&& target
->GetLanguage() != eLanguageTypeUnknown
)
1078 options
.SetLanguage(target
->GetLanguage());
1080 options
.SetLanguage(frame
->GetLanguage());
1081 return EvaluateExpression(expr
, options
);
1084 lldb::SBValue
SBFrame::EvaluateExpression(const char *expr
,
1085 const SBExpressionOptions
&options
) {
1086 LLDB_INSTRUMENT_VA(this, expr
, options
);
1088 Log
*expr_log
= GetLog(LLDBLog::Expressions
);
1090 SBValue expr_result
;
1092 if (expr
== nullptr || expr
[0] == '\0') {
1096 ValueObjectSP expr_value_sp
;
1098 std::unique_lock
<std::recursive_mutex
> lock
;
1099 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1101 StackFrame
*frame
= nullptr;
1102 Target
*target
= exe_ctx
.GetTargetPtr();
1103 Process
*process
= exe_ctx
.GetProcessPtr();
1105 if (target
&& process
) {
1106 Process::StopLocker stop_locker
;
1107 if (stop_locker
.TryLock(&process
->GetRunLock())) {
1108 frame
= exe_ctx
.GetFramePtr();
1110 std::unique_ptr
<llvm::PrettyStackTraceFormat
> stack_trace
;
1111 if (target
->GetDisplayExpressionsInCrashlogs()) {
1112 StreamString frame_description
;
1113 frame
->DumpUsingSettingsFormat(&frame_description
);
1114 stack_trace
= std::make_unique
<llvm::PrettyStackTraceFormat
>(
1115 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1117 expr
, options
.GetFetchDynamicValue(),
1118 frame_description
.GetData());
1121 target
->EvaluateExpression(expr
, frame
, expr_value_sp
, options
.ref());
1122 expr_result
.SetSP(expr_value_sp
, options
.GetFetchDynamicValue());
1126 error
.SetErrorString("can't evaluate expressions when the "
1127 "process is running.");
1128 expr_value_sp
= ValueObjectConstResult::Create(nullptr, error
);
1129 expr_result
.SetSP(expr_value_sp
, false);
1133 error
.SetErrorString("sbframe object is not valid.");
1134 expr_value_sp
= ValueObjectConstResult::Create(nullptr, error
);
1135 expr_result
.SetSP(expr_value_sp
, false);
1138 if (expr_result
.GetError().Success())
1140 "** [SBFrame::EvaluateExpression] Expression result is "
1141 "%s, summary %s **",
1142 expr_result
.GetValue(), expr_result
.GetSummary());
1145 "** [SBFrame::EvaluateExpression] Expression evaluation failed: "
1147 expr_result
.GetError().GetCString());
1152 bool SBFrame::IsInlined() {
1153 LLDB_INSTRUMENT_VA(this);
1155 return static_cast<const SBFrame
*>(this)->IsInlined();
1158 bool SBFrame::IsInlined() const {
1159 LLDB_INSTRUMENT_VA(this);
1161 std::unique_lock
<std::recursive_mutex
> lock
;
1162 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1164 StackFrame
*frame
= nullptr;
1165 Target
*target
= exe_ctx
.GetTargetPtr();
1166 Process
*process
= exe_ctx
.GetProcessPtr();
1167 if (target
&& process
) {
1168 Process::StopLocker stop_locker
;
1169 if (stop_locker
.TryLock(&process
->GetRunLock())) {
1170 frame
= exe_ctx
.GetFramePtr();
1173 Block
*block
= frame
->GetSymbolContext(eSymbolContextBlock
).block
;
1175 return block
->GetContainingInlinedBlock() != nullptr;
1182 bool SBFrame::IsArtificial() {
1183 LLDB_INSTRUMENT_VA(this);
1185 return static_cast<const SBFrame
*>(this)->IsArtificial();
1188 bool SBFrame::IsArtificial() const {
1189 LLDB_INSTRUMENT_VA(this);
1191 std::unique_lock
<std::recursive_mutex
> lock
;
1192 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1194 StackFrame
*frame
= exe_ctx
.GetFramePtr();
1196 return frame
->IsArtificial();
1201 const char *SBFrame::GetFunctionName() {
1202 LLDB_INSTRUMENT_VA(this);
1204 return static_cast<const SBFrame
*>(this)->GetFunctionName();
1207 lldb::LanguageType
SBFrame::GuessLanguage() const {
1208 LLDB_INSTRUMENT_VA(this);
1210 std::unique_lock
<std::recursive_mutex
> lock
;
1211 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1213 StackFrame
*frame
= nullptr;
1214 Target
*target
= exe_ctx
.GetTargetPtr();
1215 Process
*process
= exe_ctx
.GetProcessPtr();
1216 if (target
&& process
) {
1217 Process::StopLocker stop_locker
;
1218 if (stop_locker
.TryLock(&process
->GetRunLock())) {
1219 frame
= exe_ctx
.GetFramePtr();
1221 return frame
->GuessLanguage();
1225 return eLanguageTypeUnknown
;
1228 const char *SBFrame::GetFunctionName() const {
1229 LLDB_INSTRUMENT_VA(this);
1231 const char *name
= nullptr;
1232 std::unique_lock
<std::recursive_mutex
> lock
;
1233 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1235 StackFrame
*frame
= nullptr;
1236 Target
*target
= exe_ctx
.GetTargetPtr();
1237 Process
*process
= exe_ctx
.GetProcessPtr();
1238 if (target
&& process
) {
1239 Process::StopLocker stop_locker
;
1240 if (stop_locker
.TryLock(&process
->GetRunLock())) {
1241 frame
= exe_ctx
.GetFramePtr();
1243 SymbolContext
sc(frame
->GetSymbolContext(eSymbolContextFunction
|
1244 eSymbolContextBlock
|
1245 eSymbolContextSymbol
));
1247 Block
*inlined_block
= sc
.block
->GetContainingInlinedBlock();
1248 if (inlined_block
) {
1249 const InlineFunctionInfo
*inlined_info
=
1250 inlined_block
->GetInlinedFunctionInfo();
1251 name
= inlined_info
->GetName().AsCString();
1255 if (name
== nullptr) {
1257 name
= sc
.function
->GetName().GetCString();
1260 if (name
== nullptr) {
1262 name
= sc
.symbol
->GetName().GetCString();
1270 const char *SBFrame::GetDisplayFunctionName() {
1271 LLDB_INSTRUMENT_VA(this);
1273 const char *name
= nullptr;
1275 std::unique_lock
<std::recursive_mutex
> lock
;
1276 ExecutionContext
exe_ctx(m_opaque_sp
.get(), lock
);
1278 StackFrame
*frame
= nullptr;
1279 Target
*target
= exe_ctx
.GetTargetPtr();
1280 Process
*process
= exe_ctx
.GetProcessPtr();
1281 if (target
&& process
) {
1282 Process::StopLocker stop_locker
;
1283 if (stop_locker
.TryLock(&process
->GetRunLock())) {
1284 frame
= exe_ctx
.GetFramePtr();
1286 SymbolContext
sc(frame
->GetSymbolContext(eSymbolContextFunction
|
1287 eSymbolContextBlock
|
1288 eSymbolContextSymbol
));
1290 Block
*inlined_block
= sc
.block
->GetContainingInlinedBlock();
1291 if (inlined_block
) {
1292 const InlineFunctionInfo
*inlined_info
=
1293 inlined_block
->GetInlinedFunctionInfo();
1294 name
= inlined_info
->GetDisplayName().AsCString();
1298 if (name
== nullptr) {
1300 name
= sc
.function
->GetDisplayName().GetCString();
1303 if (name
== nullptr) {
1305 name
= sc
.symbol
->GetDisplayName().GetCString();