12#include "lldb/Host/Config.h"
35#include "llvm/ADT/StringExtras.h"
36#include "llvm/ADT/StringRef.h"
45#pragma mark CommandObjectFrameDiagnose
51#define LLDB_OPTIONS_frame_diag
52#include "CommandOptions.inc"
66 switch (short_option) {
73 if (option_arg.getAsInteger(0, *
address)) {
76 "invalid address argument '%s'", option_arg.str().c_str());
82 if (option_arg.getAsInteger(0, *
offset)) {
85 "invalid offset argument '%s'", option_arg.str().c_str());
90 llvm_unreachable(
"Unimplemented option");
103 return llvm::ArrayRef(g_frame_diag_options);
108 std::optional<ConstString>
reg;
114 "Try to determine what path the current stop "
115 "location used to get to a register or address",
117 eCommandRequiresThread | eCommandTryTargetAPILock |
118 eCommandProcessMustBeLaunched |
119 eCommandProcessMustBePaused) {
137 "`frame diagnose --address` is incompatible with other arguments.");
140 valobj_sp = frame_sp->GuessValueForAddress(*
m_options.address);
142 valobj_sp = frame_sp->GuessValueForRegisterAndOffset(
145 StopInfoSP stop_info_sp = thread->GetStopInfo();
147 result.
AppendError(
"no arguments provided, and no stop info");
165 GetExpressionPathFormat::eGetExpressionPathFormatHonorPointers;
166 valobj_sp->GetExpressionPath(stream, format);
167 stream.PutCString(
" =");
175 assert(valobj_sp.get() &&
"Must have a valid ValueObject to print");
186#pragma mark CommandObjectFrameInfo
194 "List information about the current "
195 "stack frame in the current thread.",
197 eCommandRequiresFrame | eCommandTryTargetAPILock |
198 eCommandProcessMustBeLaunched |
199 eCommandProcessMustBePaused) {}
210#pragma mark CommandObjectFrameSelect
214#define LLDB_OPTIONS_frame_select
215#include "CommandOptions.inc"
229 switch (short_option) {
232 if (option_arg.getAsInteger(0, offset) || offset == INT32_MIN) {
234 "invalid frame offset argument '%s'", option_arg.str().c_str());
241 llvm_unreachable(
"Unimplemented option");
252 return llvm::ArrayRef(g_frame_select_options);
260 "Select the current stack frame by "
261 "index from within the current thread "
262 "(see 'thread backtrace'.)",
264 eCommandRequiresThread | eCommandTryTargetAPILock |
265 eCommandProcessMustBeLaunched |
266 eCommandProcessMustBePaused) {
276 uint32_t candidate_idx = frame_idx;
277 const unsigned max_depth = 12;
278 for (
unsigned num_try = 0; num_try < max_depth; ++num_try) {
279 if (candidate_idx == 0 && *
m_options.relative_frame_offset == -1) {
283 candidate_idx += *
m_options.relative_frame_offset;
284 if (
auto candidate_sp = thread.GetStackFrameAtIndex(candidate_idx)) {
285 if (candidate_sp->IsHidden())
294 m_options.relative_frame_offset = candidate_idx - frame_idx;
312 if ((*
m_options.relative_frame_offset == 1 ||
313 *
m_options.relative_frame_offset == -1)) {
314 if (
auto current_frame_sp = thread->GetStackFrameAtIndex(frame_idx);
315 !current_frame_sp->IsHidden())
319 if (*
m_options.relative_frame_offset < 0) {
320 if (
static_cast<int32_t
>(frame_idx) >=
322 frame_idx += *
m_options.relative_frame_offset;
324 if (frame_idx == 0) {
327 result.
AppendError(
"already at the bottom of the stack");
332 }
else if (*
m_options.relative_frame_offset > 0) {
337 const uint32_t frame_requested =
338 frame_idx + *
m_options.relative_frame_offset;
339 StackFrameSP frame_sp = thread->GetStackFrameAtIndex(frame_requested);
341 frame_idx = frame_requested;
344 const uint32_t num_frames = thread->GetStackFrameCount();
345 if (
static_cast<int32_t
>(num_frames - frame_idx) >
347 frame_idx += *
m_options.relative_frame_offset;
349 if (frame_idx == num_frames - 1) {
352 result.
AppendError(
"already at the top of the stack");
355 frame_idx = num_frames - 1;
362 "too many arguments; expected frame-index, saw '%s'",
372 if (command[0].ref().getAsInteger(0, frame_idx)) {
385 bool success = thread->SetSelectedFrameByIndexNoisily(
398#pragma mark CommandObjectFrameVariable
404 interpreter,
"frame variable",
405 "Show variables for the current stack frame. Defaults to all "
406 "arguments and local variables in scope. Names of argument, "
407 "local, file static and file global variables can be specified.",
409 eCommandRequiresFrame | eCommandTryTargetAPILock |
410 eCommandProcessMustBeLaunched | eCommandProcessMustBePaused |
411 eCommandRequiresProcess),
416Children of aggregate variables can be specified such as 'var->child.x'. In
417'frame variable', the operators -> and [] do not invoke operator overloads if
418they exist, but directly access the specified element. If you want to trigger
419operator overloads use the expression command to print the variable instead.
421It is worth noting that except for overloaded operators, when printing local
422variables 'expr local_var' and 'frame var local_var' produce the same results.
423However, 'frame variable' is more efficient, since it uses debug information and
424memory reads directly, rather than parsing and evaluating an expression, which
425may even involve JITing and running code in the target program.)");
445 uint32_t index)
override {
446 llvm::StringRef depth_opt =
"--depth";
449 auto increment_option =
450 [&](llvm::StringRef option) -> std::optional<std::string> {
452 bool failed = option.getAsInteger(10, num);
455 return llvm::utostr(num + 1);
458 bool has_depth_option =
false;
459 bool increment_next_arg =
false;
460 for (
const auto &entry : current_command_args) {
461 llvm::StringRef arg = entry.ref();
463 if (arg ==
"-" || arg ==
"--") {
468 if (increment_next_arg) {
469 increment_next_arg =
false;
470 if (
auto maybe_opt = increment_option(arg)) {
476 if (depth_opt.starts_with(arg) || arg ==
"-D") {
478 increment_next_arg =
true;
479 has_depth_option =
true;
482 if (arg.consume_front(
"-D")) {
483 if (
auto maybe_opt = increment_option(arg)) {
484 repeat_args.
AppendArgument(llvm::formatv(
"-D{0}", *maybe_opt).str());
485 has_depth_option =
true;
493 if (!has_depth_option) {
498 auto [default_depth, _] =
499 target_sp->GetMaximumDepthOfChildrenToDisplay();
501 assert(repeat_args[0].ref() ==
"frame" &&
"expects resolved command");
507 std::string repeat_command;
510 return repeat_command;
516 return llvm::StringRef();
518 auto vt = var_sp->GetScope();
526 return is_synthetic ?
"(synthetic) GLOBAL: " :
"GLOBAL: ";
528 return is_synthetic ?
"(synthetic) STATIC: " :
"STATIC: ";
530 return is_synthetic ?
"(synthetic) ARG: " :
"ARG: ";
532 return is_synthetic ?
"(synthetic) LOCAL: " :
"LOCAL: ";
534 return is_synthetic ?
"(synthetic) THREAD: " :
"THREAD: ";
539 return llvm::StringRef();
572 llvm_unreachable(
"Unexpected scope value");
581 std::optional<llvm::ArrayRef<VariableSP>>
585 bool any_matches =
false;
586 const size_t previous_num_vars = matches.
GetSize();
596 return matches.
toArrayRef().drop_front(previous_num_vars);
600 void DoExecute(Args &command, CommandReturnObject &result)
override {
603 StackFrame *frame =
m_exe_ctx.GetFramePtr();
616 VariableList *variable_list =
620 if (
error.Fail() && (!variable_list || variable_list->
GetSize() == 0)) {
632 summary_format_sp = std::make_shared<StringSummaryFormat>(
633 TypeSummaryImpl::Flags(),
640 const SymbolContext &sym_ctx =
648 recognized_arg_list = recognized_frame->GetRecognizedArguments();
651 options.SetFormat(format);
653 auto print_value = [&result, options](
ValueObjectSP valobj_sp) {
660 if (!command.
empty()) {
661 VariableList regex_var_list;
665 for (
auto &entry : command) {
667 llvm::StringRef name_str = entry.ref();
670 std::optional<llvm::ArrayRef<VariableSP>> results =
674 bool found_recognized =
false;
675 if (recognized_arg_list)
676 for (
auto &rec_value_sp : recognized_arg_list->GetObjects())
677 if (regex.
Execute(rec_value_sp->GetName())) {
678 found_recognized =
true;
679 print_value(rec_value_sp);
681 if (!found_recognized) {
683 "no variables matched the regular expression '%s'",
694 std::string scope_string;
698 if (!scope_string.empty())
702 var_sp->GetDeclaration().GetFile()) {
703 bool show_fullpaths =
false;
704 bool show_module =
true;
705 if (var_sp->DumpDeclaration(&s, show_fullpaths,
710 if (llvm::Error
error = valobj_sp->Dump(strm, options))
715 if (llvm::Error err = regex.
GetError())
716 result.
AppendError(llvm::toString(std::move(err)));
719 "unknown regex error when compiling '%s'", entry.c_str());
725 uint32_t expr_path_options =
738 if (valobj_sp &&
error.Success()) {
741 std::string scope_string;
745 if (!scope_string.empty())
748 var_sp->GetDeclaration().GetFile()) {
749 var_sp->GetDeclaration().DumpStopContext(&s,
false);
753 options.SetFormat(format);
754 options.SetVariableFormatDisplayLanguage(
755 valobj_sp->GetPreferredDisplayLanguage());
758 options.SetRootValueObjectName(
759 valobj_sp->GetParent() ? entry.c_str() :
nullptr);
764 if (llvm::Error
error = valobj_sp->Dump(output_stream, options))
768 bool found_recognized =
false;
769 if (recognized_arg_list)
770 for (
auto &obj_sp : recognized_arg_list->GetObjects())
771 if (obj_sp->GetName() == entry.ref()) {
772 found_recognized =
true;
776 if (!found_recognized) {
781 "unable to find any variable expression path that "
790 const size_t num_variables = variable_list->
GetSize();
791 if (num_variables > 0) {
792 for (
size_t i = 0; i < num_variables; i++) {
796 std::string scope_string;
809 if (valobj_sp->IsInScope()) {
810 if (!valobj_sp->GetTargetSP()
811 ->GetDisplayRuntimeSupportValues() &&
812 valobj_sp->IsRuntimeSupportValue())
815 if (!scope_string.empty())
819 var_sp->GetDeclaration().GetFile()) {
820 var_sp->GetDeclaration().DumpStopContext(&s,
false);
824 options.SetFormat(format);
825 options.SetVariableFormatDisplayLanguage(
826 valobj_sp->GetPreferredDisplayLanguage());
827 options.SetRootValueObjectName(
828 var_sp ? var_sp->GetName().AsCString(
nullptr) :
nullptr);
829 if (llvm::Error
error =
841 if (recognized_arg_list && (command.empty() || !variable_list))
842 for (
auto &rec_value_sp : recognized_arg_list->GetObjects())
843 print_value(rec_value_sp);
862#pragma mark CommandObjectFrameRecognizer
864#define LLDB_OPTIONS_frame_recognizer_add
865#include "CommandOptions.inc"
879 switch (short_option) {
887 "invalid boolean value '%s' passed for -f option",
888 option_arg.str().c_str());
898 m_symbols.push_back(std::string(option_arg));
904 llvm_unreachable(
"Unimplemented option");
919 return llvm::ArrayRef(g_frame_recognizer_add_options);
940 "Add a new frame recognizer.", nullptr,
941 eCommandAllowsDummyTarget) {
943Frame recognizers allow for retrieving information about special frames based on
944ABI, arguments or other special properties of that frame, even without source
945code or debug info. Currently, one use case is to extract function arguments
946that would otherwise be unaccesible, or augment existing arguments.
948Adding a custom frame recognizer is possible by implementing a Python class
949and using the 'frame recognizer add' command. The Python class should have a
950'get_recognized_arguments' method and it will receive an argument of type
951lldb.SBFrame representing the current frame that we are trying to recognize.
952The method should return a (possibly empty) list of lldb.SBValue objects that
953represent the recognized arguments.
955An example of a recognizer that retrieves the file descriptor values from libc
956functions 'read', 'write' and 'close' follows:
958 class LibcFdRecognizer(object):
959 def get_recognized_arguments(self, frame):
960 if frame.name in ["read", "write", "close"]:
961 fd = frame.EvaluateExpression("$arg1").unsigned
962 target = frame.thread.process.target
963 value = target.CreateValueFromExpression("fd", "(int)%d" % fd)
967The file containing this implementation can be imported via 'command script
968import' and then we can register this recognizer with 'frame recognizer add'.
969It's important to restrict the recognizer to the libc library (which is
970libsystem_kernel.dylib on macOS) to avoid matching functions with the same name
973(lldb) command script import .../fd_recognizer.py
974(lldb) frame recognizer add -l fd_recognizer.LibcFdRecognizer -n read -s libsystem_kernel.dylib
976When the program is stopped at the beginning of the 'read' function in libc, we
977can view the recognizer arguments in 'frame variable':
982* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.3
983 frame #0: 0x00007fff06013ca0 libsystem_kernel.dylib`read
994#if LLDB_ENABLE_PYTHON
1009 "%s needs at least one symbol name (-n argument)",
m_cmd_name.c_str());
1015 "%s needs only one symbol regular expression (-n argument)",
1024 result.
AppendWarning(
"the provided class does not exist - please define it "
1025 "before attempting to use this frame recognizer");
1030 interpreter,
m_options.m_class_name.c_str()));
1032 auto module = std::make_shared<RegularExpression>(m_options.m_module);
1034 std::make_shared<RegularExpression>(
m_options.m_symbols.front());
1039 auto module = ConstString(m_options.m_module);
1040 std::vector<ConstString> symbols(
m_options.m_symbols.begin(),
1043 recognizer_sp, module, symbols,
1056 "Delete all frame recognizers.", nullptr,
1057 eCommandAllowsDummyTarget) {}
1070 const std::string &module,
1071 llvm::ArrayRef<lldb_private::ConstString> symbols,
1074 strm <<
"[disabled] ";
1076 strm << name <<
", ";
1078 if (!module.empty())
1079 strm <<
"module " << module <<
", ";
1081 switch (symbol_mangling) {
1082 case Mangled::NamePreference ::ePreferMangled:
1083 strm <<
"mangled symbol ";
1085 case Mangled::NamePreference ::ePreferDemangled:
1086 strm <<
"demangled symbol ";
1088 case Mangled::NamePreference ::ePreferDemangledWithoutArguments:
1089 strm <<
"demangled (no args) symbol ";
1096 llvm::interleaveComma(symbols, strm);
1104 const char *help =
nullptr,
1105 const char *syntax =
nullptr,
1118 [&request](uint32_t rid,
bool enabled, std::string rname,
1120 llvm::ArrayRef<lldb_private::ConstString> symbols,
1124 rname =
"(internal)";
1127 symbol_mangling, regexp);
1134 uint32_t recognizer_id) = 0;
1137 uint32_t recognizer_id;
1153 interpreter,
"frame recognizer enable",
1154 "Enable a frame recognizer by id.", nullptr,
1155 eCommandAllowsDummyTarget) {
1163 uint32_t recognizer_id)
override {
1165 if (!recognizer_mgr.SetEnabledForID(recognizer_id,
true)) {
1179 interpreter,
"frame recognizer disable",
1180 "Disable a frame recognizer by id.", nullptr,
1181 eCommandAllowsDummyTarget) {
1189 uint32_t recognizer_id)
override {
1191 if (!recognizer_mgr.SetEnabledForID(recognizer_id,
false)) {
1205 interpreter,
"frame recognizer delete",
1206 "Delete an existing frame recognizer by id.", nullptr,
1207 eCommandAllowsDummyTarget) {
1215 uint32_t recognizer_id)
override {
1217 if (!recognizer_mgr.RemoveRecognizerWithID(recognizer_id)) {
1230 "Show a list of active frame recognizers.", nullptr,
1231 eCommandAllowsDummyTarget) {}
1237 bool any_printed =
false;
1240 &any_printed](uint32_t recognizer_id,
bool enabled, std::string name,
1241 std::string module, llvm::ArrayRef<ConstString> symbols,
1246 name =
"(internal)";
1248 stream << std::to_string(recognizer_id) <<
": ";
1250 symbol_mangling, regexp);
1271 interpreter,
"frame recognizer info",
1272 "Show which frame recognizer is applied a stack frame (if any).",
1273 nullptr, eCommandAllowsDummyTarget) {
1282 uint32_t frame_index;
1283 if (!llvm::to_integer(frame_index_str, frame_index)) {
1290 if (process ==
nullptr) {
1295 if (thread ==
nullptr) {
1301 "'%s' takes exactly one frame index argument",
m_cmd_name.c_str());
1305 StackFrameSP frame_sp = thread->GetStackFrameAtIndex(frame_index);
1316 output_stream.
Printf(
"frame %d ", frame_index);
1318 output_stream <<
"is recognized by ";
1319 output_stream << recognizer->GetName();
1321 output_stream <<
"not recognized by any recognizer";
1323 output_stream.
EOL();
1332 interpreter,
"frame recognizer",
1333 "Commands for editing and viewing frame recognizers.",
1334 "frame recognizer [<sub-command-options>] ") {
1358#pragma mark CommandObjectMultiwordFrame
1365 "Commands for selecting and "
1366 "examining the current "
1367 "thread's stack frames.",
1368 "frame <subcommand> [<subcommand-options>]") {
1377#if LLDB_ENABLE_PYTHON
static void PrintRecognizerDetails(Stream &strm, const std::string &name, bool enabled, const std::string &module, llvm::ArrayRef< lldb_private::ConstString > symbols, Mangled::NamePreference symbol_mangling, bool regexp)
static llvm::raw_ostream & error(Stream &strm)
CommandObjectFrameInfo(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectFrameInfo() override=default
void OptionParsingStarting(ExecutionContext *execution_context) override
std::vector< std::string > m_symbols
bool m_first_instruction_only
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
~CommandOptions() override=default
CommandObjectFrameRecognizerAdd(CommandInterpreter &interpreter)
Options * GetOptions() override
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectFrameRecognizerAdd() override=default
CommandObjectFrameRecognizerClear(CommandInterpreter &interpreter)
~CommandObjectFrameRecognizerClear() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectFrameRecognizerDelete() override=default
CommandObjectFrameRecognizerDelete(CommandInterpreter &interpreter)
void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override
CommandObjectFrameRecognizerDisable(CommandInterpreter &interpreter)
void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override
~CommandObjectFrameRecognizerDisable() override=default
void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id) override
CommandObjectFrameRecognizerEnable(CommandInterpreter &interpreter)
~CommandObjectFrameRecognizerEnable() override=default
CommandObjectFrameRecognizerInfo(CommandInterpreter &interpreter)
~CommandObjectFrameRecognizerInfo() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
CommandObjectFrameRecognizerList(CommandInterpreter &interpreter)
~CommandObjectFrameRecognizerList() override=default
void DoExecute(Args &command, CommandReturnObject &result) override
~CommandObjectFrameRecognizer() override=default
CommandObjectFrameRecognizer(CommandInterpreter &interpreter)
Status SetOptionValue(uint32_t option_idx, llvm::StringRef option_arg, ExecutionContext *execution_context) override
Set the value of an option.
std::optional< int32_t > relative_frame_offset
void OptionParsingStarting(ExecutionContext *execution_context) override
llvm::ArrayRef< OptionDefinition > GetDefinitions() override
~CommandOptions() override=default
void SkipHiddenFrames(Thread &thread, uint32_t frame_idx)
~CommandObjectFrameSelect() override=default
CommandObjectFrameSelect(CommandInterpreter &interpreter)
Options * GetOptions() override
void DoExecute(Args &command, CommandReturnObject &result) override
OptionGroupOptions m_option_group
OptionGroupFormat m_option_format
Options * GetOptions() override
OptionGroupVariable m_option_variable
OptionGroupValueObjectDisplay m_varobj_options
std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index) override
Get the command that appropriate for a "repeat" of the current command.
bool ScopeRequested(lldb::ValueType scope)
Returns true if scope matches any of the options in m_option_variable.
llvm::StringRef GetScopeString(VariableSP var_sp)
std::optional< llvm::ArrayRef< VariableSP > > findUniqueRegexMatches(RegularExpression ®ex, VariableList &matches, const VariableList &all_variables)
Finds all the variables in all_variables whose name matches regex, inserting them into matches.
~CommandObjectFrameVariable() override=default
CommandObjectFrameVariable(CommandInterpreter &interpreter)
void DoExecute(Args &command, CommandReturnObject &result) override
void DoExecute(Args &command, CommandReturnObject &result) override
void HandleArgumentCompletion(CompletionRequest &request, OptionElementVector &opt_element_vector) override
The default version handles argument definitions that have only one argument type,...
CommandObjectWithFrameRecognizerArg(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
virtual void DoExecuteWithId(CommandReturnObject &result, uint32_t recognizer_id)=0
A command line argument class.
size_t GetArgumentCount() const
Gets the number of arguments left in this command object.
void AppendArgument(llvm::StringRef arg_str, char quote_char='\0')
Appends a new argument to the end of the list argument list.
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
void InsertArgumentAtIndex(size_t idx, llvm::StringRef arg_str, char quote_char='\0')
Insert the argument value at index idx to arg_str.
bool GetQuotedCommandString(std::string &command) const
CommandObjectMultiwordFrame(CommandInterpreter &interpreter)
~CommandObjectMultiwordFrame() override
bool LoadSubCommand(llvm::StringRef cmd_name, const lldb::CommandObjectSP &command_obj) override
CommandObjectMultiword(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
friend class CommandInterpreter
CommandObjectParsed(CommandInterpreter &interpreter, const char *name, const char *help=nullptr, const char *syntax=nullptr, uint32_t flags=0)
virtual void SetHelpLong(llvm::StringRef str)
void AddSimpleArgumentList(lldb::CommandArgumentType arg_type, ArgumentRepetitionType repetition_type=eArgRepeatPlain)
ExecutionContext m_exe_ctx
CommandInterpreter & GetCommandInterpreter()
CommandInterpreter & m_interpreter
Target * GetTarget()
Get the target this command should operate on.
void AppendError(llvm::StringRef in_string)
const ValueObjectList & GetValueObjectList() const
Stream & GetErrorStream()
void SetStatus(lldb::ReturnStatus status)
void SetError(Status error)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
lldb::ReturnStatus GetStatus() const
void AppendWarning(llvm::StringRef in_string)
Stream & GetOutputStream()
"lldb/Utility/ArgCompletionRequest.h"
void TryCompleteCurrentArg(llvm::StringRef completion, llvm::StringRef description="")
Adds a possible completion string if the completion would complete the current argument.
size_t GetCursorIndex() const
A uniqued constant string class.
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
std::function< bool(ConstString, ConstString, const DumpValueObjectOptions &, Stream &)> DeclPrintingHelper
DumpValueObjectOptions & SetDeclPrintingHelper(DeclPrintingHelper helper)
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
bool IsTopLevelFunction()
Get whether this function represents a 'top-level' function.
A command line option parsing protocol class.
std::vector< Option > m_getopt_table
A plug-in interface definition class for debugging a process.
bool IsValid() const
Test if this object contains a valid regular expression.
bool Execute(llvm::StringRef string, llvm::SmallVectorImpl< llvm::StringRef > *matches=nullptr) const
Execute a regular expression match using the compiled regular expression that is already in this obje...
llvm::Error GetError() const
Return an error if the regular expression failed to compile.
virtual bool CheckObjectExists(const char *name)
Python implementation for frame recognizers.
void AddRecognizer(lldb::StackFrameRecognizerSP recognizer, ConstString module, llvm::ArrayRef< ConstString > symbols, Mangled::NamePreference symbol_mangling, bool first_instruction_only=true)
Add a new recognizer that triggers on a given symbol name.
void ForEach(std::function< void(uint32_t recognizer_id, bool enabled, std::string recognizer_name, std::string module, llvm::ArrayRef< ConstString > symbols, Mangled::NamePreference name_preference, bool regexp)> const &callback)
lldb::StackFrameRecognizerSP GetRecognizerForFrame(lldb::StackFrameSP frame)
void RemoveAllRecognizers()
virtual lldb::ValueObjectSP GetValueForVariableExpressionPath(llvm::StringRef var_expr, lldb::DynamicValueType use_dynamic, uint32_t options, lldb::VariableSP &var_sp, Status &error, lldb::DILMode mode=lldb::eDILModeFull)
Create a ValueObject for a variable name / pathname, possibly including simple dereference/child sele...
@ eExpressionPathOptionCheckPtrVsMember
@ eExpressionPathOptionsInspectAnonymousUnions
@ eExpressionPathOptionsAllowDirectIVarAccess
@ eExpressionPathOptionsAllowVarUpdates
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 lldb::RecognizedStackFrameSP GetRecognizedFrame()
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static lldb::ValueObjectSP GetCrashingDereference(lldb::StopInfoSP &stop_info_sp, lldb::addr_t *crashing_address=nullptr)
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
virtual void Flush()=0
Flush the stream.
size_t EOL()
Output and End of Line character to the stream.
Function * function
The Function for a given query.
A class that represents statistics for a since lldb_private::Target.
StatsSuccessFail & GetFrameVariableStats()
TargetStats & GetStatistics()
StackFrameRecognizerManager & GetFrameRecognizerManager()
void Append(const lldb::ValueObjectSP &val_obj_sp)
llvm::Error PrintValueObject()
bool AddVariableIfUnique(const lldb::VariableSP &var_sp)
lldb::VariableSP GetVariableAtIndex(size_t idx) const
llvm::ArrayRef< lldb::VariableSP > toArrayRef()
@ SelectMostRelevantFrame
A class that represents a running process on the host machine.
constexpr bool IsSyntheticValueType(lldb::ValueType vt)
Return true if vt represents a synthetic value, false if not.
std::vector< OptionArgElement > OptionElementVector
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,...
@ eLanguageRuntimeDescriptionDisplayVerbosityFull
std::string toString(FormatterBytecode::OpCodes op)
std::shared_ptr< lldb_private::StackFrame > StackFrameSP
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
Format
Display format definitions.
std::shared_ptr< lldb_private::ValueObjectList > ValueObjectListSP
@ eReturnStatusSuccessFinishResult
@ eReturnStatusSuccessFinishNoResult
std::shared_ptr< lldb_private::Variable > VariableSP
@ eValueTypeVTableEntry
function pointer in virtual function table
@ eValueTypeVTable
virtual function table
@ 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::StackFrameRecognizer > StackFrameRecognizerSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
static bool ToBoolean(llvm::StringRef s, bool fail_value, bool *success_ptr)