58#include "llvm/Support/PrettyStackTrace.h"
98 return this->
operator bool();
100SBFrame::operator
bool()
const {
102 llvm::Expected<StoppedExecutionContext> exe_ctx =
117 llvm::Expected<StoppedExecutionContext> exe_ctx =
124 SymbolContextItem scope =
static_cast<SymbolContextItem
>(resolve_scope);
125 if (
StackFrame *frame = exe_ctx->GetFramePtr())
126 sb_sym_ctx = frame->GetSymbolContext(scope);
134 llvm::Expected<StoppedExecutionContext> exe_ctx =
148 sb_module.
SetSP(module_sp);
155 llvm::Expected<StoppedExecutionContext> exe_ctx =
162 if (
StackFrame *frame = exe_ctx->GetFramePtr())
164 frame->GetSymbolContext(eSymbolContextCompUnit).comp_unit);
171 llvm::Expected<StoppedExecutionContext> exe_ctx =
178 if (
StackFrame *frame = exe_ctx->GetFramePtr())
179 return SBFunction(frame->GetSymbolContext(eSymbolContextFunction).function);
186 llvm::Expected<StoppedExecutionContext> exe_ctx =
193 if (
StackFrame *frame = exe_ctx->GetFramePtr())
194 return SBSymbol(frame->GetSymbolContext(eSymbolContextSymbol).symbol);
201 llvm::Expected<StoppedExecutionContext> exe_ctx =
208 if (
StackFrame *frame = exe_ctx->GetFramePtr())
209 return SBBlock(frame->GetSymbolContext(eSymbolContextBlock).block);
216 llvm::Expected<StoppedExecutionContext> exe_ctx =
223 if (
StackFrame *frame = exe_ctx->GetFramePtr())
224 return SBBlock(frame->GetFrameBlock());
231 llvm::Expected<StoppedExecutionContext> exe_ctx =
238 if (
StackFrame *frame = exe_ctx->GetFramePtr())
240 &frame->GetSymbolContext(eSymbolContextLineEntry).line_entry);
247 constexpr uint32_t error_frame_idx =
UINT32_MAX;
249 llvm::Expected<StoppedExecutionContext> exe_ctx =
253 return error_frame_idx;
256 if (
StackFrame *frame = exe_ctx->GetFramePtr())
257 return frame->GetFrameIndex();
258 return error_frame_idx;
264 llvm::Expected<StoppedExecutionContext> exe_ctx =
271 if (
StackFrame *frame = exe_ctx->GetFramePtr())
272 return frame->GetStackID().GetCallFrameAddressWithoutMetadata();
280 llvm::Expected<StoppedExecutionContext> exe_ctx =
287 Target *target = exe_ctx->GetTargetPtr();
288 if (
StackFrame *frame = exe_ctx->GetFramePtr())
298 constexpr bool error_ret_val =
false;
299 llvm::Expected<StoppedExecutionContext> exe_ctx =
303 return error_ret_val;
306 if (
StackFrame *frame = exe_ctx->GetFramePtr())
308 return reg_ctx_sp->SetPC(new_pc);
310 return error_ret_val;
316 llvm::Expected<StoppedExecutionContext> exe_ctx =
323 if (
StackFrame *frame = exe_ctx->GetFramePtr())
325 return reg_ctx_sp->GetSP();
333 llvm::Expected<StoppedExecutionContext> exe_ctx =
340 if (
StackFrame *frame = exe_ctx->GetFramePtr())
342 return reg_ctx_sp->GetFP();
350 llvm::Expected<StoppedExecutionContext> exe_ctx =
357 if (
StackFrame *frame = exe_ctx->GetFramePtr())
358 return SBAddress(frame->GetFrameCodeAddress());
373 llvm::Expected<StoppedExecutionContext> exe_ctx =
380 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
382 frame->CalculateTarget()->GetPreferDynamicValue();
394 if (var_path ==
nullptr || var_path[0] ==
'\0') {
398 llvm::Expected<StoppedExecutionContext> exe_ctx =
405 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
408 ValueObjectSP value_sp(frame->GetValueForVariableExpressionPath(
412 var_sp,
error, mode));
413 sb_value.
SetSP(value_sp, use_dynamic);
421 llvm::Expected<StoppedExecutionContext> exe_ctx =
428 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
430 frame->CalculateTarget()->GetPreferDynamicValue();
443 if (name ==
nullptr || name[0] ==
'\0') {
447 llvm::Expected<StoppedExecutionContext> exe_ctx =
454 if (
StackFrame *frame = exe_ctx->GetFramePtr())
456 sb_value.
SetSP(value_sp, use_dynamic);
465 llvm::Expected<StoppedExecutionContext> exe_ctx =
472 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
474 frame->CalculateTarget()->GetPreferDynamicValue();
475 value =
FindValue(name, value_type, use_dynamic);
486 if (name ==
nullptr || name[0] ==
'\0') {
491 llvm::Expected<StoppedExecutionContext> exe_ctx =
509 switch (base_value_type) {
517 const bool can_create =
true;
518 const bool get_parent_variables =
true;
519 const bool stop_if_block_is_inlined_function =
true;
523 can_create, get_parent_variables, stop_if_block_is_inlined_function,
529 const bool get_file_globals =
true;
531 get_file_globals, include_synthetic_vars,
nullptr);
541 sb_value.
SetSP(value_sp, use_dynamic);
547 if (
const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name)) {
549 sb_value.
SetSP(value_sp);
557 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
558 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx) {
559 const RegisterSet *reg_set = reg_ctx->GetRegisterSet(set_idx);
561 (llvm::StringRef(reg_set->
name).equals_insensitive(name) ||
562 llvm::StringRef(reg_set->
short_name).equals_insensitive(name))) {
564 sb_value.
SetSP(value_sp);
573 Target *target = exe_ctx->GetTargetPtr();
576 value_sp = expr_var_sp->GetValueObject();
577 sb_value.
SetSP(value_sp, use_dynamic);
593 return (this_sp && that_sp && this_sp->GetStackID() == that_sp->GetStackID());
611 llvm::Expected<StoppedExecutionContext> exe_ctx =
618 ThreadSP thread_sp(exe_ctx->GetThreadSP());
627 llvm::Expected<StoppedExecutionContext> exe_ctx =
634 if (
auto *frame = exe_ctx->GetFramePtr())
641 bool in_scope_only) {
645 llvm::Expected<StoppedExecutionContext> exe_ctx =
652 if (
StackFrame *frame = exe_ctx->GetFramePtr()) {
653 Target *target = exe_ctx->GetTargetPtr();
655 frame->CalculateTarget()->GetPreferDynamicValue();
656 const bool include_runtime_support_values =
673 bool statics,
bool in_scope_only,
678 llvm::Expected<StoppedExecutionContext> exe_ctx =
685 Target *target = exe_ctx->GetTargetPtr();
686 const bool include_runtime_support_values =
714 switch (value_type) {
753 const bool include_runtime_support_values =
760 true,
true, &var_error);
762 std::set<VariableSP> variable_set;
766 const size_t num_variables = variable_list->
GetSize();
767 size_t num_produced = 0;
768 for (
const VariableSP &variable_sp : *variable_list) {
770 synthetic, *variable_sp))
775 "Interrupted getting frame variables with {0} of {1} "
777 num_produced, num_variables))
781 if (variable_set.insert(variable_sp).second ==
false)
783 if (in_scope_only && !variable_sp->IsInScope(&frame))
789 if (!include_runtime_support_values && valobj_sp !=
nullptr &&
790 valobj_sp->IsRuntimeSupportValue())
793 value_list.
Append(to_sbvalue(valobj_sp, use_dynamic));
802static llvm::SmallVector<ValueObjectSP>
808 if (!recognized_frame)
812 recognized_frame->GetRecognizedArguments();
813 if (!recognized_arg_list)
816 return llvm::to_vector(recognized_arg_list->GetObjects());
822 llvm::Expected<StoppedExecutionContext> exe_ctx =
833 auto valobj_to_sbvalue = [](
ValueObjectSP valobj,
bool use_dynamic) {
835 value_sb.
SetSP(valobj, use_dynamic);
839 std::pair<WasInterrupted, Status> fetch_result =
841 exe_ctx->GetTargetPtr()->GetDebugger(),
843 if (fetch_result.second.Fail())
844 value_list.
SetError(std::move(fetch_result.second));
851 options, *frame,
SBTarget(exe_ctx->GetTargetSP()));
854 value_sb.
SetSP(arg, use_dynamic);
855 value_list.
Append(value_sb);
863 llvm::Expected<StoppedExecutionContext> exe_ctx =
879 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
880 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
890 llvm::Expected<StoppedExecutionContext> exe_ctx =
905 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name);
911 result.
SetSP(value_sp);
920 llvm::Expected<StoppedExecutionContext> exe_ctx =
928 error.SetErrorString(
"The provided SBFormat object is invalid");
932 if (
StackFrame *frame = exe_ctx->GetFramePtr();
935 error.SetErrorStringWithFormat(
936 "It was not possible to generate a frame "
937 "description with the given format string '%s'",
947 llvm::Expected<StoppedExecutionContext> exe_ctx =
951 strm.
PutCString(
"Error: process is not stopped.");
955 if (
StackFrame *frame = exe_ctx->GetFramePtr())
964 llvm::Expected<StoppedExecutionContext> exe_ctx =
980 Target *target = exe_ctx->GetTargetPtr();
982 if (!language && frame)
997 llvm::Expected<StoppedExecutionContext> exe_ctx =
1005 Target *target = exe_ctx->GetTargetPtr();
1007 if (!language && frame)
1015 bool unwind_on_error) {
1019 llvm::Expected<StoppedExecutionContext> exe_ctx =
1030 Target *target = exe_ctx->GetTargetPtr();
1032 if (!language && frame)
1040 "process is running.");
1044 expr_result.
SetSP(expr_value_sp,
false);
1052 auto LogResult = [](
SBValue expr_result) {
1054 if (expr_result.GetError().Success())
1056 "** [SBFrame::EvaluateExpression] Expression result is "
1057 "%s, summary %s **",
1058 expr_result.GetValue(), expr_result.GetSummary());
1062 "** [SBFrame::EvaluateExpression] Expression evaluation failed: "
1064 expr_result.GetError().GetCString());
1067 if (expr ==
nullptr || expr[0] ==
'\0') {
1071 llvm::Expected<StoppedExecutionContext> exe_ctx =
1076 LogResult(error_result);
1077 return error_result;
1084 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1085 Target *target = exe_ctx->GetTargetPtr();
1089 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1090 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1100 LogResult(expr_result);
1109 llvm::Expected<StoppedExecutionContext> exe_ctx =
1133 llvm::Expected<StoppedExecutionContext> exe_ctx =
1140 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1154 llvm::Expected<StoppedExecutionContext> exe_ctx =
1161 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1170 llvm::Expected<StoppedExecutionContext> exe_ctx =
1177 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1186 llvm::Expected<StoppedExecutionContext> exe_ctx =
1193 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1208 llvm::Expected<StoppedExecutionContext> exe_ctx =
1215 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1223 llvm::Expected<StoppedExecutionContext> exe_ctx =
1230 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1238 llvm::Expected<StoppedExecutionContext> exe_ctx =
1245 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, bool synthetic, 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 GetIncludeSynthetic() const
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 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 VariableList * GetVariableList(bool get_file_globals, bool include_synthetic_vars, Status *error_ptr)
Retrieve the list of variables whose scope either:
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, ValueObjectManager *manager=nullptr)
These routines create ValueObjectConstResult ValueObjects from various data sources.
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) const
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.
constexpr bool IsSyntheticValueType(lldb::ValueType vt)
Return true if vt represents a synthetic value, false if not.
std::unique_ptr< T > clone(const std::unique_ptr< T > &src)
constexpr lldb::ValueType GetBaseValueType(lldb::ValueType vt)
Get the base value type - for when we don't care if the value is synthetic or not,...
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
@ 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
std::shared_ptr< lldb_private::RegisterContext > RegisterContextSP
DILMode
Data Inspection Language (DIL) evaluation modes.
std::shared_ptr< lldb_private::Module > ModuleSP
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