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 =
676 bool statics,
bool in_scope_only,
681 llvm::Expected<StoppedExecutionContext> exe_ctx =
688 Target *target = exe_ctx->GetTargetPtr();
689 const bool include_runtime_support_values =
721 switch (value_type) {
760 const bool include_runtime_support_values =
767 true,
true, &var_error);
769 std::set<VariableSP> variable_set;
773 const size_t num_variables = variable_list->
GetSize();
774 size_t num_produced = 0;
775 for (
const VariableSP &variable_sp : *variable_list) {
777 synthetic, *variable_sp))
782 "Interrupted getting frame variables with {0} of {1} "
784 num_produced, num_variables))
788 if (variable_set.insert(variable_sp).second ==
false)
790 if (in_scope_only && !variable_sp->IsInScope(&frame))
796 if (!include_runtime_support_values && valobj_sp !=
nullptr &&
797 valobj_sp->IsRuntimeSupportValue())
800 value_list.
Append(to_sbvalue(valobj_sp, use_dynamic));
809static llvm::SmallVector<ValueObjectSP>
815 if (!recognized_frame)
819 recognized_frame->GetRecognizedArguments();
820 if (!recognized_arg_list)
823 return llvm::to_vector(recognized_arg_list->GetObjects());
829 llvm::Expected<StoppedExecutionContext> exe_ctx =
840 auto valobj_to_sbvalue = [](
ValueObjectSP valobj,
bool use_dynamic) {
842 value_sb.
SetSP(valobj, use_dynamic);
846 std::pair<WasInterrupted, Status> fetch_result =
848 exe_ctx->GetTargetPtr()->GetDebugger(),
850 if (fetch_result.second.Fail())
851 value_list.
SetError(std::move(fetch_result.second));
858 options, *frame,
SBTarget(exe_ctx->GetTargetSP()));
861 value_sb.
SetSP(arg, use_dynamic);
862 value_list.
Append(value_sb);
870 llvm::Expected<StoppedExecutionContext> exe_ctx =
886 const uint32_t num_sets = reg_ctx->GetRegisterSetCount();
887 for (uint32_t set_idx = 0; set_idx < num_sets; ++set_idx)
897 llvm::Expected<StoppedExecutionContext> exe_ctx =
912 const RegisterInfo *reg_info = reg_ctx->GetRegisterInfoByName(name);
918 result.
SetSP(value_sp);
927 llvm::Expected<StoppedExecutionContext> exe_ctx =
935 error.SetErrorString(
"The provided SBFormat object is invalid");
939 if (
StackFrame *frame = exe_ctx->GetFramePtr();
942 error.SetErrorStringWithFormat(
943 "It was not possible to generate a frame "
944 "description with the given format string '%s'",
954 llvm::Expected<StoppedExecutionContext> exe_ctx =
958 strm.
PutCString(
"Error: process is not stopped.");
962 if (
StackFrame *frame = exe_ctx->GetFramePtr())
971 llvm::Expected<StoppedExecutionContext> exe_ctx =
987 Target *target = exe_ctx->GetTargetPtr();
989 if (!language && frame)
1004 llvm::Expected<StoppedExecutionContext> exe_ctx =
1012 Target *target = exe_ctx->GetTargetPtr();
1014 if (!language && frame)
1022 bool unwind_on_error) {
1026 llvm::Expected<StoppedExecutionContext> exe_ctx =
1037 Target *target = exe_ctx->GetTargetPtr();
1039 if (!language && frame)
1047 "process is running.");
1051 expr_result.
SetSP(expr_value_sp,
false);
1059 auto LogResult = [](
SBValue expr_result) {
1061 if (expr_result.GetError().Success())
1063 "** [SBFrame::EvaluateExpression] Expression result is "
1064 "%s, summary %s **",
1065 expr_result.GetValue(), expr_result.GetSummary());
1069 "** [SBFrame::EvaluateExpression] Expression evaluation failed: "
1071 expr_result.GetError().GetCString());
1074 if (expr ==
nullptr || expr[0] ==
'\0') {
1078 llvm::Expected<StoppedExecutionContext> exe_ctx =
1083 LogResult(error_result);
1084 return error_result;
1091 std::unique_ptr<llvm::PrettyStackTraceFormat> stack_trace;
1092 Target *target = exe_ctx->GetTargetPtr();
1096 stack_trace = std::make_unique<llvm::PrettyStackTraceFormat>(
1097 "SBFrame::EvaluateExpression (expr = \"%s\", fetch_dynamic_value "
1107 LogResult(expr_result);
1116 llvm::Expected<StoppedExecutionContext> exe_ctx =
1140 llvm::Expected<StoppedExecutionContext> exe_ctx =
1147 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1161 llvm::Expected<StoppedExecutionContext> exe_ctx =
1168 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1177 llvm::Expected<StoppedExecutionContext> exe_ctx =
1184 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1193 llvm::Expected<StoppedExecutionContext> exe_ctx =
1200 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1215 llvm::Expected<StoppedExecutionContext> exe_ctx =
1222 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1230 llvm::Expected<StoppedExecutionContext> exe_ctx =
1237 if (
StackFrame *frame = exe_ctx->GetFramePtr())
1245 llvm::Expected<StoppedExecutionContext> exe_ctx =
1252 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)
void SetIncludeSynthetic(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