56#include "llvm/Support/PrettyStackTrace.h"
96 return this->
operator bool();
98SBFrame::operator
bool()
const {
100 llvm::Expected<StoppedExecutionContext> exe_ctx =
115 llvm::Expected<StoppedExecutionContext> exe_ctx =
122 SymbolContextItem scope =
static_cast<SymbolContextItem
>(resolve_scope);
123 if (
StackFrame *frame = exe_ctx->GetFramePtr())
124 sb_sym_ctx = frame->GetSymbolContext(scope);
132 llvm::Expected<StoppedExecutionContext> exe_ctx =
146 sb_module.
SetSP(module_sp);
153 llvm::Expected<StoppedExecutionContext> exe_ctx =
160 if (
StackFrame *frame = exe_ctx->GetFramePtr())
162 frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
169 llvm::Expected<StoppedExecutionContext> exe_ctx =
176 if (
StackFrame *frame = exe_ctx->GetFramePtr())
177 return SBFunction(frame->GetSymbolContext(eSymbolContextFunction).function);
184 llvm::Expected<StoppedExecutionContext> exe_ctx =
191 if (
StackFrame *frame = exe_ctx->GetFramePtr())
192 return SBSymbol(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
199 llvm::Expected<StoppedExecutionContext> exe_ctx =
206 if (
StackFrame *frame = exe_ctx->GetFramePtr())
207 return SBBlock(frame->GetSymbolContext(eSymbolContextBlock).block);
214 llvm::Expected<StoppedExecutionContext> exe_ctx =
221 if (
StackFrame *frame = exe_ctx->GetFramePtr())
222 return SBBlock(frame->GetFrameBlock());
229 llvm::Expected<StoppedExecutionContext> exe_ctx =
236 if (
StackFrame *frame = exe_ctx->GetFramePtr())
238 &frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
245 constexpr uint32_t error_frame_idx =
UINT32_MAX;
247 llvm::Expected<StoppedExecutionContext> exe_ctx =
251 return error_frame_idx;
254 if (
StackFrame *frame = exe_ctx->GetFramePtr())
255 return frame->GetFrameIndex();
256 return error_frame_idx;
262 llvm::Expected<StoppedExecutionContext> exe_ctx =
269 if (
StackFrame *frame = exe_ctx->GetFramePtr())
270 return frame->GetStackID().GetCallFrameAddressWithoutMetadata();
278 llvm::Expected<StoppedExecutionContext> exe_ctx =
285 Target *target = exe_ctx->GetTargetPtr();
286 if (
StackFrame *frame = exe_ctx->GetFramePtr())
296 constexpr bool error_ret_val =
false;
297 llvm::Expected<StoppedExecutionContext> exe_ctx =
301 return error_ret_val;
304 if (
StackFrame *frame = exe_ctx->GetFramePtr())
306 return reg_ctx_sp->SetPC(new_pc);
308 return error_ret_val;
314 llvm::Expected<StoppedExecutionContext> exe_ctx =
321 if (
StackFrame *frame = exe_ctx->GetFramePtr())
323 return reg_ctx_sp->GetSP();
331 llvm::Expected<StoppedExecutionContext> exe_ctx =
338 if (
StackFrame *frame = exe_ctx->GetFramePtr())
340 return reg_ctx_sp->GetFP();
348 llvm::Expected<StoppedExecutionContext> exe_ctx =
355 if (
StackFrame *frame = exe_ctx->GetFramePtr())
356 return SBAddress(frame->GetFrameCodeAddress());
371 llvm::Expected<StoppedExecutionContext> exe_ctx =
378 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
380 frame->CalculateTarget()->GetPreferDynamicValue();
392 if (var_path ==
nullptr || var_path[0] ==
'\0') {
396 llvm::Expected<StoppedExecutionContext> exe_ctx =
403 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
406 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
410 var_sp,
error, mode));
411 sb_value.
SetSP(value_sp, use_dynamic);
419 llvm::Expected<StoppedExecutionContext> exe_ctx =
426 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
428 frame->CalculateTarget()->GetPreferDynamicValue();
441 if (name ==
nullptr || name[0] ==
'\0') {
445 llvm::Expected<StoppedExecutionContext> exe_ctx =
452 if (
StackFrame *frame = exe_ctx->GetFramePtr())
454 sb_value.
SetSP(value_sp, use_dynamic);
463 llvm::Expected<StoppedExecutionContext> exe_ctx =
470 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
472 frame->CalculateTarget()->GetPreferDynamicValue();
473 value =
FindValue(name, value_type, use_dynamic);
484 if (name ==
nullptr || name[0] ==
'\0') {
489 llvm::Expected<StoppedExecutionContext> exe_ctx =
503 switch (value_type) {
511 const bool can_create =
true;
512 const bool get_parent_variables =
true;
513 const bool stop_if_block_is_inlined_function =
true;
517 can_create, get_parent_variables, stop_if_block_is_inlined_function,
521 const bool get_file_globals =
true;
532 sb_value.
SetSP(value_sp, use_dynamic);
538 if (
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name)) {
540 sb_value.
SetSP(value_sp);
548 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
549 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
550 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
552 (llvm::StringRef(reg_set->
name).equals_insensitive(name) ||
553 llvm::StringRef(reg_set->
short_name).equals_insensitive(name))) {
555 sb_value.
SetSP(value_sp);
564 Target *target = exe_ctx->GetTargetPtr();
567 value_sp = expr_var_sp->GetValueObject();
568 sb_value.
SetSP(value_sp, use_dynamic);
584 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
602 llvm::Expected<StoppedExecutionContext> exe_ctx =
609 ThreadSP thread_sp(exe_ctx->GetThreadSP());
618 llvm::Expected<StoppedExecutionContext> exe_ctx =
625 if (
auto *frame = exe_ctx->GetFramePtr())
632 bool in_scope_only) {
636 llvm::Expected<StoppedExecutionContext> exe_ctx =
643 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
644 Target *target = exe_ctx->GetTargetPtr();
646 frame->CalculateTarget()->GetPreferDynamicValue();
647 const bool include_runtime_support_values =
664 bool statics,
bool in_scope_only,
669 llvm::Expected<StoppedExecutionContext> exe_ctx =
676 Target *target = exe_ctx->GetTargetPtr();
677 const bool include_runtime_support_values =
724 const bool include_runtime_support_values =
731 std::set<VariableSP> variable_set;
735 const size_t num_variables = variable_list->
GetSize();
736 size_t num_produced = 0;
737 for (
const VariableSP &variable_sp : *variable_list) {
744 "Interrupted getting frame variables with {0} of {1} "
746 num_produced, num_variables))
750 if (variable_set.insert(variable_sp).second ==
false)
752 if (in_scope_only && !variable_sp->IsInScope(&frame))
758 if (!include_runtime_support_values && valobj_sp !=
nullptr &&
759 valobj_sp->IsRuntimeSupportValue())
762 value_list.
Append(to_sbvalue(valobj_sp, use_dynamic));
771static llvm::SmallVector<ValueObjectSP>
777 if (!recognized_frame)
781 recognized_frame->GetRecognizedArguments();
782 if (!recognized_arg_list)
785 return llvm::to_vector(recognized_arg_list->GetObjects());
791 llvm::Expected<StoppedExecutionContext> exe_ctx =
802 auto valobj_to_sbvalue = [](
ValueObjectSP valobj,
bool use_dynamic) {
804 value_sb.
SetSP(valobj, use_dynamic);
808 std::pair<WasInterrupted, Status> fetch_result =
810 exe_ctx->GetTargetPtr()->GetDebugger(),
812 if (fetch_result.second.Fail())
813 value_list.
SetError(std::move(fetch_result.second));
820 options, *frame,
SBTarget(exe_ctx->GetTargetSP()));
823 value_sb.
SetSP(arg, use_dynamic);
824 value_list.
Append(value_sb);
832 llvm::Expected<StoppedExecutionContext> exe_ctx =
848 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
849 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
859 llvm::Expected<StoppedExecutionContext> exe_ctx =
874 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name);
880 result.
SetSP(value_sp);
889 llvm::Expected<StoppedExecutionContext> exe_ctx =
897 error.SetErrorString(
"The provided SBFormat object is invalid");
901 if (
StackFrame *frame = exe_ctx->GetFramePtr();
904 error.SetErrorStringWithFormat(
905 "It was not possible to generate a frame "
906 "description with the given format string '%s'",
916 llvm::Expected<StoppedExecutionContext> exe_ctx =
920 strm.
PutCString(
"Error: process is not stopped.");
924 if (
StackFrame *frame = exe_ctx->GetFramePtr())
933 llvm::Expected<StoppedExecutionContext> exe_ctx =
949 Target *target = exe_ctx->GetTargetPtr();
951 if (!language && frame)
966 llvm::Expected<StoppedExecutionContext> exe_ctx =
974 Target *target = exe_ctx->GetTargetPtr();
976 if (!language && frame)
984 bool unwind_on_error) {
988 llvm::Expected<StoppedExecutionContext> exe_ctx =
999 Target *target = exe_ctx->GetTargetPtr();
1001 if (!language && frame)
1009 "process is running.");
1013 expr_result.
SetSP(expr_value_sp,
false);
1021 auto LogResult = [](
SBValue expr_result) {
1023 if (expr_result.GetError().Success())
1025 "** [SBFrame::EvaluateExpression] Expression result is "
1026 "%s, summary %s **",
1027 expr_result.GetValue(), expr_result.GetSummary());
1031 "** [SBFrame::EvaluateExpression] Expression evaluation failed: "
1033 expr_result.GetError().GetCString());
1036 if (expr ==
nullptr || expr[0] ==
'\0') {
1040 llvm::Expected<StoppedExecutionContext> exe_ctx =
1045 LogResult(error_result);
1046 return error_result;
1053 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1054 Target *target = exe_ctx->GetTargetPtr();
1058 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1059 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1069 LogResult(expr_result);
1078 llvm::Expected<StoppedExecutionContext> exe_ctx =
1102 llvm::Expected<StoppedExecutionContext> exe_ctx =
1109 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1123 llvm::Expected<StoppedExecutionContext> exe_ctx =
1130 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1139 llvm::Expected<StoppedExecutionContext> exe_ctx =
1146 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1155 llvm::Expected<StoppedExecutionContext> exe_ctx =
1162 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1177 llvm::Expected<StoppedExecutionContext> exe_ctx =
1184 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1192 llvm::Expected<StoppedExecutionContext> exe_ctx =
1199 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1207 llvm::Expected<StoppedExecutionContext> exe_ctx =
1214 if (
StackFrame *frame = exe_ctx->GetFramePtr())
static llvm::raw_ostream & error(Stream &strm)
#define INTERRUPT_REQUESTED(debugger,...)
This handy define will keep you from having to generate a report for the interruption by hand.
#define LLDB_INSTRUMENT_VA(...)
#define LLDB_LOGF(log,...)
#define LLDB_LOG_ERROR(log, error,...)
static std::pair< WasInterrupted, Status > FetchVariablesUnlessInterrupted(const lldb::SBVariablesOptions &options, StackFrame &frame, SBValueList &value_list, Debugger &dbg, std::function< SBValue(ValueObjectSP, bool)> to_sbvalue)
Populates value_list with the variables from frame according to options.
static bool IsInRequestedScope(bool statics, bool arguments, bool locals, Variable &var)
Returns true if the variable is in any of the requested scopes.
static llvm::SmallVector< ValueObjectSP > FetchRecognizedArguments(const SBVariablesOptions &options, StackFrame &frame, SBTarget target)
Populates value_list with recognized arguments of frame according to options.
void SetFetchDynamicValue(lldb::DynamicValueType dynamic=lldb::eDynamicCanRunTarget)
void SetLanguage(lldb::LanguageType language)
lldb_private::EvaluateExpressionOptions & ref() const
void SetIgnoreBreakpoints(bool ignore=true)
void SetUnwindOnError(bool unwind=true)
lldb::DynamicValueType GetFetchDynamicValue() const
lldb::ExecutionContextRefSP m_opaque_sp
lldb::addr_t GetPC() const
const char * GetFunctionName()
Get the appropriate function name for this frame.
lldb::SBValue FindValue(const char *name, ValueType value_type)
Find variables, register sets, registers, or persistent variables using the frame as the scope.
lldb::SBSymbolContext GetSymbolContext(uint32_t resolve_scope) const
SBError GetDescriptionWithFormat(const SBFormat &format, SBStream &output)
Similar to GetDescription() but the format of the description can be configured via the format parame...
lldb::SBValue FindRegister(const char *name)
bool SetPC(lldb::addr_t new_pc)
lldb::SBValue FindVariable(const char *var_name)
The version that doesn't supply a 'use_dynamic' value will use the target's default.
const char * GetDisplayFunctionName()
bool IsInlined()
Return true if this frame represents an inlined function.
bool operator==(const lldb::SBFrame &rhs) const
lldb::addr_t GetCFA() const
lldb::addr_t GetFP() const
const lldb::SBFrame & operator=(const lldb::SBFrame &rhs)
lldb::SBValue GetValueForVariablePath(const char *var_expr_cstr, DynamicValueType use_dynamic, lldb::DILMode mode=lldb::eDILModeFull)
static SBValue CreateProcessIsRunningExprEvalError()
Return an SBValue containing an error message that warns the process is not currently stopped.
lldb::SBLineEntry GetLineEntry() const
lldb::SBValue EvaluateExpression(const char *expr)
The version that doesn't supply a 'use_dynamic' value will use the target's default.
lldb::SBCompileUnit GetCompileUnit() const
uint32_t GetFrameID() const
lldb::SBAddress GetPCAddress() const
lldb::SBFunction GetFunction() const
lldb::SBBlock GetBlock() const
Gets the deepest block that contains the frame PC.
lldb::SBValueList GetVariables(bool arguments, bool locals, bool statics, bool in_scope_only)
The version that doesn't supply a 'use_dynamic' value will use the target's default.
bool IsEqual(const lldb::SBFrame &that) const
const char * Disassemble() const
void SetFrameSP(const lldb::StackFrameSP &lldb_object_sp)
lldb::SBThread GetThread() const
lldb::SBValueList GetRegisters()
lldb::LanguageType GuessLanguage() const
lldb::SBBlock GetFrameBlock() const
Gets the lexical block that defines the stack frame.
lldb::addr_t GetSP() const
lldb::StackFrameSP GetFrameSP() const
bool IsHidden() const
Return whether a frame recognizer decided this frame should not be displayes in backtraces etc.
SBStructuredData GetLanguageSpecificData() const
Language plugins can use this API to report language-specific runtime information about this compile ...
lldb::SBSymbol GetSymbol() const
lldb::SBModule GetModule() const
bool GetDescription(lldb::SBStream &description)
bool operator!=(const lldb::SBFrame &rhs) const
void SetSP(const ModuleSP &module_sp)
lldb_private::Stream & ref()
StructuredDataImplUP m_impl_up
void Append(const lldb::SBValue &val_obj)
void SetError(lldb_private::Status &&status)
void SetSP(const lldb::ValueObjectSP &sp)
void SetIncludeRuntimeSupportValues(bool)
bool GetIncludeRuntimeSupportValues() const
void SetIncludeLocals(bool)
void SetIncludeArguments(bool)
lldb::DynamicValueType GetUseDynamic() const
bool GetIncludeArguments() const
void SetInScopeOnly(bool)
bool GetIncludeStatics() const
void SetIncludeStatics(bool)
void SetUseDynamic(lldb::DynamicValueType)
bool GetIncludeLocals() const
bool GetInScopeOnly() const
bool GetIncludeRecognizedArguments(const lldb::SBTarget &) const
uint32_t AppendVariables(bool can_create, bool get_parent_variables, bool stop_if_block_is_inlined_function, const std::function< bool(Variable *)> &filter, VariableList *variable_list)
Appends the variables from this block, and optionally from all parent blocks, to variable_list.
A uniqued constant string class.
const char * GetCString() const
Get the string value as a C string.
A class to manage flag bits.
Execution context objects refer to objects in the execution of the program that is being debugged.
This base class provides an interface to stack frames.
@ eExpressionPathOptionCheckPtrVsMember
@ eExpressionPathOptionsAllowDirectIVarAccess
virtual const char * GetFunctionName()
Get the frame's demangled name.
virtual bool IsHidden()
Query whether this frame should be hidden from backtraces.
virtual VariableList * GetVariableList(bool get_file_globals, Status *error_ptr)
Retrieve the list of variables whose scope either:
virtual bool IsSynthetic() const
Query whether this frame is synthetic.
virtual bool IsInlined()
Query whether this frame is a concrete frame on the call stack, or if it is an inlined frame derived ...
virtual SourceLanguage GuessLanguage()
Similar to GetLanguage(), but is allowed to take a potentially incorrect guess if exact information i...
virtual lldb::RegisterContextSP GetRegisterContext()
Get the RegisterContext for this frame, if possible.
virtual StructuredData::ObjectSP GetLanguageSpecificData()
Language plugins can use this API to report language-specific runtime information about this compile ...
virtual SourceLanguage GetLanguage()
Query this frame to determine what the default language should be when parsing expressions given the ...
virtual lldb::ValueObjectSP GetValueObjectForFrameVariable(const lldb::VariableSP &variable_sp, lldb::DynamicValueType use_dynamic)
Create a ValueObject for a given Variable in this StackFrame.
virtual const SymbolContext & GetSymbolContext(lldb::SymbolContextItem resolve_scope)
Provide a SymbolContext for this StackFrame's current pc value.
virtual const char * GetDisplayFunctionName()
Get the frame's demangled display name.
virtual bool IsArtificial() const
Query whether this frame is artificial (e.g a synthesized result of inferring missing tail call frame...
virtual void DumpUsingSettingsFormat(Stream *strm, bool show_unique=false, const llvm::StringRef frame_marker="")
Print a description for this frame using the frame-format formatter settings.
virtual bool DumpUsingFormat(Stream &strm, const lldb_private::FormatEntity::Entry *format, llvm::StringRef frame_marker={})
Print a description of this frame using the provided frame format.
virtual lldb::RecognizedStackFrameSP GetRecognizedFrame()
lldb::TargetSP CalculateTarget() override
static Status FromErrorString(const char *str)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
const char * GetData() const
A stream class that can stream formatted output to a file.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
std::shared_ptr< Object > ObjectSP
Defines a symbol context baton that can be handed other debug core functions.
Block * block
The Block for a given query.
lldb::ModuleSP module_sp
The Module for a given query.
bool GetDisplayRuntimeSupportValues() const
SourceLanguage GetLanguage() const
bool GetDisplayExpressionsInCrashlogs() const
lldb::addr_t GetOpcodeLoadAddress(lldb::addr_t load_addr, AddressClass addr_class=AddressClass::eInvalid) const
Get load_addr as an opcode for this target.
lldb::ExpressionVariableSP GetPersistentVariable(ConstString name)
lldb::ExpressionResults EvaluateExpression(llvm::StringRef expression, ExecutionContextScope *exe_scope, lldb::ValueObjectSP &result_valobj_sp, const EvaluateExpressionOptions &options=EvaluateExpressionOptions(), std::string *fixed_expression=nullptr, ValueObject *ctx_obj=nullptr)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::ByteOrder byte_order, uint32_t addr_byte_size, lldb::addr_t address=LLDB_INVALID_ADDRESS)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, uint32_t set_idx)
static lldb::ValueObjectSP Create(ExecutionContextScope *exe_scope, lldb::RegisterContextSP ®_ctx_sp, const RegisterInfo *reg_info)
lldb::VariableSP FindVariable(ConstString name, bool include_static_members=true)
size_t AppendVariablesIfUnique(VariableList &var_list)
bool IsInScope(StackFrame *frame)
lldb::ValueType GetScope() const
#define LLDB_INVALID_ADDRESS
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::unique_ptr< T > clone(const std::unique_ptr< T > &src)
llvm::Expected< StoppedExecutionContext > GetStoppedExecutionContext(const ExecutionContextRef *exe_ctx_ref_ptr)
class LLDB_API SBLineEntry
class LLDB_API SBFunction
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::RecognizedStackFrame > RecognizedStackFrameSP
class LLDB_API SBValueList
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::shared_ptr< lldb_private::ExpressionVariable > ExpressionVariableSP
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
std::shared_ptr< lldb_private::ValueObjectList > ValueObjectListSP
std::shared_ptr< lldb_private::Variable > VariableSP
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
DILMode
Data Inspection Language (DIL) evaluation modes.
std::shared_ptr< lldb_private::Module > ModuleSP
@ eValueTypeVariableGlobal
globals variable
@ eValueTypeConstResult
constant result variables
@ eValueTypeVariableLocal
function local variables
@ eValueTypeVariableArgument
function argument variables
@ eValueTypeRegister
stack frame register value
@ eValueTypeVariableStatic
static variable
@ eValueTypeRegisterSet
A collection of stack frame register values.
@ eValueTypeVariableThreadLocal
thread local storage variable
class LLDB_API SBCompileUnit
Every register is described in detail including its name, alternate name (optional),...
Registers are grouped into register sets.
const char * name
Name of this register set.
const char * short_name
A short name for this register set.
A type-erased pair of llvm::dwarf::SourceLanguageName and version.
lldb::LanguageType AsLanguageType() const