63#include "lldb/Host/Config.h"
65#if LLDB_ENABLE_LIBEDIT
88#include "llvm/ADT/STLExtras.h"
89#include "llvm/ADT/ScopeExit.h"
90#include "llvm/ADT/SmallString.h"
91#include "llvm/Support/FormatAdapters.h"
92#include "llvm/Support/Path.h"
93#include "llvm/Support/PrettyStackTrace.h"
94#include "llvm/Support/ScopedPrinter.h"
95#include "llvm/Telemetry/Telemetry.h"
98#include <TargetConditionals.h>
107 "There is a .lldbinit file in the current directory which is not being "
109 "To silence this warning without sourcing in the local .lldbinit,\n"
110 "add the following to the lldbinit file in your home directory:\n"
111 " settings set target.load-cwd-lldbinit false\n"
112 "To allow lldb to source .lldbinit files in the current working "
114 "set the value of this variable to true. Only do so if you understand "
116 "accept the security risk.";
122#define LLDB_PROPERTIES_interpreter
123#include "InterpreterProperties.inc"
126#define LLDB_PROPERTIES_interpreter
127#include "InterpreterPropertiesEnum.inc"
131 static constexpr llvm::StringLiteral class_name(
"lldb.commandInterpreter");
136 bool synchronous_execution)
155 const uint32_t idx = ePropertyExpandRegexAliases;
157 idx, g_interpreter_properties[idx].default_uint_value != 0);
161 const uint32_t idx = ePropertyPromptOnQuit;
163 idx, g_interpreter_properties[idx].default_uint_value != 0);
167 const uint32_t idx = ePropertyPromptOnQuit;
172 const uint32_t idx = ePropertySaveTranscript;
174 idx, g_interpreter_properties[idx].default_uint_value != 0);
178 const uint32_t idx = ePropertySaveTranscript;
183 const uint32_t idx = ePropertySaveSessionOnQuit;
185 idx, g_interpreter_properties[idx].default_uint_value != 0);
189 const uint32_t idx = ePropertySaveSessionOnQuit;
194 const uint32_t idx = ePropertyOpenTranscriptInEditor;
196 idx, g_interpreter_properties[idx].default_uint_value != 0);
200 const uint32_t idx = ePropertyOpenTranscriptInEditor;
205 const uint32_t idx = ePropertySaveSessionDirectory;
210 const uint32_t idx = ePropertySaveSessionDirectory;
215 const uint32_t idx = ePropertyEchoCommands;
217 idx, g_interpreter_properties[idx].default_uint_value != 0);
221 const uint32_t idx = ePropertyEchoCommands;
226 const uint32_t idx = ePropertyEchoCommentCommands;
228 idx, g_interpreter_properties[idx].default_uint_value != 0);
232 const uint32_t idx = ePropertyEchoCommentCommands;
258 std::string command = command_line;
266 const uint32_t idx = ePropertyStopCmdSourceOnError;
268 idx, g_interpreter_properties[idx].default_uint_value != 0);
272 const uint32_t idx = ePropertySpaceReplPrompts;
274 idx, g_interpreter_properties[idx].default_uint_value != 0);
278 const uint32_t idx = ePropertyRepeatPreviousCommand;
280 idx, g_interpreter_properties[idx].default_uint_value != 0);
284 const uint32_t idx = ePropertyRequireCommandOverwrite;
286 idx, g_interpreter_properties[idx].default_uint_value != 0);
344 "sif", cmd_obj_sp,
"--end-linenumber block --step-in-target %1");
346 sif_alias->
SetHelp(
"Step through the current block, stopping if you step "
347 "directly into a function whose name matches the "
348 "TargetFunctionName.");
349 sif_alias->
SetSyntax(
"sif <TargetFunctionName>");
430 alias_arguments_vector_sp = std::make_shared<OptionArgVector>();
436 if (
auto *po =
AddAlias(
"po", cmd_obj_sp,
"-O --")) {
437 po->SetHelp(
"Evaluate an expression on the current thread. Displays any "
438 "returned value with formatting "
439 "controlled by the type's author.");
450 AddAlias(
"parray", cmd_obj_sp,
"--element-count %1 --");
453 "parray <COUNT> <EXPRESSION> -- lldb will evaluate EXPRESSION "
454 "to get a typed-pointer-to-an-array in memory, and will display "
455 "COUNT elements of that type from the array.");
459 "poarray", cmd_obj_sp,
"--object-description --element-count %1 --");
462 "poarray <COUNT> <EXPRESSION> -- lldb will "
463 "evaluate EXPRESSION to get the address of an array of COUNT "
464 "objects in memory, and will call po on them.");
473 shell_alias->
SetHelp(
"Run a shell command on the host.");
475 shell_alias->
SetSyntax(
"shell <shell-command>");
486 alias_arguments_vector_sp = std::make_shared<OptionArgVector>();
487#if defined(__APPLE__)
492 AddAlias(
"r", cmd_obj_sp,
"--shell-expand-args true --");
493 AddAlias(
"run", cmd_obj_sp,
"--shell-expand-args true --");
497 defaultshell.
Printf(
"--shell=%s --",
498 HostInfo::GetDefaultShell().GetPath().c_str());
511 AddAlias(
"rbreak", cmd_obj_sp,
"--func-regex %1");
518 AddAlias(
"vo", cmd_obj_sp,
"--object-description");
557#define REGISTER_COMMAND_OBJECT(NAME, CLASS) \
558 m_command_dict[NAME] = std::make_shared<CLASS>(*this);
595 const char *break_regexes[][2] = {
596 {
"^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$",
597 "breakpoint set --file '%1' --line %2 --column %3"},
598 {
"^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$",
599 "breakpoint set --file '%1' --line %2"},
600 {
"^/([^/]+)/$",
"breakpoint set --source-pattern-regexp '%1'"},
601 {
"^([[:digit:]]+)[[:space:]]*$",
"breakpoint set --line %1"},
602 {
"^\\*?(0x[[:xdigit:]]+)[[:space:]]*$",
"breakpoint set --address %1"},
603 {
"^[\"']?([-+]?\\[.*\\])[\"']?[[:space:]]*$",
604 "breakpoint set --name '%1'"},
605 {
"^(-.*)$",
"breakpoint set %1"},
606 {
"^(.*[^[:space:]])`(.*[^[:space:]])[[:space:]]*$",
607 "breakpoint set --name '%2' --shlib '%1'"},
608 {
"^\\&(.*[^[:space:]])[[:space:]]*$",
609 "breakpoint set --name '%1' --skip-prologue=0"},
610 {
"^[\"']?(.*[^[:space:]\"'])[\"']?[[:space:]]*$",
611 "breakpoint set --name '%1'"}};
614 size_t num_regexes = std::size(break_regexes);
616 std::unique_ptr<CommandObjectRegexCommand> break_regex_cmd_up(
618 *
this,
"_regexp-break",
619 "Set a breakpoint using one of several shorthand formats, or list "
620 "the existing breakpoints if no arguments are provided.",
622 "_regexp-break <filename>:<linenum>:<colnum>\n"
623 " main.c:12:21 // Break at line 12 and column "
625 "_regexp-break <filename>:<linenum>\n"
626 " main.c:12 // Break at line 12 of "
628 "_regexp-break <linenum>\n"
629 " 12 // Break at line 12 of current "
631 "_regexp-break 0x<address>\n"
632 " 0x1234000 // Break at address "
634 "_regexp-break <name>\n"
635 " main // Break in 'main' after the "
637 "_regexp-break &<name>\n"
638 " &main // Break at first instruction "
640 "_regexp-break <module>`<name>\n"
641 " libc.so`malloc // Break in 'malloc' from "
643 "_regexp-break /<source-regex>/\n"
644 " /break here/ // Break on source lines in "
646 " // containing text 'break "
649 " // List the existing "
653 if (break_regex_cmd_up) {
655 for (
size_t i = 0; i < num_regexes; i++) {
656 success = break_regex_cmd_up->AddRegexCommand(break_regexes[i][0],
657 break_regexes[i][1]);
662 break_regex_cmd_up->AddRegexCommand(
"^$",
"breakpoint list --full");
666 m_command_dict[std::string(break_regex_cmd_sp->GetCommandName())] =
671 std::unique_ptr<CommandObjectRegexCommand> tbreak_regex_cmd_up(
673 *
this,
"_regexp-tbreak",
674 "Set a one-shot breakpoint using one of several shorthand formats.",
676 "_regexp-break <filename>:<linenum>:<colnum>\n"
677 " main.c:12:21 // Break at line 12 and column "
679 "_regexp-break <filename>:<linenum>\n"
680 " main.c:12 // Break at line 12 of "
682 "_regexp-break <linenum>\n"
683 " 12 // Break at line 12 of current "
685 "_regexp-break 0x<address>\n"
686 " 0x1234000 // Break at address "
688 "_regexp-break <name>\n"
689 " main // Break in 'main' after the "
691 "_regexp-break &<name>\n"
692 " &main // Break at first instruction "
694 "_regexp-break <module>`<name>\n"
695 " libc.so`malloc // Break in 'malloc' from "
697 "_regexp-break /<source-regex>/\n"
698 " /break here/ // Break on source lines in "
700 " // containing text 'break "
704 if (tbreak_regex_cmd_up) {
706 for (
size_t i = 0; i < num_regexes; i++) {
707 std::string command = break_regexes[i][1];
710 tbreak_regex_cmd_up->AddRegexCommand(break_regexes[i][0], command);
715 tbreak_regex_cmd_up->AddRegexCommand(
"^$",
"breakpoint list --full");
719 m_command_dict[std::string(tbreak_regex_cmd_sp->GetCommandName())] =
724 std::unique_ptr<CommandObjectRegexCommand> attach_regex_cmd_up(
726 *
this,
"_regexp-attach",
"Attach to process by ID or name.",
727 "_regexp-attach <pid> | <process-name>", 0,
false));
728 if (attach_regex_cmd_up) {
729 if (attach_regex_cmd_up->AddRegexCommand(
"^([0-9]+)[[:space:]]*$",
730 "process attach --pid %1") &&
731 attach_regex_cmd_up->AddRegexCommand(
732 "^(-.*|.* -.*)$",
"process attach %1") &&
735 attach_regex_cmd_up->AddRegexCommand(
"^(.+)$",
736 "process attach --name '%1'") &&
737 attach_regex_cmd_up->AddRegexCommand(
"^$",
"process attach")) {
739 m_command_dict[std::string(attach_regex_cmd_sp->GetCommandName())] =
744 std::unique_ptr<CommandObjectRegexCommand> down_regex_cmd_up(
746 "Select a newer stack frame. Defaults to "
747 "moving one frame, a numeric argument can "
748 "specify an arbitrary number.",
749 "_regexp-down [<count>]", 0,
false));
750 if (down_regex_cmd_up) {
751 if (down_regex_cmd_up->AddRegexCommand(
"^$",
"frame select -r -1") &&
752 down_regex_cmd_up->AddRegexCommand(
"^([0-9]+)$",
753 "frame select -r -%1")) {
755 m_command_dict[std::string(down_regex_cmd_sp->GetCommandName())] =
760 std::unique_ptr<CommandObjectRegexCommand> up_regex_cmd_up(
763 "Select an older stack frame. Defaults to moving one "
764 "frame, a numeric argument can specify an arbitrary number.",
765 "_regexp-up [<count>]", 0,
false));
766 if (up_regex_cmd_up) {
767 if (up_regex_cmd_up->AddRegexCommand(
"^$",
"frame select -r 1") &&
768 up_regex_cmd_up->AddRegexCommand(
"^([0-9]+)$",
"frame select -r %1")) {
775 std::unique_ptr<CommandObjectRegexCommand> display_regex_cmd_up(
777 *
this,
"_regexp-display",
778 "Evaluate an expression at every stop (see 'help target stop-hook'.)",
779 "_regexp-display expression", 0,
false));
780 if (display_regex_cmd_up) {
781 if (display_regex_cmd_up->AddRegexCommand(
782 "^(.+)$",
"target stop-hook add -o \"expr -- %1\"")) {
784 m_command_dict[std::string(display_regex_cmd_sp->GetCommandName())] =
785 display_regex_cmd_sp;
789 std::unique_ptr<CommandObjectRegexCommand> undisplay_regex_cmd_up(
791 "Stop displaying expression at every "
792 "stop (specified by stop-hook index.)",
793 "_regexp-undisplay stop-hook-number", 0,
795 if (undisplay_regex_cmd_up) {
796 if (undisplay_regex_cmd_up->AddRegexCommand(
"^([0-9]+)$",
797 "target stop-hook delete %1")) {
798 CommandObjectSP undisplay_regex_cmd_sp(undisplay_regex_cmd_up.release());
799 m_command_dict[std::string(undisplay_regex_cmd_sp->GetCommandName())] =
800 undisplay_regex_cmd_sp;
804 std::unique_ptr<CommandObjectRegexCommand> connect_gdb_remote_cmd_up(
807 "Connect to a process via remote GDB server.\n"
808 "If no host is specified, localhost is assumed.\n"
809 "gdb-remote is an abbreviation for 'process connect --plugin "
810 "gdb-remote connect://<hostname>:<port>'\n",
811 "gdb-remote [<hostname>:]<portnum>", 0,
false));
812 if (connect_gdb_remote_cmd_up) {
813 if (connect_gdb_remote_cmd_up->AddRegexCommand(
814 "^([^:]+|\\[[0-9a-fA-F:]+.*\\]):([0-9]+)$",
815 "process connect --plugin gdb-remote connect://%1:%2") &&
816 connect_gdb_remote_cmd_up->AddRegexCommand(
818 "process connect --plugin gdb-remote connect://localhost:%1")) {
820 m_command_dict[std::string(command_sp->GetCommandName())] = command_sp;
824 std::unique_ptr<CommandObjectRegexCommand> connect_kdp_remote_cmd_up(
827 "Connect to a process via remote KDP server.\n"
828 "If no UDP port is specified, port 41139 is assumed.\n"
829 "kdp-remote is an abbreviation for 'process connect --plugin "
830 "kdp-remote udp://<hostname>:<port>'\n",
831 "kdp-remote <hostname>[:<portnum>]", 0,
false));
832 if (connect_kdp_remote_cmd_up) {
833 if (connect_kdp_remote_cmd_up->AddRegexCommand(
834 "^([^:]+:[[:digit:]]+)$",
835 "process connect --plugin kdp-remote udp://%1") &&
836 connect_kdp_remote_cmd_up->AddRegexCommand(
837 "^(.+)$",
"process connect --plugin kdp-remote udp://%1:41139")) {
839 m_command_dict[std::string(command_sp->GetCommandName())] = command_sp;
843 std::unique_ptr<CommandObjectRegexCommand> bt_regex_cmd_up(
846 "Show backtrace of the current thread's call stack. Any numeric "
847 "argument displays at most that many frames. The argument 'all' "
848 "displays all threads. Use 'settings set frame-format' to customize "
849 "the printing of individual frames and 'settings set thread-format' "
850 "to customize the thread header. Frame recognizers may filter the "
851 "list. Use 'thread backtrace -u (--unfiltered)' to see them all.",
852 "bt [<digit> | all]", 0,
false));
853 if (bt_regex_cmd_up) {
858 if (bt_regex_cmd_up->AddRegexCommand(
"^([[:digit:]]+)[[:space:]]*$",
859 "thread backtrace -c %1") &&
860 bt_regex_cmd_up->AddRegexCommand(
"^(-[^[:space:]].*)$",
861 "thread backtrace %1") &&
862 bt_regex_cmd_up->AddRegexCommand(
"^all[[:space:]]*$",
863 "thread backtrace all") &&
864 bt_regex_cmd_up->AddRegexCommand(
"^[[:space:]]*$",
865 "thread backtrace")) {
867 m_command_dict[std::string(command_sp->GetCommandName())] = command_sp;
871 std::unique_ptr<CommandObjectRegexCommand> list_regex_cmd_up(
873 *
this,
"_regexp-list",
874 "List relevant source code using one of several shorthand formats.",
876 "_regexp-list <file>:<line> // List around specific file/line\n"
877 "_regexp-list <line> // List current file around specified "
879 "_regexp-list <function-name> // List specified function\n"
880 "_regexp-list 0x<address> // List around specified address\n"
881 "_regexp-list -[<count>] // List previous <count> lines\n"
882 "_regexp-list // List subsequent lines",
884 if (list_regex_cmd_up) {
885 if (list_regex_cmd_up->AddRegexCommand(
"^([0-9]+)[[:space:]]*$",
886 "source list --line %1") &&
887 list_regex_cmd_up->AddRegexCommand(
888 "^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]"
890 "source list --file '%1' --line %2") &&
891 list_regex_cmd_up->AddRegexCommand(
892 "^\\*?(0x[[:xdigit:]]+)[[:space:]]*$",
893 "source list --address %1") &&
894 list_regex_cmd_up->AddRegexCommand(
"^-[[:space:]]*$",
895 "source list --reverse") &&
896 list_regex_cmd_up->AddRegexCommand(
897 "^-([[:digit:]]+)[[:space:]]*$",
898 "source list --reverse --count %1") &&
899 list_regex_cmd_up->AddRegexCommand(
"^(.+)$",
900 "source list --name \"%1\"") &&
901 list_regex_cmd_up->AddRegexCommand(
"^$",
"source list")) {
903 m_command_dict[std::string(list_regex_cmd_sp->GetCommandName())] =
908 std::unique_ptr<CommandObjectRegexCommand> env_regex_cmd_up(
910 *
this,
"_regexp-env",
911 "Shorthand for viewing and setting environment variables.",
913 "_regexp-env // Show environment\n"
914 "_regexp-env <name>=<value> // Set an environment variable",
916 if (env_regex_cmd_up) {
917 if (env_regex_cmd_up->AddRegexCommand(
"^$",
918 "settings show target.env-vars") &&
919 env_regex_cmd_up->AddRegexCommand(
"^([A-Za-z_][A-Za-z_0-9]*=.*)$",
920 "settings set target.env-vars %1")) {
927 std::unique_ptr<CommandObjectRegexCommand> jump_regex_cmd_up(
929 *
this,
"_regexp-jump",
"Set the program counter to a new address.",
931 "_regexp-jump <line>\n"
932 "_regexp-jump +<line-offset> | -<line-offset>\n"
933 "_regexp-jump <file>:<line>\n"
934 "_regexp-jump *<addr>\n",
936 if (jump_regex_cmd_up) {
937 if (jump_regex_cmd_up->AddRegexCommand(
"^\\*(.*)$",
938 "thread jump --addr %1") &&
939 jump_regex_cmd_up->AddRegexCommand(
"^([0-9]+)$",
940 "thread jump --line %1") &&
941 jump_regex_cmd_up->AddRegexCommand(
"^([^:]+):([0-9]+)$",
942 "thread jump --file %1 --line %2") &&
943 jump_regex_cmd_up->AddRegexCommand(
"^([+\\-][0-9]+)$",
944 "thread jump --by %1")) {
946 m_command_dict[std::string(jump_regex_cmd_sp->GetCommandName())] =
951 std::shared_ptr<CommandObjectRegexCommand> step_regex_cmd_sp(
953 *
this,
"_regexp-step",
954 "Single step, optionally to a specific function.",
956 "_regexp-step // Single step\n"
957 "_regexp-step <function-name> // Step into the named function\n",
959 if (step_regex_cmd_sp) {
960 if (step_regex_cmd_sp->AddRegexCommand(
"^[[:space:]]*$",
962 step_regex_cmd_sp->AddRegexCommand(
"^[[:space:]]*(-.+)$",
963 "thread step-in %1") &&
964 step_regex_cmd_sp->AddRegexCommand(
965 "^[[:space:]]*(.+)[[:space:]]*$",
966 "thread step-in --end-linenumber block --step-in-target %1")) {
967 m_command_dict[std::string(step_regex_cmd_sp->GetCommandName())] =
974 const char *cmd_str,
bool include_aliases,
StringList &matches,
979 if (include_aliases) {
992 auto get_multi_or_report_error =
997 "Path component: '%s' not found", name);
1000 if (!cmd_sp->IsUserCommand()) {
1002 "Path component: '%s' is not a user "
1008 if (!cmd_as_multi) {
1010 "Path component: '%s' is not a container "
1015 return cmd_as_multi;
1019 if (num_args == 0) {
1024 if (num_args == 1 && leaf_is_command) {
1034 get_multi_or_report_error(cur_cmd_sp, cur_name);
1035 if (cur_as_multi ==
nullptr)
1038 size_t num_path_elements = num_args - (leaf_is_command ? 1 : 0);
1039 for (
size_t cursor = 1; cursor < num_path_elements && cur_as_multi !=
nullptr;
1043 cur_as_multi = get_multi_or_report_error(cur_cmd_sp, cur_name);
1045 return cur_as_multi;
1052 auto frame_language =
1065 auto lang_name =
plugin->GetPluginName();
1067 return language_cmd_sp->GetSubcommandSPExact(lang_name);
1076 std::string cmd = std::string(cmd_str);
1081 command_sp = pos->second;
1087 command_sp = alias_pos->second;
1093 command_sp = pos->second;
1099 command_sp = pos->second;
1102 if (!exact && !command_sp) {
1109 if (matches ==
nullptr)
1110 matches = &local_matches;
1112 unsigned int num_cmd_matches = 0;
1113 unsigned int num_alias_matches = 0;
1114 unsigned int num_user_matches = 0;
1115 unsigned int num_user_mw_matches = 0;
1123 *matches, descriptions);
1126 if (num_cmd_matches == 1) {
1130 real_match_sp = pos->second;
1135 *matches, descriptions);
1138 if (num_alias_matches == 1) {
1142 alias_match_sp = alias_pos->second;
1147 *matches, descriptions);
1150 if (num_user_matches == 1) {
1156 user_match_sp = pos->second;
1164 if (num_user_mw_matches == 1) {
1170 user_mw_match_sp = pos->second;
1176 if (num_user_matches + num_user_mw_matches + num_cmd_matches +
1177 num_alias_matches ==
1179 if (num_cmd_matches)
1180 return real_match_sp;
1181 else if (num_alias_matches)
1182 return alias_match_sp;
1183 else if (num_user_mw_matches)
1184 return user_mw_match_sp;
1186 return user_match_sp;
1200 if (!command_sp && !exact && lang_subcmd) {
1203 cmd_str, lang_matches, descriptions);
1206 if (lang_matches.
GetSize() == 1) {
1208 auto pos = lang_dict.find(lang_matches[0]);
1209 if (pos != lang_dict.end())
1215 if (matches && command_sp) {
1228 lldbassert((
this == &cmd_sp->GetCommandInterpreter()) &&
1229 "tried to add a CommandObject from a different interpreter");
1234 cmd_sp->SetIsUserCommand(
false);
1236 std::string name_sstr(name);
1239 if (!can_replace || !name_iter->second->IsRemovable())
1241 name_iter->second = cmd_sp;
1253 lldbassert((
this == &cmd_sp->GetCommandInterpreter()) &&
1254 "tried to add a CommandObject from a different interpreter");
1257 "can't use the empty string for a command name");
1269 "user command \"{0}\" already exists and force replace was not set "
1270 "by --overwrite or 'settings set interpreter.require-overwrite "
1275 if (cmd_sp->IsMultiwordObject()) {
1278 "can't replace explicitly non-removable multi-word command");
1282 if (!
m_user_dict[std::string(name)]->IsRemovable()) {
1284 "can't replace explicitly non-removable command");
1290 cmd_sp->SetIsUserCommand(
true);
1292 if (cmd_sp->IsMultiwordObject())
1301 bool include_aliases)
const {
1303 Args cmd_words(cmd_str);
1305 if (cmd_str.empty())
1322 for (
size_t i = 1; i < end; ++i) {
1323 if (!cmd_obj_sp->IsMultiwordObject()) {
1348 matches, descriptions)
1354 std::string cmd_str(cmd);
1356 auto found_elem = map.find(cmd);
1357 if (found_elem == map.end())
1380 StringList *matches_ptr = matches ? matches : &tmp_list;
1392 auto found_elem = map.find(cmd);
1393 if (found_elem == map.end())
1415 StringList *matches_ptr = matches ? matches : &tmp_list;
1426 std::string &full_name)
const {
1429 full_name.assign(std::string(cmd));
1433 size_t num_alias_matches;
1436 if (num_alias_matches == 1) {
1439 const bool include_aliases =
false;
1440 const bool exact =
false;
1442 GetCommandSP(cmd, include_aliases, exact, ®ular_matches));
1443 if (cmd_obj_sp || regular_matches.
GetSize() > 0)
1469 llvm::StringRef args_string) {
1470 if (command_obj_sp.get())
1471 lldbassert((
this == &command_obj_sp->GetCommandInterpreter()) &&
1472 "tried to add a CommandObject from a different interpreter");
1474 std::unique_ptr<CommandAlias> command_alias_up(
1475 new CommandAlias(*
this, command_obj_sp, args_string, alias_name));
1477 if (command_alias_up && command_alias_up->IsValid()) {
1480 return command_alias_up.release();
1498 if (force || pos->second->IsRemovable()) {
1509 CommandObject::CommandMap::iterator pos =
m_user_dict.find(user_name);
1518 CommandObject::CommandMap::iterator pos =
m_user_mw_dict.find(multi_name);
1527 uint32_t cmd_types) {
1528 llvm::StringRef help_prologue(
GetDebugger().GetIOHandlerHelpPrologue());
1529 if (!help_prologue.empty()) {
1534 CommandObject::CommandMap::const_iterator pos;
1543 (pos->first.compare(0, 1,
"_") == 0))
1547 pos->second->GetHelp(), max_len);
1555 "Current command abbreviations "
1556 "(type '%shelp command alias' for more info):\n",
1564 alias_pos->second->GetHelp(), max_len);
1576 pos->second->GetHelp(), max_len);
1583 result.
AppendMessage(
"Current user-defined container commands:");
1588 pos->second->GetHelp(), max_len);
1594 "For more information on any command, type '%shelp <command-name>'.\n",
1599 llvm::StringRef &command_string) {
1605 size_t start = command_string.find_first_not_of(
k_white_space);
1609 if (start != std::string::npos) {
1612 if (end == std::string::npos)
1613 end = command_string.size();
1614 std::string cmd_word =
1615 std::string(command_string.substr(start, end - start));
1617 if (cmd_obj ==
nullptr)
1627 cmd_obj = sub_cmd_obj;
1639 end >= command_string.size())
1642 start = command_string.find_first_not_of(
k_white_space, end);
1648 command_string = command_string.substr(end);
1653 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
1657 if (pos == std::string::npos)
1666 const size_t s_len = s.size();
1668 while (offset < s_len) {
1669 size_t pos = s.find(
"--", offset);
1670 if (pos == std::string::npos)
1673 if (llvm::isSpace(s[pos - 1])) {
1676 if ((pos + 2 >= s_len) || llvm::isSpace(s[pos + 2])) {
1683 return std::string::npos;
1687 std::string &suffix,
char "e_char) {
1692 bool result =
false;
1695 if (!command_string.empty()) {
1696 const char first_char = command_string[0];
1697 if (first_char ==
'\'' || first_char ==
'"') {
1698 quote_char = first_char;
1699 const size_t end_quote_pos = command_string.find(quote_char, 1);
1700 if (end_quote_pos == std::string::npos) {
1701 command.swap(command_string);
1702 command_string.erase();
1704 command.assign(command_string, 1, end_quote_pos - 1);
1705 if (end_quote_pos + 1 < command_string.size())
1706 command_string.erase(0, command_string.find_first_not_of(
1709 command_string.erase();
1712 const size_t first_space_pos =
1714 if (first_space_pos == std::string::npos) {
1715 command.swap(command_string);
1716 command_string.erase();
1718 command.assign(command_string, 0, first_space_pos);
1719 command_string.erase(0, command_string.find_first_not_of(
1726 if (!command.empty()) {
1728 if (command[0] !=
'-' && command[0] !=
'_') {
1730 if (pos > 0 && pos != std::string::npos) {
1731 suffix.assign(command.begin() + pos, command.end());
1741 llvm::StringRef alias_name, std::string &raw_input_string,
1744 Args cmd_args(raw_input_string);
1748 if (!alias_cmd_obj || !alias_cmd_obj->
IsAlias()) {
1749 alias_result.clear();
1750 return alias_cmd_obj;
1752 std::pair<CommandObjectSP, OptionArgVectorSP> desugared =
1755 alias_cmd_obj = desugared.first.get();
1756 std::string alias_name_str = std::string(alias_name);
1759 cmd_args.
Unshift(alias_name_str);
1763 if (!option_arg_vector_sp.get()) {
1764 alias_result = std::string(result_str.
GetString());
1765 return alias_cmd_obj;
1772 for (
const auto &entry : *option_arg_vector) {
1773 std::tie(option, value_type, value) = entry;
1775 result_str.
Printf(
" %s", value.c_str());
1779 result_str.
Printf(
" %s", option.c_str());
1787 result_str.
Printf(
"%s", value.c_str());
1791 "need at least %d arguments to use "
1797 size_t strpos = raw_input_string.find(entry.
c_str());
1799 if (strpos != std::string::npos) {
1800 const size_t start_fudge = quote_char ==
'\0' ? 0 : 1;
1801 const size_t len_fudge = quote_char ==
'\0' ? 0 : 2;
1804 if (strpos < start_fudge) {
1805 result.
AppendError(
"unmatched quote at command beginning");
1808 llvm::StringRef arg_text = entry.
ref();
1809 if (strpos - start_fudge + arg_text.size() + len_fudge >
1810 raw_input_string.size()) {
1811 result.
AppendError(
"unmatched quote at command end");
1814 raw_input_string = raw_input_string.erase(
1815 strpos - start_fudge,
1818 if (quote_char ==
'\0')
1821 result_str.
Printf(
"%c%s%c", quote_char, entry.
c_str(), quote_char);
1825 alias_result = std::string(result_str.
GetString());
1826 return alias_cmd_obj;
1837 size_t start_backtick;
1839 while ((start_backtick = command.find(
'`', pos)) != std::string::npos) {
1844 if (start_backtick > 0 && command[start_backtick - 1] ==
'\\') {
1847 command.erase(start_backtick - 1, 1);
1849 pos = start_backtick;
1853 const size_t expr_content_start = start_backtick + 1;
1854 const size_t end_backtick = command.find(
'`', expr_content_start);
1856 if (end_backtick == std::string::npos) {
1861 if (end_backtick == expr_content_start) {
1863 command.erase(start_backtick, 2);
1867 std::string expr_str(command, expr_content_start,
1868 end_backtick - expr_content_start);
1874 command.erase(start_backtick, end_backtick - start_backtick + 1);
1875 command.insert(start_backtick, std::string(expr_str));
1876 pos = start_backtick + expr_str.size();
1902 expr_str.c_str(), exe_ctx.
GetFramePtr(), expr_result_valobj_sp, options);
1906 if (expr_result_valobj_sp)
1907 expr_result_valobj_sp =
1908 expr_result_valobj_sp->GetQualifiedRepresentationIfAvailable(
1909 expr_result_valobj_sp->GetDynamicValueType(),
true);
1910 if (expr_result_valobj_sp->ResolveValue(scalar)) {
1913 const bool show_type =
false;
1914 scalar.
GetValue(value_strm, show_type);
1915 size_t value_string_size = value_strm.
GetSize();
1916 if (value_string_size) {
1917 expr_str = value_strm.
GetData();
1921 "in a scalar value for the "
1928 "in a scalar value for the "
1939 if (expr_result_valobj_sp)
1940 error = expr_result_valobj_sp->GetError().Clone();
1942 if (
error.Success()) {
1944 "for the expression '" + expr_str +
"'";
1956 bool status =
HandleCommand(command_line, lazy_add_to_history, result);
1964 bool force_repeat_command) {
1969 std::string parsed_command_args;
1973 const bool detailed_command_telemetry =
1979 std::string command_string(command_line);
1980 std::string original_command_string(command_string);
1981 std::string real_original_command_string(command_string);
1987 info->
target_uuid = target->GetExecutableModule() !=
nullptr
1988 ? target->GetExecutableModule()->GetUUID()
1991 if (detailed_command_telemetry)
1998 detailed_command_telemetry, command_id](
2004 llvm::StringRef command_name =
2008 if (std::string error_str = result.
GetErrorString(); !error_str.empty())
2011 if (detailed_command_telemetry)
2012 info->
args = parsed_command_args;
2016 LLDB_LOGF(log,
"Processing command: %s", command_line);
2028 bool add_to_history;
2032 add_to_history = (lazy_add_to_history ==
eLazyBoolYes);
2040 transcript_item = std::make_shared<StructuredData::Dictionary>();
2041 transcript_item->AddStringItem(
"command", command_line);
2042 transcript_item->AddIntegerItem(
2043 "timestampInEpochSeconds",
2044 std::chrono::duration_cast<std::chrono::seconds>(
2045 std::chrono::system_clock::now().time_since_epoch())
2050 bool empty_command =
false;
2051 bool comment_command =
false;
2052 if (command_string.empty())
2053 empty_command =
true;
2055 const char *k_space_characters =
"\t\n\v\f\r ";
2057 size_t non_space = command_string.find_first_not_of(k_space_characters);
2060 if (non_space == std::string::npos)
2061 empty_command =
true;
2063 comment_command =
true;
2065 llvm::StringRef search_str(command_string);
2066 search_str = search_str.drop_front(non_space);
2068 add_to_history =
false;
2069 command_string = std::string(*hist_str);
2070 original_command_string = std::string(*hist_str);
2073 command_string.c_str());
2079 if (empty_command) {
2091 command_string = command_line;
2092 original_command_string = command_line;
2098 add_to_history =
false;
2099 }
else if (comment_command) {
2139 llvm::StringRef command_name =
2141 LLDB_LOGF(log,
"HandleCommand, cmd_obj : '%s'", command_name.str().c_str());
2142 LLDB_LOGF(log,
"HandleCommand, (revised) command_string: '%s'",
2143 command_string.c_str());
2144 const bool wants_raw_input =
2146 LLDB_LOGF(log,
"HandleCommand, wants_raw_input:'%s'",
2147 wants_raw_input ?
"True" :
"False");
2155 if (cmd_obj !=
nullptr) {
2156 bool generate_repeat_command = add_to_history;
2160 generate_repeat_command |= empty_command;
2165 generate_repeat_command |= force_repeat_command;
2166 if (generate_repeat_command) {
2167 Args command_args(command_string);
2168 std::optional<std::string> repeat_command =
2170 if (repeat_command) {
2171 LLDB_LOGF(log,
"Repeat command: %s", repeat_command->data());
2181 const std::size_t actual_cmd_name_len = cmd_obj->
GetCommandName().size();
2182 if (actual_cmd_name_len < command_string.length())
2183 parsed_command_args = command_string.substr(actual_cmd_name_len);
2186 size_t pos = parsed_command_args.find_first_not_of(
k_white_space);
2187 if (pos != 0 && pos != std::string::npos)
2188 parsed_command_args.erase(0, pos);
2191 log,
"HandleCommand, command line after removing command name(s): '%s'",
2192 parsed_command_args.c_str());
2197 if (transcript_item) {
2198 transcript_item->AddStringItem(
"commandName", cmd_obj->
GetCommandName());
2199 transcript_item->AddStringItem(
"commandArguments", parsed_command_args);
2205 pos = real_original_command_string.rfind(parsed_command_args);
2206 std::optional<uint16_t> indent;
2207 if (pos != std::string::npos)
2210 cmd_obj->
Execute(parsed_command_args.c_str(), result);
2213 LLDB_LOGF(log,
"HandleCommand, command %s",
2214 (result.
Succeeded() ?
"succeeded" :
"did not succeed"));
2219 if (transcript_item) {
2224 transcript_item->AddStringItem(
"error", result.
GetErrorString());
2225 transcript_item->AddFloatItem(
"durationInSeconds",
2226 execute_time.
get().count());
2233 bool look_for_subcommand =
false;
2239 bool include_aliases =
true;
2250 &new_matches, &new_descriptions);
2257 look_for_subcommand =
true;
2272 if (command_object) {
2285 if (!first_arg.empty()) {
2290 request.
AddCompletion(*hist_str,
"Previous command history event",
2299std::optional<std::string>
2302 return std::nullopt;
2304 for (
int i = s - 1; i >= 0; --i) {
2306 if (entry.consume_front(line))
2309 return std::nullopt;
2313 EventSP prompt_change_event_sp(
2329 return default_answer;
2366 const char *alias_name,
2368 std::string &raw_input_string,
2376 std::string alias_name_str = alias_name;
2378 cmd_args.
Unshift(alias_name_str);
2384 if (option_arg_vector_sp.get()) {
2385 if (wants_raw_input) {
2389 size_t pos = raw_input_string.find(
" -- ");
2390 if (pos == std::string::npos) {
2392 raw_input_string.insert(0,
" -- ");
2398 std::vector<bool> used(old_size + 1,
false);
2405 for (
const auto &option_entry : *option_arg_vector) {
2406 std::tie(option, value_type, value) = option_entry;
2408 if (!wants_raw_input || (value !=
"--")) {
2432 "need at least %d arguments to use "
2440 if (strpos != std::string::npos) {
2441 raw_input_string = raw_input_string.erase(
2454 for (
auto entry : llvm::enumerate(cmd_args.
entries())) {
2455 if (!used[entry.index()] && !wants_raw_input)
2468 if (wants_raw_input) {
2484 const char *cptr = in_string;
2487 if (cptr[0] ==
'%') {
2491 if (isdigit(cptr[0])) {
2492 const char *start = cptr;
2493 while (isdigit(cptr[0]))
2498 if (cptr[0] ==
'\0')
2499 position = atoi(start);
2507 std::string init_file_name =
".lldbinit";
2508 if (!suffix.empty()) {
2509 init_file_name.append(
"-");
2510 init_file_name.append(suffix.str());
2521 language = *main_repl_language;
2526 std::string init_file_name =
2527 (llvm::Twine(
".lldbinit-") +
2529 llvm::Twine(
"-repl"))
2537 llvm::StringRef s =
".lldbinit";
2538 init_file.assign(s.begin(), s.end());
2570 llvm::SmallString<128> init_file;
2580 switch (should_load) {
2590 if (llvm::sys::path::parent_path(init_file) ==
2591 llvm::sys::path::parent_path(home_init_file.
GetPath())) {
2616 if (init_file.
GetPath().empty())
2620 llvm::StringRef program_name =
2621 HostInfo::GetProgramFileSpec().GetFilename().GetStringRef();
2625 init_file = program_init_file;
2632#ifdef LLDB_GLOBAL_INIT_DIRECTORY
2634 FileSpec init_file(LLDB_GLOBAL_INIT_DIRECTORY);
2648 return prefix ==
nullptr ?
"" : prefix;
2653 if (prefer_target_platform) {
2661 platform_sp =
m_debugger.GetPlatformList().GetSelectedPlatform();
2667 TargetSP target_sp = exe_ctx.GetTargetSP();
2671 ProcessSP process_sp(target_sp->GetProcessSP());
2678 for (
const auto &thread_sp : process_sp->GetThreadList().Threads()) {
2679 StopInfoSP stop_info = thread_sp->GetStopInfo();
2687 const StopReason reason = stop_info->GetStopReason();
2695 const auto stop_signal =
static_cast<int32_t
>(stop_info->GetValue());
2697 if (!signals_sp || !signals_sp->SignalIsValid(stop_signal))
2701 const auto sigint_num = signals_sp->GetSignalNumberFromName(
"SIGINT");
2702 const auto sigstop_num = signals_sp->GetSignalNumberFromName(
"SIGSTOP");
2703 if ((stop_signal != sigint_num) && (stop_signal != sigstop_num))
2724 size_t num_lines = commands.
GetSize();
2730 bool old_async_execution =
m_debugger.GetAsyncExecution();
2736 for (
size_t idx = 0; idx < num_lines; idx++) {
2765 if (!success || !tmp_result.
Succeeded()) {
2767 if (error_msg.empty())
2768 error_msg =
"<unknown error>.\n";
2771 "command #{0}: '{1}' failed with {2}",
2772 (uint64_t)idx, cmd, error_msg);
2773 m_debugger.SetAsyncExecution(old_async_execution);
2778 (uint64_t)idx + 1, cmd, error_msg);
2799 if (idx != num_lines - 1)
2801 "Aborting reading of commands after command #%" PRIu64
2802 ": '%s' continued the target.\n",
2803 (uint64_t)idx + 1, cmd);
2806 " '%s' continued the target.\n",
2807 (uint64_t)idx + 1, cmd);
2810 m_debugger.SetAsyncExecution(old_async_execution);
2819 if (idx != num_lines - 1)
2821 "Aborting reading of commands after command #%" PRIu64
2822 ": '%s' stopped with a signal or exception.\n",
2823 (uint64_t)idx + 1, cmd);
2826 "Command #%" PRIu64
" '%s' stopped with a signal or exception.\n",
2827 (uint64_t)idx + 1, cmd);
2830 m_debugger.SetAsyncExecution(old_async_execution);
2837 m_debugger.SetAsyncExecution(old_async_execution);
2866 "Error reading commands from file %s - file not found.\n",
2871 std::string cmd_file_path = cmd_file.
GetPath();
2872 auto input_file_up =
2874 if (!input_file_up) {
2875 std::string
error = llvm::toString(input_file_up.takeError());
2877 "error: an error occurred read file '{0}': {1}\n", cmd_file_path,
2878 llvm::fmt_consume(input_file_up.takeError()));
2881 FileSP input_file_sp =
FileSP(std::move(input_file_up.get()));
2968 cmd_file_path.c_str());
2984 debugger.
GetPrompt(), llvm::StringRef(),
3014 llvm::StringRef prefix,
3015 llvm::StringRef help_text) {
3016 const uint32_t max_columns =
m_debugger.GetTerminalWidth();
3018 size_t line_width_max = max_columns - prefix.size();
3019 if (line_width_max < 16)
3020 line_width_max = help_text.size() + prefix.size();
3023 bool prefixed_yet =
false;
3025 if (help_text.empty())
3026 help_text =
"No help text";
3027 while (!help_text.empty()) {
3029 if (!prefixed_yet) {
3031 prefixed_yet =
true;
3036 llvm::StringRef this_line = help_text.substr(0, line_width_max);
3039 std::size_t first_newline = this_line.find_first_of(
"\n");
3042 std::size_t last_space = llvm::StringRef::npos;
3043 if (this_line.size() != help_text.size())
3044 last_space = this_line.find_last_of(
" \t");
3047 this_line = this_line.substr(0, std::min(first_newline, last_space));
3052 help_text = help_text.drop_front(this_line.size()).ltrim();
3058 llvm::StringRef word_text,
3059 llvm::StringRef separator,
3060 llvm::StringRef help_text,
3061 size_t max_word_len) {
3063 prefix_stream.
Printf(
" %-*s %*s ", (
int)max_word_len, word_text.data(),
3064 (
int)separator.size(), separator.data());
3069 llvm::StringRef separator,
3070 llvm::StringRef help_text,
3071 uint32_t max_word_len) {
3072 int indent_size = max_word_len + separator.size() + 2;
3077 text_strm.
Printf(
"%-*s ", (
int)max_word_len, word_text.data());
3078 text_strm << separator <<
" " << help_text;
3080 const uint32_t max_columns =
m_debugger.GetTerminalWidth();
3082 llvm::StringRef text = text_strm.
GetString();
3084 uint32_t chars_left = max_columns;
3086 auto nextWordLength = [](llvm::StringRef S) {
3087 size_t pos = S.find(
' ');
3088 return pos == llvm::StringRef::npos ? S.size() : pos;
3091 while (!text.empty()) {
3092 if (text.front() ==
'\n' ||
3093 (text.front() ==
' ' && nextWordLength(text.ltrim(
' ')) > chars_left)) {
3096 chars_left = max_columns - indent_size;
3097 if (text.front() ==
'\n')
3098 text = text.drop_front();
3100 text = text.ltrim(
' ');
3104 text = text.drop_front();
3113 llvm::StringRef search_word,
StringList &commands_found,
3115 for (
const auto &pair : command_map) {
3116 llvm::StringRef command_name = pair.first;
3119 const bool search_short_help =
true;
3120 const bool search_long_help =
false;
3121 const bool search_syntax =
false;
3122 const bool search_options =
false;
3123 if (command_name.contains_insensitive(search_word) ||
3125 search_long_help, search_syntax,
3134 multiword_cmd->GetSubcommandDictionary());
3135 for (
const auto &subcommand_name : subcommands_found) {
3136 std::string qualified_name =
3137 (command_name +
" " + subcommand_name).str();
3147 bool search_builtin_commands,
3148 bool search_user_commands,
3149 bool search_alias_commands,
3150 bool search_user_mw_commands) {
3151 CommandObject::CommandMap::const_iterator pos;
3153 if (search_builtin_commands)
3157 if (search_user_commands)
3161 if (search_user_mw_commands)
3165 if (search_alias_commands)
3188 m_debugger.FlushProcessOutput(*process_sp,
true,
3217 if (!
m_debugger.IsIOHandlerThreadCurrentThread())
3220 bool was_interrupted =
3223 return was_interrupted;
3227 llvm::StringRef str,
3234 bool had_output = !str.empty();
3235 while (!str.empty()) {
3236 llvm::StringRef line;
3237 std::tie(line, str) = str.split(
'\n');
3240 stream_file.
Write(line.data(), line.size());
3241 stream_file.
Write(
"\n", 1);
3248 stream_file.
Printf(
"\n... Interrupted.\n");
3249 stream_file.
Flush();
3253 llvm::StringRef line,
const Flags &io_handler_flags)
const {
3257 llvm::StringRef command = line.trim();
3258 if (command.empty())
3268 std::string &line) {
3274 const bool allow_repeats =
3277 if (!is_interactive && !allow_repeats) {
3286 if (!is_interactive) {
3300 bool pushed_exe_ctx =
false;
3303 pushed_exe_ctx =
true;
3305 auto finalize = llvm::make_scope_exit([
this, pushed_exe_ctx]() {
3314 if ((result.Succeeded() &&
3319 const bool inline_diagnostics = !result.GetImmediateErrorStream() &&
3321 if (inline_diagnostics) {
3322 unsigned prompt_len =
m_debugger.GetPrompt().size();
3323 if (
auto indent = result.GetDiagnosticIndent()) {
3325 result.GetInlineDiagnosticString(prompt_len + *indent);
3333 if (!result.GetImmediateOutputStream()) {
3334 llvm::StringRef output = result.GetOutputString();
3339 if (!result.GetImmediateErrorStream()) {
3340 std::string
error = result.GetErrorString(!inline_diagnostics);
3348 DefaultPrintCallback(result);
3350 DefaultPrintCallback(result);
3356 switch (result.GetStatus()) {
3370 m_result.IncrementNumberOfErrors();
3385 result.GetDidChangeProcessState() &&
3410 if (script_interpreter) {
3419 if (output_file == std::nullopt || output_file->empty()) {
3420 std::string now = llvm::to_string(std::chrono::system_clock::now());
3421 llvm::replace(now,
' ',
'_');
3423 llvm::replace(now,
':',
'-');
3424 const std::string file_name =
"lldb_session_" + now +
".log";
3429 save_location = HostInfo::GetGlobalTempDir();
3433 output_file = save_location.
GetPath();
3436 auto error_out = [&](llvm::StringRef error_message, std::string description) {
3438 output_file, description);
3440 "Failed to save session's transcripts to {0}!", *output_file);
3451 return error_out(
"Unable to create file",
3452 llvm::toString(opened_file.takeError()));
3454 FileUP file = std::move(opened_file.get());
3461 return error_out(
"Unable to write to destination file",
3462 "Bytes written do not match transcript size.");
3466 output_file->c_str());
3469 "Note: the setting interpreter.save-transcript is set to false, so the "
3470 "transcript might not have been recorded.");
3474 error = file->GetFileSpec(
const_cast<FileSpec &
>(file_spec));
3475 if (
error.Success()) {
3477 m_debugger.GetExternalEditor(), file_spec, 1))
3501 llvm::StringRef(prompt),
3508 if (io_handler_sp) {
3509 io_handler_sp->SetUserData(baton);
3520 llvm::StringRef(prompt),
3527 if (io_handler_sp) {
3528 io_handler_sp->SetUserData(baton);
3588 bool force_create =
true;
3602 m_debugger.SetIOHandlerThread(new_io_handler_thread);
3604 m_debugger.SetIOHandlerThread(old_io_handler_thread);
3616 std::string scratch_command(command_line);
3620 bool wants_raw_input =
false;
3621 std::string next_word;
3625 auto build_alias_cmd = [&](std::string &full_name) {
3626 revised_command_line.
Clear();
3628 std::string alias_result;
3631 revised_command_line.
Printf(
"%s", alias_result.c_str());
3638 char quote_char =
'\0';
3641 if (cmd_obj ==
nullptr) {
3642 std::string full_name;
3645 bool is_real_command =
3646 (!is_alias) || (cmd_obj !=
nullptr && !cmd_obj->
IsAlias());
3647 if (!is_real_command) {
3648 build_alias_cmd(full_name);
3652 revised_command_line.
Printf(
"%s", cmd_name.str().c_str());
3655 revised_command_line.
Printf(
"%s", next_word.c_str());
3666 revised_command_line.
Clear();
3667 revised_command_line.
Printf(
"%s", sub_cmd_name.str().c_str());
3668 cmd_obj = sub_cmd_obj;
3672 revised_command_line.
Printf(
" %c%s%s%c", quote_char,
3673 next_word.c_str(), suffix.c_str(),
3676 revised_command_line.
Printf(
" %s%s", next_word.c_str(),
3682 revised_command_line.
Printf(
" %c%s%s%c", quote_char,
3683 next_word.c_str(), suffix.c_str(),
3686 revised_command_line.
Printf(
" %s%s", next_word.c_str(),
3692 if (cmd_obj ==
nullptr) {
3693 const size_t num_matches = matches.
GetSize();
3698 if (alias_matches.
GetSize() == 1) {
3699 std::string full_name;
3701 build_alias_cmd(full_name);
3702 done =
static_cast<bool>(cmd_obj);
3705 error_msg.
Printf(
"Ambiguous command '%s'. Possible matches:\n",
3708 for (uint32_t i = 0; i < num_matches; ++i) {
3724 if (!suffix.empty()) {
3726 "command '%s' did not recognize '%s%s%s' as valid (subcommand "
3727 "might be invalid).\n",
3729 next_word.empty() ?
"" : next_word.c_str(),
3730 next_word.empty() ?
" -- " :
" ", suffix.c_str());
3736 if (!suffix.empty()) {
3737 switch (suffix[0]) {
3742 if (command_options &&
3744 std::string gdb_format_option(
"--gdb-format=");
3745 gdb_format_option += (suffix.c_str() + 1);
3747 std::string cmd = std::string(revised_command_line.
GetString());
3749 if (arg_terminator_idx != std::string::npos) {
3752 gdb_format_option.append(1,
' ');
3753 cmd.insert(arg_terminator_idx, gdb_format_option);
3754 revised_command_line.
Clear();
3757 revised_command_line.
Printf(
" %s", gdb_format_option.c_str());
3759 if (wants_raw_input &&
3764 "the '%s' command doesn't support the --gdb-format option\n",
3773 "unknown command shorthand suffix: '%s'\n", suffix.c_str());
3778 if (scratch_command.empty())
3782 if (!scratch_command.empty())
3783 revised_command_line.
Printf(
" %s", scratch_command.c_str());
3785 if (cmd_obj !=
nullptr)
3786 command_line = std::string(revised_command_line.
GetString());
3792 llvm::json::Object stats;
3794 stats.try_emplace(command_usage.getKey(), command_usage.getValue());
static const char * k_valid_command_chars
static constexpr const char * InitFileWarning
static size_t FindArgumentTerminator(const std::string &s)
static void GetHomeInitFile(FileSpec &init_file, llvm::StringRef suffix={})
#define REGISTER_COMMAND_OBJECT(NAME, CLASS)
static void StripLeadingSpaces(std::string &s)
static void GetCwdInitFile(llvm::SmallVectorImpl< char > &init_file)
static void GetHomeREPLInitFile(FileSpec &init_file, LanguageType language)
@ eHandleCommandFlagAllowRepeats
@ eHandleCommandFlagStopOnCrash
@ eHandleCommandFlagEchoCommentCommand
@ eHandleCommandFlagStopOnError
@ eHandleCommandFlagStopOnContinue
@ eHandleCommandFlagPrintErrors
@ eHandleCommandFlagEchoCommand
@ eHandleCommandFlagPrintResult
static const char * k_white_space
static bool ExtractCommand(std::string &command_string, std::string &command, std::string &suffix, char "e_char)
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_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOGF(log,...)
static double elapsed(const StatsTimepoint &start, const StatsTimepoint &end)
#define LLDB_SCOPED_TIMER()
#define LLDB_SCOPED_TIMERF(...)
A command line argument class.
void Unshift(llvm::StringRef arg_str, char quote_char='\0')
Inserts a class owned copy of arg_str at the beginning of the argument vector.
void Shift()
Shifts the first argument C string value of the array off the argument array.
void SetArguments(size_t argc, const char **argv)
Sets the argument vector value, optionally copying all arguments into an internal buffer.
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.
llvm::ArrayRef< ArgEntry > entries() const
const char * GetArgumentAtIndex(size_t idx) const
Gets the NULL terminated C string argument pointer for the argument at index idx.
const char ** GetConstArgumentVector() const
Gets the argument vector.
void Clear()
Clear the arguments.
Broadcaster(lldb::BroadcasterManagerSP manager_sp, std::string name)
Construct with a broadcaster with a name.
void SetEventName(uint32_t event_mask, const char *name)
Set the name for an event bit.
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
void CheckInWithManager()
OptionArgVectorSP GetOptionArguments() const
void SetHelp(llvm::StringRef str) override
void SetHelpLong(llvm::StringRef str) override
static const char g_repeat_char
bool GetSpawnThread() const
void SetStopOnContinue(bool stop_on_continue)
void SetSilent(bool silent)
bool GetAutoHandleEvents() const
void SetPrintErrors(bool print_errors)
LazyBool m_add_to_history
bool GetStopOnCrash() const
bool GetAddToHistory() const
bool GetStopOnContinue() const
bool GetPrintResults() const
void SetStopOnError(bool stop_on_error)
bool GetStopOnError() const
bool GetEchoCommands() const
LazyBool m_echo_comment_commands
LazyBool m_stop_on_continue
CommandUsageMap m_command_usages
bool m_skip_lldbinit_files
bool GetSaveTranscript() const
bool EchoCommandNonInteractive(llvm::StringRef line, const Flags &io_handler_flags) const
void UpdatePrompt(llvm::StringRef prompt)
bool IOHandlerInterrupt(IOHandler &io_handler) override
lldb::IOHandlerSP m_command_io_handler_sp
void SetPromptOnQuit(bool enable)
lldb::CommandObjectSP GetFrameLanguageCommand() const
Return the language specific command object for the current frame.
void SourceInitFileHome(CommandReturnObject &result, bool is_repl)
We will first see if there is an application specific ".lldbinit" file whose name is "~/....
std::optional< std::string > GetAutoSuggestionForCommand(llvm::StringRef line)
Returns the auto-suggestion string that should be added to the given command line.
void IOHandlerInputComplete(IOHandler &io_handler, std::string &line) override
Called when a line or lines have been retrieved.
CommandReturnObjectCallback m_print_callback
An optional callback to handle printing the CommandReturnObject.
llvm::json::Value GetStatistics()
@ eBroadcastBitQuitCommandReceived
@ eBroadcastBitResetPrompt
@ eBroadcastBitThreadShouldExit
void UpdateUseColor(bool use_color)
void LoadCommandDictionary()
std::stack< ExecutionContext > m_overriden_exe_contexts
bool GetStopCmdSourceOnError() const
void OutputFormattedHelpText(Stream &strm, llvm::StringRef prefix, llvm::StringRef help_text)
bool Confirm(llvm::StringRef message, bool default_answer)
bool UserMultiwordCommandExists(llvm::StringRef cmd) const
Determine whether a root-level user multiword command with this name exists.
static llvm::StringRef GetStaticBroadcasterClass()
CommandObject * GetAliasCommandObject(llvm::StringRef cmd, StringList *matches=nullptr, StringList *descriptions=nullptr) const
static const char * g_no_argument
void SetEchoCommands(bool enable)
bool RemoveAlias(llvm::StringRef alias_name)
void SetSaveSessionDirectory(llvm::StringRef path)
bool HasAliasOptions() const
std::function< lldb::CommandReturnObjectCallbackResult( CommandReturnObject &)> CommandReturnObjectCallback
void SourceInitFile(FileSpec file, CommandReturnObject &result)
CommandAlias * AddAlias(llvm::StringRef alias_name, lldb::CommandObjectSP &command_obj_sp, llvm::StringRef args_string=llvm::StringRef())
int GetCommandNamesMatchingPartialString(const char *cmd_cstr, bool include_aliases, StringList &matches, StringList &descriptions)
void FindCommandsForApropos(llvm::StringRef word, StringList &commands_found, StringList &commands_help, bool search_builtin_commands, bool search_user_commands, bool search_alias_commands, bool search_user_mw_commands)
CommandObject * GetCommandObject(llvm::StringRef cmd, StringList *matches=nullptr, StringList *descriptions=nullptr) const
std::atomic< CommandHandlingState > m_command_state
Status PreprocessCommand(std::string &command)
CommandObject::CommandMap m_alias_dict
CommandObject * ResolveCommandImpl(std::string &command_line, CommandReturnObject &result)
CommandObject::CommandMap m_command_dict
ChildrenOmissionWarningStatus m_truncation_warning
Whether we truncated a value's list of children and whether the user has been told.
void SetOpenTranscriptInEditor(bool enable)
void HandleCompletion(CompletionRequest &request)
CommandInterpreterRunResult m_result
bool GetSpaceReplPrompts() const
@ eCommandTypesUserDef
scripted commands
@ eCommandTypesBuiltin
native commands such as "frame"
@ eCommandTypesHidden
commands prefixed with an underscore
@ eCommandTypesUserMW
multiword commands (command containers)
@ eCommandTypesAliases
aliases such as "po"
ChildrenOmissionWarningStatus m_max_depth_warning
Whether we reached the maximum child nesting depth and whether the user has been told.
void ResolveCommand(const char *command_line, CommandReturnObject &result)
bool SetQuitExitCode(int exit_code)
Sets the exit code for the quit command.
CommandInterpreterRunResult RunCommandInterpreter(CommandInterpreterRunOptions &options)
bool HandleCommand(const char *command_line, LazyBool add_to_history, const ExecutionContext &override_context, CommandReturnObject &result)
bool DidProcessStopAbnormally() const
CommandObject::CommandMap m_user_dict
std::optional< int > m_quit_exit_code
ExecutionContext GetExecutionContext() const
const CommandObject::CommandMap & GetUserCommands() const
CommandObject * GetUserCommandObject(llvm::StringRef cmd, StringList *matches=nullptr, StringList *descriptions=nullptr) const
void SourceInitFileGlobal(CommandReturnObject &result)
bool GetAliasFullName(llvm::StringRef cmd, std::string &full_name) const
CommandObjectMultiword * VerifyUserMultiwordCmdPath(Args &path, bool leaf_is_command, Status &result)
Look up the command pointed to by path encoded in the arguments of the incoming command object.
bool GetEchoCommentCommands() const
bool WasInterrupted() const
void HandleCompletionMatches(CompletionRequest &request)
Status AddUserCommand(llvm::StringRef name, const lldb::CommandObjectSP &cmd_sp, bool can_replace)
bool AddCommand(llvm::StringRef name, const lldb::CommandObjectSP &cmd_sp, bool can_replace)
void PrintCommandOutput(IOHandler &io_handler, llvm::StringRef str, bool is_stdout)
int m_iohandler_nesting_level
bool GetOpenTranscriptInEditor() const
bool AliasExists(llvm::StringRef cmd) const
Determine whether an alias command with this name exists.
bool GetExpandRegexAliases() const
int GetOptionArgumentPosition(const char *in_string)
Picks the number out of a string of the form "%NNN", otherwise return 0.
bool HasUserMultiwordCommands() const
void StartHandlingCommand()
void GetHelp(CommandReturnObject &result, uint32_t types=eCommandTypesAllThem)
bool CommandExists(llvm::StringRef cmd) const
Determine whether a root level, built-in command with this name exists.
bool GetPromptOnQuit() const
std::string m_repeat_command
const char * GetCommandPrefix()
bool SaveTranscript(CommandReturnObject &result, std::optional< std::string > output_file=std::nullopt)
Save the current debugger session transcript to a file on disk.
int GetQuitExitCode(bool &exited) const
Returns the exit code that the user has specified when running the 'quit' command.
lldb::PlatformSP GetPlatform(bool prefer_target_platform)
bool GetRequireCommandOverwrite() const
void RestoreExecutionContext()
void GetPythonCommandsFromIOHandler(const char *prompt, IOHandlerDelegate &delegate, void *baton=nullptr)
lldb::CommandObjectSP GetCommandSPExact(llvm::StringRef cmd, bool include_aliases=false) const
CommandInterpreter(Debugger &debugger, bool synchronous_execution)
const CommandAlias * GetAlias(llvm::StringRef alias_name) const
void FinishHandlingCommand()
bool RemoveUser(llvm::StringRef alias_name)
void GetLLDBCommandsFromIOHandler(const char *prompt, IOHandlerDelegate &delegate, void *baton=nullptr)
lldb::CommandObjectSP GetCommandSP(llvm::StringRef cmd, bool include_aliases=true, bool exact=true, StringList *matches=nullptr, StringList *descriptions=nullptr) const
void OutputHelpText(Stream &stream, llvm::StringRef command_word, llvm::StringRef separator, llvm::StringRef help_text, uint32_t max_word_len)
CommandObject * GetCommandObjectForCommand(llvm::StringRef &command_line)
static const char * g_need_argument
bool m_skip_app_init_files
void SetSynchronous(bool value)
uint32_t m_command_source_depth
Status PreprocessToken(std::string &token)
bool RemoveUserMultiword(llvm::StringRef multiword_name)
bool GetSaveSessionOnQuit() const
FileSpec GetSaveSessionDirectory() const
@ eNoOmission
No children were omitted.
bool UserCommandExists(llvm::StringRef cmd) const
Determine whether a root-level user command with this name exists.
bool GetRepeatPreviousCommand() const
lldb::IOHandlerSP GetIOHandler(bool force_create=false, CommandInterpreterRunOptions *options=nullptr)
bool m_batch_command_mode
bool HasUserCommands() const
const CommandObject::CommandMap & GetUserMultiwordCommands() const
void BuildAliasCommandArgs(CommandObject *alias_cmd_obj, const char *alias_name, Args &cmd_args, std::string &raw_input_string, CommandReturnObject &result)
std::vector< uint32_t > m_command_source_flags
CommandHistory m_command_history
CommandObject * BuildAliasResult(llvm::StringRef alias_name, std::string &raw_input_string, std::string &alias_result, CommandReturnObject &result)
void OverrideExecutionContext(const ExecutionContext &override_context)
bool SetBatchCommandMode(bool value)
const char * ProcessEmbeddedScriptCommands(const char *arg)
void AllowExitCodeOnQuit(bool allow)
Specify if the command interpreter should allow that the user can specify a custom exit code when cal...
CommandObject::CommandMap m_user_mw_dict
bool m_synchronous_execution
StreamString m_transcript_stream
Turn on settings interpreter.save-transcript for LLDB to populate this stream.
void SetPrintCallback(CommandReturnObjectCallback callback)
void HandleCommandsFromFile(FileSpec &file, const ExecutionContext &context, const CommandInterpreterRunOptions &options, CommandReturnObject &result)
Execute a list of commands from a file.
void SourceInitFileCwd(CommandReturnObject &result)
void SetSaveSessionOnQuit(bool enable)
static const char * g_argument
std::vector< FileSpec > m_command_source_dirs
A stack of directory paths.
void HandleCommands(const StringList &commands, const ExecutionContext &context, const CommandInterpreterRunOptions &options, CommandReturnObject &result)
Execute a list of commands in sequence.
void SetSaveTranscript(bool enable)
FileSpec GetCurrentSourceDir()
void SetEchoCommentCommands(bool enable)
StructuredData::Array m_transcript
Contains a list of handled commands and their details.
bool RemoveCommand(llvm::StringRef cmd, bool force=false)
Remove a command if it is removable (python or regex command).
const StructuredData::Array & GetTranscript() const
const CommandObject::CommandMap & GetAliases() const
bool GetEchoCommands() const
Implements dwim-print, a printing command that chooses the most direct, efficient,...
CommandObject::CommandMap & GetSubcommandDictionary()
lldb::CommandObjectSP GetSubcommandSPExact(llvm::StringRef sub_cmd) override
CommandObjectMultiword * GetAsMultiwordCommand() override
virtual bool WantsRawCommandString()=0
void SetOriginalCommandString(std::string s)
Set the command input as it appeared in the terminal.
llvm::StringRef GetCommandName() const
bool HelpTextContainsWord(llvm::StringRef search_word, bool search_short_help=true, bool search_long_help=true, bool search_syntax=true, bool search_options=true)
virtual bool IsMultiwordObject()
virtual void Execute(const char *args_string, CommandReturnObject &result)=0
std::map< std::string, lldb::CommandObjectSP, std::less<> > CommandMap
virtual std::optional< std::string > GetRepeatCommand(Args ¤t_command_args, uint32_t index)
Get the command that appropriate for a "repeat" of the current command.
virtual CommandObject * GetSubcommandObject(llvm::StringRef sub_cmd, StringList *matches=nullptr)
virtual CommandObjectMultiword * GetAsMultiwordCommand()
virtual Options * GetOptions()
void SetSyntax(llvm::StringRef str)
virtual void HandleCompletion(CompletionRequest &request)
This default version handles calling option argument completions and then calls HandleArgumentComplet...
virtual llvm::StringRef GetHelp()
void AppendMessage(llvm::StringRef in_string)
bool GetInteractive() const
void void AppendError(llvm::StringRef in_string)
std::string GetErrorString(bool with_diagnostics=true) const
Return the errors as a string.
llvm::StringRef GetOutputString() const
bool GetDidChangeProcessState() const
void SetSuppressImmediateOutput(bool b)
void SetInteractive(bool b)
void AppendRawError(llvm::StringRef in_string)
void SetStatus(lldb::ReturnStatus status)
void AppendErrorWithFormat(const char *format,...) __attribute__((format(printf
void AppendMessageWithFormat(const char *format,...) __attribute__((format(printf
void void AppendMessageWithFormatv(const char *format, Args &&...args)
void SetDiagnosticIndent(std::optional< uint16_t > indent)
lldb::ReturnStatus GetStatus() const
lldb::StreamSP GetImmediateErrorStream() const
void SetCommand(std::string command)
lldb::StreamSP GetImmediateOutputStream() const
void AppendErrorWithFormatv(const char *format, Args &&...args)
Stream & GetOutputStream()
"lldb/Utility/ArgCompletionRequest.h"
void AddCompletion(llvm::StringRef completion, llvm::StringRef description="", CompletionMode mode=CompletionMode::Normal)
Adds a possible completion string.
void AddCompletions(const StringList &completions)
Adds multiple possible completion strings.
const Args & GetParsedLine() const
void ShiftArguments()
Drops the first argument from the argument list.
void AppendEmptyArgument()
Adds an empty argument at the end of the argument list and moves the cursor to this new argument.
size_t GetCursorIndex() const
const char * AsCString(const char *value_if_empty=nullptr) const
Get the string value as a C string.
void SetAsyncExecution(bool async)
bool GetShowInlineDiagnostics() const
lldb::FileSP GetOutputFileSP()
const char * GetIOHandlerCommandPrefix()
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
void RunIOHandlerSync(const lldb::IOHandlerSP &reader_sp)
Run the given IO handler and block until it's complete.
llvm::StringRef GetPrompt() const
A class that measures elapsed time in an exception safe way.
void SetUnwindOnError(bool unwind=false)
void SetKeepInMemory(bool keep=true)
void SetCoerceToId(bool coerce=true)
void SetTryAllThreads(bool try_others=true)
void SetTimeout(const Timeout< std::micro > &timeout)
void SetIgnoreBreakpoints(bool ignore=false)
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
StackFrame * GetFramePtr() const
Returns a pointer to the frame object.
const lldb::StackFrameSP & GetFrameSP() const
Get accessor to get the frame shared pointer.
Target * GetTargetPtr() const
Returns a pointer to the target object.
bool HasTargetScope() const
Returns true the ExecutionContext object contains a valid target.
Process * GetProcessPtr() const
Returns a pointer to the process object.
FileSpec CopyByAppendingPathComponent(llvm::StringRef component) const
void AppendPathComponent(llvm::StringRef component)
const ConstString & GetFilename() const
Filename string const get accessor.
void MakeAbsolute(const FileSpec &dir)
Make the FileSpec absolute by treating it relative to dir.
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
FileSpec CopyByRemovingLastPathComponent() const
void Resolve(llvm::SmallVectorImpl< char > &path)
Resolve path to make it canonical.
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
static FileSystem & Instance()
bool Test(ValueType bit) const
Test a single flag bit.
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
static bool IsInteractiveGraphicSession()
Check if we're running in an interactive graphical session.
static llvm::Error OpenFileInExternalEditor(llvm::StringRef editor, const FileSpec &file_spec, uint32_t line_no)
IOHandlerDelegate(Completion completion=Completion::None)
virtual const char * GetPrompt()
bool GetIsInteractive()
Check if the input is being supplied interactively by a user.
lldb::LockableStreamFileSP GetErrorStreamFileSP()
lldb::LockableStreamFileSP GetOutputStreamFileSP()
static LanguageSet GetLanguagesSupportingREPLs()
static Language * FindPlugin(lldb::LanguageType language)
static const char * GetNameForLanguageType(lldb::LanguageType language)
static lldb::LanguageType GetPrimaryLanguage(lldb::LanguageType language)
A command line option parsing protocol class.
bool SupportsLongOption(const char *long_option)
A plug-in interface definition class for debugging a process.
lldb::StateType GetState()
Get accessor for the current process state.
Status Halt(bool clear_thread_plans=false, bool use_run_lock=true)
Halts a running process.
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
bool SetPropertyAtIndex(uint32_t idx, T t, const ExecutionContext *exe_ctx=nullptr) const
void GetValue(Stream &s, bool show_type) const
void Clear()
Clear the object state.
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
void Flush() override
Flush the stream.
const char * GetData() const
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Write(const void *src, size_t src_len)
Output character bytes to the stream.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
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.
size_t EOL()
Output and End of Line character to the stream.
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
void AppendList(const char **strv, int strc)
void AppendString(const std::string &s)
const char * GetStringAtIndex(size_t idx) const
void DeleteStringAtIndex(size_t id)
std::shared_ptr< Dictionary > DictionarySP
LoadCWDlldbinitFile GetLoadCWDlldbinitFile() const
static TargetProperties & GetGlobalProperties()
lldb::PlatformSP GetPlatform()
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)
Represents UUID's of various sizes.
const LLDBConfig * GetConfig()
static TelemetryManager * GetInstance()
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.
size_t FindLongestCommandWord(std::map< std::string, ValueType, std::less<> > &dict)
std::shared_ptr< OptionArgVector > OptionArgVectorSP
bool StateIsRunningState(lldb::StateType state)
Check if a state represents a state where the process or thread is running.
int AddNamesMatchingPartialString(const std::map< std::string, ValueType, std::less<> > &in_map, llvm::StringRef cmd_str, StringList &matches, StringList *descriptions=nullptr)
@ RewriteLine
The full line has been rewritten by the completion.
const char * toString(AppleArm64ExceptionClass EC)
std::vector< std::tuple< std::string, int, std::string > > OptionArgVector
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
std::shared_ptr< lldb_private::CommandObject > CommandObjectSP
std::shared_ptr< lldb_private::ValueObject > ValueObjectSP
std::unique_ptr< lldb_private::File > FileUP
@ eCommandInterpreterResultInferiorCrash
Stopped because the corresponding option was set and the inferior crashed.
@ eCommandInterpreterResultSuccess
Command interpreter finished successfully.
@ eCommandInterpreterResultCommandError
Stopped because the corresponding option was set and a command returned an error.
@ eCommandInterpreterResultQuitRequested
Stopped because quit was requested.
std::shared_ptr< lldb_private::UnixSignals > UnixSignalsSP
std::shared_ptr< lldb_private::Platform > PlatformSP
StateType
Process and Thread States.
@ eStateStopped
Process or thread is stopped and can be examined.
LanguageType
Programming language type.
@ eLanguageTypeUnknown
Unknown or invalid language value.
ExpressionResults
The results of expression evaluation.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Event > EventSP
@ eReturnStatusSuccessContinuingResult
@ eReturnStatusSuccessContinuingNoResult
@ eReturnStatusSuccessFinishResult
@ eReturnStatusSuccessFinishNoResult
std::shared_ptr< lldb_private::LockableStreamFile > LockableStreamFileSP
std::shared_ptr< lldb_private::StopInfo > StopInfoSP
StopReason
Thread stop reasons.
@ eStopReasonInstrumentation
@ eStopReasonHistoryBoundary
@ eStopReasonInterrupt
Thread requested interrupt.
@ eStopReasonProcessorTrace
std::shared_ptr< lldb_private::Target > TargetSP
std::shared_ptr< lldb_private::File > FileSP
@ eCommandReturnObjectPrintCallbackSkipped
The callback deferred printing the command return object.
const char * c_str() const
llvm::StringRef ref() const
char GetQuoteChar() const
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
std::optional< lldb::LanguageType > GetSingularLanguage()
If the set contains a single language only, return it.
std::optional< std::string > original_command
These two fields are not collected by default due to PII risks.
std::string command_name
The command name(eg., "breakpoint set")
std::optional< lldb::ReturnStatus > ret_status
Return status of a command and any error description in case of error.
UUID target_uuid
If the command is/can be associated with a target entry this field contains that target's UUID.
std::optional< std::string > args
uint64_t command_id
A unique ID for a command so the manager can match the start entry with its end entry.
static uint64_t GetNextID()
std::optional< std::string > error_data
const bool detailed_command_telemetry
Helper RAII class for collecting telemetry.
void DispatchOnExit(llvm::unique_function< void(Info *info)> final_callback)
void DispatchNow(llvm::unique_function< void(Info *info)> populate_fields_cb)