25#include "lldb/Host/Config.h"
69#include "llvm/ADT/STLExtras.h"
70#include "llvm/ADT/StringRef.h"
71#include "llvm/ADT/iterator.h"
72#include "llvm/Config/llvm-config.h"
73#include "llvm/Support/DynamicLibrary.h"
74#include "llvm/Support/FileSystem.h"
75#include "llvm/Support/FormatAdapters.h"
76#include "llvm/Support/Process.h"
77#include "llvm/Support/ThreadPool.h"
78#include "llvm/Support/Threading.h"
79#include "llvm/Support/raw_ostream.h"
91#include <system_error>
112 static std::mutex g_mutex;
123 "Never show disassembly when displaying a stop context.",
128 "Show disassembly when there is no debug information.",
133 "Show disassembly when there is no source information, or the source "
135 "is missing when displaying a stop context.",
140 "Always show disassembly when displaying a stop context.",
148 "Disable scripting languages.",
153 "Select python as the default scripting language.",
158 "Select the lldb default as the default scripting language.",
164 "Use no verbosity when running dwim-print."},
166 "Use partial verbosity when running dwim-print - display a message when "
167 "`expression` evaluation is used."},
169 "Use full verbosity when running dwim-print."},
176 "Highlight the stop column with ANSI terminal codes when color/ANSI "
177 "mode is enabled; otherwise, fall back to using a text-only caret (^) "
178 "as if \"caret-only\" mode was selected.",
183 "Highlight the stop column with ANSI terminal codes when running LLDB "
184 "with color/ANSI enabled.",
189 "Highlight the stop column with a caret character (^) underneath the "
190 "stop column. This method introduces a new line in source listings "
191 "that display thread stop locations.",
196 "Do not highlight the stop column.",
204 "Do not show any autosuggestion.",
209 "Show a suggestion sourced from previously entered commands.",
214 "Show the prefix that tab completion would insert for the current "
219#define LLDB_PROPERTIES_debugger
220#include "CoreProperties.inc"
223#define LLDB_PROPERTIES_debugger
224#include "CorePropertiesEnum.inc"
228#define LLDB_PROPERTIES_testing
229#include "CoreProperties.inc"
232#define LLDB_PROPERTIES_testing
233#include "CorePropertiesEnum.inc"
241 const llvm::SmallVector<llvm::StringRef> kVendorSafePaths = {
242#include "SafeAutoloadPaths.inc"
245 for (
auto path : kVendorSafePaths) {
246 assert(!path.empty());
265 const uint32_t idx = ePropertyInjectVarLocListError;
267 idx, g_testing_properties[idx].default_uint_value != 0);
272 return g_testing_properties;
276 const uint32_t idx = ePropertySafeAutoloadPaths;
279 assert(option_value);
284 const uint32_t idx = ePropertySafeAutoloadPaths;
287 assert(option_value);
292 const uint32_t idx = ePropertySafeAutoloadPaths;
301 llvm::StringRef property_path,
302 llvm::StringRef value) {
303 bool is_load_script =
304 (property_path ==
"target.load-script-from-symbol-file");
306 bool invalidate_data_vis = (property_path ==
"escape-non-printables");
307 invalidate_data_vis |=
308 (property_path ==
"target.max-zero-padding-in-float-format");
309 if (invalidate_data_vis) {
315 if (is_load_script && exe_ctx && exe_ctx->
GetTargetSP()) {
317 load_script_old_value =
318 target_sp->TargetProperties::GetLoadScriptFromSymbolFile();
321 if (
error.Success()) {
323 if (property_path == g_debugger_properties[ePropertyPrompt].name) {
324 llvm::StringRef new_prompt =
GetPrompt();
330 auto bytes = std::make_unique<EventDataBytes>(new_prompt);
331 auto prompt_change_event_sp = std::make_shared<Event>(
334 }
else if (property_path == g_debugger_properties[ePropertyUseColor].name) {
338 }
else if (property_path ==
339 g_debugger_properties[ePropertyPromptAnsiPrefix].name ||
341 g_debugger_properties[ePropertyPromptAnsiSuffix].name) {
345 }
else if (property_path ==
346 g_debugger_properties[ePropertyShowStatusline].name) {
357 }
else if (property_path ==
358 g_debugger_properties[ePropertyStatuslineFormat].name ||
360 g_debugger_properties[ePropertySeparator].name) {
363 }
else if (property_path ==
364 g_debugger_properties[ePropertyUseSourceCache].name) {
370 }
else if (is_load_script && target_sp &&
372 if (target_sp->TargetProperties::GetLoadScriptFromSymbolFile() ==
374 std::list<Status> errors;
375 if (!target_sp->LoadScriptingResources(errors)) {
377 for (
auto &
error : errors)
378 s->Printf(
"%s\n",
error.AsCString());
387 constexpr uint32_t idx = ePropertyAutoConfirm;
389 idx, g_debugger_properties[idx].default_uint_value != 0);
393 constexpr uint32_t idx = ePropertyDisassemblyFormat;
398 constexpr uint32_t idx = ePropertyFrameFormat;
403 constexpr uint32_t idx = ePropertyFrameFormatUnique;
408 constexpr uint32_t idx = ePropertyStopDisassemblyMaxSize;
410 idx, g_debugger_properties[idx].default_uint_value);
414 constexpr uint32_t idx = ePropertyNotiftVoid;
416 idx, g_debugger_properties[idx].default_uint_value != 0);
420 constexpr uint32_t idx = ePropertyPrompt;
422 idx, g_debugger_properties[idx].default_cstr_value);
426 const uint32_t idx = ePropertyPromptAnsiPrefix;
428 idx, g_debugger_properties[idx].default_cstr_value);
432 const uint32_t idx = ePropertyPromptAnsiSuffix;
434 idx, g_debugger_properties[idx].default_cstr_value);
438 constexpr uint32_t idx = ePropertyPrompt;
440 llvm::StringRef new_prompt =
GetPrompt();
449 constexpr uint32_t idx = ePropertyThreadFormat;
454 constexpr uint32_t idx = ePropertyThreadStopFormat;
459 const uint32_t idx = ePropertyScriptLanguage;
462 g_debugger_properties[idx].default_uint_value));
466 const uint32_t idx = ePropertyScriptLanguage;
471 const uint32_t idx = ePropertyREPLLanguage;
476 const uint32_t idx = ePropertyREPLLanguage;
481 const uint32_t idx = ePropertyTerminalWidth;
483 idx, g_debugger_properties[idx].default_uint_value);
491 const uint32_t idx = ePropertyTerminalHeight;
493 idx, g_debugger_properties[idx].default_uint_value);
501 uint64_t term_height) {
504 const bool width_success =
506 const bool height_success =
510 handler_sp->TerminalSizeChanged();
518 return width_success && height_success;
522 const uint32_t idx = ePropertyUseExternalEditor;
524 idx, g_debugger_properties[idx].default_uint_value != 0);
528 const uint32_t idx = ePropertyUseExternalEditor;
533 const uint32_t idx = ePropertyExternalEditor;
535 idx, g_debugger_properties[idx].default_cstr_value);
539 const uint32_t idx = ePropertyExternalEditor;
544 const uint32_t idx = ePropertyUseColor;
546 idx, g_debugger_properties[idx].default_uint_value != 0);
550 const uint32_t idx = ePropertyUseColor;
559 const uint32_t idx = ePropertyShowProgress;
561 idx, g_debugger_properties[idx].default_uint_value != 0);
565 const uint32_t idx = ePropertyShowProgress;
570 const uint32_t idx = ePropertyShowProgressAnsiPrefix;
572 idx, g_debugger_properties[idx].default_cstr_value);
576 const uint32_t idx = ePropertyShowProgressAnsiSuffix;
578 idx, g_debugger_properties[idx].default_cstr_value);
582 const uint32_t idx = ePropertyLabelAnsiPrefix;
584 idx, g_debugger_properties[idx].default_cstr_value);
588 const uint32_t idx = ePropertyLabelAnsiSuffix;
590 idx, g_debugger_properties[idx].default_cstr_value);
594 const uint32_t idx = ePropertyTitleAnsiPrefix;
596 idx, g_debugger_properties[idx].default_cstr_value);
600 const uint32_t idx = ePropertyTitleAnsiSuffix;
602 idx, g_debugger_properties[idx].default_cstr_value);
606 const uint32_t idx = ePropertyDividerAnsiPrefix;
608 idx, g_debugger_properties[idx].default_cstr_value);
612 const uint32_t idx = ePropertyDividerAnsiSuffix;
614 idx, g_debugger_properties[idx].default_cstr_value);
618 const uint32_t idx = ePropertyShowStatusline;
620 idx, g_debugger_properties[idx].default_uint_value != 0);
624 constexpr uint32_t idx = ePropertyStatuslineFormat;
629 constexpr uint32_t idx = ePropertyStatuslineFormat;
636 constexpr uint32_t idx = ePropertySeparator;
638 idx, g_debugger_properties[idx].default_cstr_value);
642 const uint32_t idx = ePropertyShowDisabledAnsiPrefix;
644 idx, g_debugger_properties[idx].default_cstr_value);
648 const uint32_t idx = ePropertyShowDisabledAnsiSuffix;
650 idx, g_debugger_properties[idx].default_cstr_value);
654 constexpr uint32_t idx = ePropertySeparator;
661 const uint32_t idx = ePropertyShowAutosuggestion;
664 g_debugger_properties[idx].default_uint_value));
668 const uint32_t idx = ePropertyShowAutosuggestionAnsiPrefix;
670 idx, g_debugger_properties[idx].default_cstr_value);
674 const uint32_t idx = ePropertyShowAutosuggestionAnsiSuffix;
676 idx, g_debugger_properties[idx].default_cstr_value);
680 const uint32_t idx = ePropertyShowRegexMatchAnsiPrefix;
682 idx, g_debugger_properties[idx].default_cstr_value);
686 const uint32_t idx = ePropertyShowRegexMatchAnsiSuffix;
688 idx, g_debugger_properties[idx].default_cstr_value);
692 const uint32_t idx = ePropertyShowDontUsePoHint;
694 idx, g_debugger_properties[idx].default_uint_value != 0);
698 const uint32_t idx = ePropertyUseSourceCache;
700 idx, g_debugger_properties[idx].default_uint_value != 0);
704 const uint32_t idx = ePropertyUseSourceCache;
713 const uint32_t idx = ePropertyMarkHiddenFrames;
715 idx, g_debugger_properties[idx].default_uint_value != 0);
719 const uint32_t idx = ePropertyHighlightSource;
721 idx, g_debugger_properties[idx].default_uint_value != 0);
725 const uint32_t idx = ePropertyStopShowColumn;
728 g_debugger_properties[idx].default_uint_value));
732 const uint32_t idx = ePropertyStopShowColumnAnsiPrefix;
734 idx, g_debugger_properties[idx].default_cstr_value);
738 const uint32_t idx = ePropertyStopShowColumnAnsiSuffix;
740 idx, g_debugger_properties[idx].default_cstr_value);
744 const uint32_t idx = ePropertyStopShowLineMarkerAnsiPrefix;
746 idx, g_debugger_properties[idx].default_cstr_value);
750 const uint32_t idx = ePropertyStopShowLineMarkerAnsiSuffix;
752 idx, g_debugger_properties[idx].default_cstr_value);
757 before ? ePropertyStopLineCountBefore : ePropertyStopLineCountAfter;
759 idx, g_debugger_properties[idx].default_uint_value);
763 const uint32_t idx = ePropertyStopDisassemblyDisplay;
766 g_debugger_properties[idx].default_uint_value));
770 const uint32_t idx = ePropertyStopDisassemblyCount;
772 idx, g_debugger_properties[idx].default_uint_value);
776 const uint32_t idx = ePropertyAutoOneLineSummaries;
778 idx, g_debugger_properties[idx].default_uint_value != 0);
782 const uint32_t idx = ePropertyEscapeNonPrintables;
784 idx, g_debugger_properties[idx].default_uint_value != 0);
788 const uint32_t idx = ePropertyAutoIndent;
790 idx, g_debugger_properties[idx].default_uint_value != 0);
794 const uint32_t idx = ePropertyAutoIndent;
799 const uint32_t idx = ePropertyPrintDecls;
801 idx, g_debugger_properties[idx].default_uint_value != 0);
805 const uint32_t idx = ePropertyPrintDecls;
810 const uint32_t idx = ePropertyTabSize;
812 idx, g_debugger_properties[idx].default_uint_value);
816 const uint32_t idx = ePropertyTabSize;
821 const uint32_t idx = ePropertyDWIMPrintVerbosity;
824 g_debugger_properties[idx].default_uint_value != 0));
828 const uint32_t idx = ePropertyShowInlineDiagnostics;
830 idx, g_debugger_properties[idx].default_uint_value);
834 const uint32_t idx = ePropertyShowInlineDiagnostics;
849 "Debugger::Initialize called more than once!");
852 g_thread_pool =
new llvm::DefaultThreadPool(llvm::optimal_concurrency());
858 "Debugger::Terminate called without a matching Debugger::Initialize!");
864 debugger->HandleDestroyCallback();
891 llvm::sys::DynamicLibrary dynlib =
893 if (dynlib.isValid()) {
908 llvm::StringRef path) {
911 static constexpr llvm::StringLiteral g_dylibext(
".dylib");
912 static constexpr llvm::StringLiteral g_solibext(
".so");
919 namespace fs = llvm::sys::fs;
924 if (ft == fs::file_type::regular_file || ft == fs::file_type::symlink_file ||
925 ft == fs::file_type::type_unknown) {
935 debugger->
LoadPlugin(plugin_file_spec, plugin_load_error);
938 }
else if (ft == fs::file_type::directory_file ||
939 ft == fs::file_type::symlink_file ||
940 ft == fs::file_type::type_unknown) {
952 const bool find_directories =
true;
953 const bool find_files =
true;
954 const bool find_other =
true;
956 if (
FileSpec dir_spec = HostInfo::GetSystemPluginDir()) {
958 dir_spec.GetPath(dir_path,
sizeof(dir_path))) {
960 find_files, find_other,
965 if (
FileSpec dir_spec = HostInfo::GetUserPluginDir()) {
967 dir_spec.GetPath(dir_path,
sizeof(dir_path))) {
969 find_files, find_other,
985 helper.SetDebugger(debugger_sp.get());
991 debugger_sp->InstanceInitialize();
1025 debugger_sp->HandleDestroyCallback();
1032 (*debugger_sp->GetAsyncOutputStream())
1035 (*debugger_sp->GetAsyncErrorStream()) << result.
GetErrorString() <<
'\n';
1038 debugger_sp->Clear();
1044 if ((*pos).get() == debugger_sp.get()) {
1059 if (llvm::StringRef(debugger_sp->GetInstanceName()) == instance_name)
1067 static constexpr llvm::StringLiteral class_name(
"lldb.debugger");
1097 "target",
"Settings specify to debugging targets.",
true,
1100 "platform",
"Platform settings.",
true,
1103 "symbols",
"Symbol lookup and cache settings.",
true,
1109 "diagnostics",
"Diagnostics settings.",
true,
1114 "Settings specify to the debugger's command interpreter.",
true,
1119 "testing",
"Testing-only settings.",
true,
1125 std::make_shared<CallbackLogHandler>(log_callback, baton);
1129 assert(default_platform_sp);
1136 arch = HostInfo::GetArchitecture();
1137 assert(arch.
IsValid() &&
"No valid default or host archspec");
1138 const bool is_dummy_target =
true;
1140 new Target(*
this, arch, default_platform_sp, is_dummy_target));
1146 ePropertyTerminalWidth);
1151 ePropertyTerminalHeight);
1155 const char *term = getenv(
"TERM");
1156 auto disable_color = [&]() {
1161 if (term && !strcmp(term,
"dumb"))
1167#if defined(_WIN32) && defined(ENABLE_VIRTUAL_TERMINAL_PROCESSING)
1170 llvm::sys::Process::UseANSIEscapeCodes(
true);
1199 if (
ProcessSP process_sp = target_sp->GetProcessSP())
1200 process_sp->Finalize(
false );
1201 target_sp->Destroy();
1223static inline int OpenPipe(
int fds[2], std::size_t size) {
1225 return _pipe(fds, size, O_BINARY);
1235 int fds[2] = {-1, -1};
1237 if (data ==
nullptr) {
1242 size_t size = strlen(data);
1250 "can't create pipe file descriptors for LLDB commands");
1254 int r = write(fds[
WRITE], data, size);
1258 llvm::sys::Process::SafelyCloseFileDescriptor(fds[
WRITE]);
1262 FILE *commands_file = fdopen(fds[
READ],
"rb");
1263 if (commands_file ==
nullptr) {
1265 "fdopen(%i, \"rb\") failed (errno = %i) "
1266 "when trying to open LLDB commands pipe",
1268 llvm::sys::Process::SafelyCloseFileDescriptor(fds[
READ]);
1278 assert(file_sp && file_sp->IsValid());
1286 assert(file_sp && file_sp->IsValid());
1292 assert(file_sp && file_sp->IsValid());
1319 std::optional<ExecutionContextRef> exe_ctx_ref) {
1348 if (adopt_dummy_target)
1359 reader_sp->Interrupt();
1366 reader_sp->GotEOF();
1388 std::lock_guard<std::recursive_mutex> guard(
1394 if (top_reader_sp && top_reader_sp->GetIsDone())
1411 while (top_reader_sp) {
1412 top_reader_sp->Run();
1415 if (top_reader_sp.get() == reader_sp.get()) {
1424 if (top_reader_sp && top_reader_sp->GetIsDone()) {
1427 if (top_reader_sp.get() == reader_sp.get())
1451 locked_stream.
Write(s, len);
1472 bool cancel_top_handler) {
1487 if (!in || !in->IsValid()) {
1489 in = top_reader_sp->GetInputFileSP();
1498 if (!out || !out->GetUnlockedFile().IsValid()) {
1500 out = top_reader_sp->GetOutputStreamFileSP();
1509 if (!err || !err->GetUnlockedFile().IsValid()) {
1511 err = top_reader_sp->GetErrorStreamFileSP();
1522 bool cancel_top_handler) {
1532 if (reader_sp == top_reader_sp)
1537 reader_sp->Activate();
1541 if (top_reader_sp) {
1542 top_reader_sp->Deactivate();
1543 if (cancel_top_handler)
1544 top_reader_sp->Cancel();
1561 if (pop_reader_sp != reader_sp)
1564 reader_sp->Deactivate();
1565 reader_sp->Cancel();
1570 reader_sp->Activate();
1579 reader_sp->Refresh();
1583 return std::make_unique<StreamAsynchronousIO>(*
this,
1588 return std::make_unique<StreamAsynchronousIO>(*
this,
1616 std::string function_name,
const llvm::formatv_object_base &payload)
1621 desc << payload <<
"\n";
1635 if (debugger_sp->InterruptRequested())
1636 result.push_back(debugger_sp);
1655 if (index < g_debugger_list_ptr->size())
1667 if (debugger_sp->GetID() ==
id)
1681 if (format ==
nullptr) {
1685 format = &format_entry;
1687 if (format ==
nullptr) {
1689 format = &format_entry;
1692 bool function_changed =
false;
1693 bool initial_function =
false;
1699 function_changed =
true;
1703 function_changed =
true;
1713 initial_function =
true;
1721 llvm::StringRef backtrace,
1722 llvm::StringRef prompt) {
1734 std::make_shared<CallbackLogHandler>(log_callback, baton);
1737std::vector<std::string>
1739 std::vector<std::string> copied;
1741 llvm::StringRef log_path = entry.first();
1742 llvm::StringRef file_name = llvm::sys::path::filename(log_path);
1745 if (!llvm::sys::fs::copy_file(log_path, destination.
GetPath()))
1746 copied.push_back(file_name.str());
1771 if (it->token == token) {
1780 std::string title, std::string details,
1781 uint64_t completed, uint64_t total,
1782 bool is_debugger_specific,
1783 uint32_t progress_broadcast_bit) {
1789 progress_broadcast_bit,
1791 completed, total, is_debugger_specific)));
1796 std::string details, uint64_t completed,
1798 std::optional<lldb::user_id_t> debugger_id,
1799 uint32_t progress_broadcast_bit) {
1807 std::move(details), completed, total,
1809 progress_broadcast_bit);
1820 progress_broadcast_bit);
1825 std::string message,
1826 bool debugger_specific) {
1827 uint32_t event_type = 0;
1830 assert(
false &&
"eSeverityInfo should not be broadcast");
1849 EventSP event_sp = std::make_shared<Event>(
1856 std::optional<lldb::user_id_t> debugger_id,
1857 std::once_flag *once) {
1858 auto ReportDiagnosticLambda = [&]() {
1891 std::call_once(*once, ReportDiagnosticLambda);
1893 ReportDiagnosticLambda();
1897 std::optional<lldb::user_id_t> debugger_id,
1898 std::once_flag *once) {
1903 std::optional<lldb::user_id_t> debugger_id,
1904 std::once_flag *once) {
1909 std::optional<lldb::user_id_t> debugger_id,
1910 std::once_flag *once) {
1920 EventSP event_sp = std::make_shared<Event>(
1923 debugger_sp->GetBroadcaster().BroadcastEvent(event_sp);
1927static std::shared_ptr<LogHandler>
1929 size_t buffer_size) {
1930 switch (log_handler_kind) {
1932 return std::make_shared<StreamLogHandler>(fd, should_close, buffer_size);
1934 return std::make_shared<RotatingLogHandler>(buffer_size);
1936 return std::make_shared<SystemLogHandler>();
1944 llvm::ArrayRef<const char *> categories,
1945 llvm::StringRef log_file, uint32_t log_options,
1949 std::shared_ptr<LogHandler> log_handler_sp;
1955 }
else if (log_file.empty()) {
1958 false, buffer_size);
1962 log_handler_sp = pos->second.lock();
1963 if (!log_handler_sp) {
1971 FileSpec(log_file), flags, lldb::eFilePermissionsFileDefault,
false);
1973 return llvm::createStringErrorV(
"Unable to open log file '{}': {}",
1975 llvm::fmt_consume(file.takeError()));
1983 assert(log_handler_sp);
1985 if (log_options == 0)
1994 std::optional<lldb::ScriptLanguage> language) {
2017 using namespace lldb;
2018 const uint32_t event_type =
2035 if (event_type & eBreakpointEventTypeLocationsAdded) {
2036 uint32_t num_new_locations =
2039 if (num_new_locations > 0) {
2043 output_up->Printf(
"%d location%s added to breakpoint %d\n",
2044 num_new_locations, num_new_locations == 1 ?
"" :
"s",
2045 breakpoint->GetID());
2063 bool flush_stderr) {
2064 const auto &flush = [&](
Stream &stream,
2069 while ((len = (process.*get)(buffer,
sizeof(buffer),
error)) > 0)
2070 stream.
Write(buffer, len);
2083 const uint32_t event_type = event_sp->GetType();
2094 bool pop_process_io_handler =
false;
2097 bool state_is_stopped =
false;
2098 const bool got_state_changed =
2102 const bool got_structured_data =
2105 if (got_state_changed) {
2112 if (got_state_changed && !state_is_stopped) {
2117 pop_process_io_handler);
2122 got_stderr || got_state_changed);
2125 if (got_structured_data) {
2129 auto structured_data_sp =
2133 plugin_sp->GetDescription(structured_data_sp, content_stream);
2134 if (
error.Success()) {
2135 if (!content_stream.
GetString().empty()) {
2138 content_stream.
Flush();
2141 output_stream_up->PutCString(content_stream.
GetString());
2144 error_stream_up->Format(
"Failed to print structured "
2145 "data with plugin {0}: {1}",
2146 plugin_sp->GetPluginName(),
error);
2152 if (got_state_changed && state_is_stopped) {
2155 pop_process_io_handler);
2158 output_stream_up->Flush();
2159 error_stream_up->Flush();
2161 if (pop_process_io_handler)
2162 process_sp->PopProcessIOHandler();
2170 const uint32_t event_type = event_sp->GetType();
2171 const bool stop_format =
true;
2201 static std::once_flag g_once_flag;
2202 static bool g_supports_osc_progress =
false;
2204 std::call_once(g_once_flag, []() {
2207 if (
const char *term_program = std::getenv(
"TERM_PROGRAM")) {
2208 llvm::StringRef term_program_str(term_program);
2209 if (term_program_str.starts_with(
"ghostty") ||
2210 term_program_str.starts_with(
"wezterm")) {
2211 g_supports_osc_progress =
true;
2217 std::array<const char *, 3> known_env_vars = {
2219 "GHOSTTY_RESOURCES_DIR",
2222 for (
const char *env_var : known_env_vars) {
2223 if (std::getenv(env_var)) {
2224 g_supports_osc_progress =
true;
2230 return g_supports_osc_progress;
2236 File &file = stream_sp->GetUnlockedFile();
2261 llvm::StringRef broadcaster_class_process(
2268 broadcaster_class_process,
2279 process_event_spec);
2282 listener_sp->StartListeningForEvents(
2288 listener_sp->StartListeningForEvents(
2310 if (listener_sp->GetEvent(event_sp, std::nullopt)) {
2311 std::optional<ExecutionContextRef> exe_ctx_ref = std::nullopt;
2313 Broadcaster *broadcaster = event_sp->GetBroadcaster();
2315 uint32_t event_type = event_sp->GetType();
2317 if (broadcaster_class == broadcaster_class_process) {
2323 const bool adopt_selected =
2331 }
else if (broadcaster_class == broadcaster_class_target) {
2336 }
else if (broadcaster_class == broadcaster_class_thread) {
2345 }
else if (event_type &
2347 const char *data =
static_cast<const char *
>(
2349 if (data && data[0]) {
2351 error_up->PutCString(data);
2355 eBroadcastBitAsynchronousOutputData) {
2356 const char *data =
static_cast<const char *
>(
2358 if (data && data[0]) {
2360 output_up->PutCString(data);
2397 llvm::StringRef full_name(
"lldb.debugger.event-handler");
2402 llvm::StringRef thread_name =
2403 full_name.size() < llvm::get_max_thread_name_length()
2405 :
"dbg.evt-handler";
2408 llvm::Expected<HostThread> event_handler_thread =
2413 if (event_handler_thread) {
2417 "failed to launch host thread: {0}");
2426 listener_sp->GetEvent(event_sp, std::nullopt);
2451 ProgressReport progress_report{data->GetID(), data->GetCompleted(),
2452 data->GetTotal(), data->GetMessage()};
2460 return report.id == progress_report.
id;
2463 const bool complete = data->GetCompleted() == data->GetTotal();
2467 *it = progress_report;
2499std::optional<Debugger::ProgressReport>
2503 return std::nullopt;
2530 if (io_handler_thread) {
2534 "failed to launch host thread: {0}");
2562 if (!prefer_dummy) {
2580 language = *single_lang;
2581 }
else if (repl_languages.
Empty()) {
2583 "LLDB isn't configured with REPL support for any languages.");
2587 "Multiple possible REPL languages. Please specify a language.");
2603 "couldn't find a REPL for %s",
2608 repl_sp->SetCompilerOptions(repl_options);
2616 "Debugger::GetThreadPool called before Debugger::Initialize");
2621 llvm::StringRef name,
bool value,
2622 llvm::StringRef description) {
2623 auto entry_up = std::make_unique<StructuredData::Dictionary>();
2624 entry_up->AddBooleanItem(
"value", value);
2625 entry_up->AddStringItem(
"description", description);
2626 dict.
AddItem(name, std::move(entry_up));
2630 auto array_up = std::make_unique<StructuredData::Array>();
2631#define LLVM_TARGET(target) \
2632 array_up->AddItem(std::make_unique<StructuredData::String>(#target));
2633#include "llvm/Config/Targets.def"
2634 auto entry_up = std::make_unique<StructuredData::Dictionary>();
2635 entry_up->AddItem(
"value", std::move(array_up));
2636 entry_up->AddStringItem(
"description",
"A list of configured LLVM targets.");
2637 dict.
AddItem(
"targets", std::move(entry_up));
2641 auto config_up = std::make_unique<StructuredData::Dictionary>();
2644 "A boolean value that indicates if XML support is enabled in LLDB");
2646 *config_up,
"curl", LLVM_ENABLE_CURL,
2647 "A boolean value that indicates if CURL support is enabled in LLDB");
2649 *config_up,
"curses", LLDB_ENABLE_CURSES,
2650 "A boolean value that indicates if curses support is enabled in LLDB");
2652 *config_up,
"editline", LLDB_ENABLE_LIBEDIT,
2653 "A boolean value that indicates if editline support is enabled in LLDB");
2655 "A boolean value that indicates if editline wide "
2656 "characters support is enabled in LLDB");
2658 *config_up,
"zlib", LLVM_ENABLE_ZLIB,
2659 "A boolean value that indicates if zlib support is enabled in LLDB");
2661 *config_up,
"lzma", LLVM_ENABLE_LZMA,
2662 "A boolean value that indicates if lzma support is enabled in LLDB");
2664 *config_up,
"python", LLDB_ENABLE_PYTHON,
2665 "A boolean value that indicates if python support is enabled in LLDB");
2667 *config_up,
"lua", LLDB_ENABLE_LUA,
2668 "A boolean value that indicates if lua support is enabled in LLDB");
#define OSC_PROGRESS_REMOVE
#define OSC_PROGRESS_INDETERMINATE
#define OSC_PROGRESS_SHOW
static llvm::raw_ostream & error(Stream &strm)
static bool RequiresFollowChildWorkaround(const Process &process)
static llvm::DefaultThreadPool * g_thread_pool
static constexpr OptionEnumValueElement g_show_disassembly_enum_values[]
static bool TerminalSupportsOSCProgress()
Conservative heuristic to detect whether OSC 9;4 progress is supported by the current terminal.
static lldb::user_id_t g_unique_id
static constexpr OptionEnumValueElement g_language_enumerators[]
static void PrivateReportDiagnostic(Debugger &debugger, Severity severity, std::string message, bool debugger_specific)
static constexpr OptionEnumValueElement g_dwim_print_verbosities[]
static constexpr OptionEnumValueElement s_stop_show_column_values[]
static void PrivateReportProgress(Debugger &debugger, uint64_t progress_id, std::string title, std::string details, uint64_t completed, uint64_t total, bool is_debugger_specific, uint32_t progress_broadcast_bit)
static Debugger::DebuggerList * g_debugger_list_ptr
static int OpenPipe(int fds[2], std::size_t size)
static size_t g_debugger_event_thread_stack_bytes
static constexpr OptionEnumValueElement g_show_autosuggestion_enum_values[]
static std::mutex & GetDebuggerListMutex()
static FileSystem::EnumerateDirectoryResult LoadPluginCallback(void *baton, llvm::sys::fs::file_type ft, llvm::StringRef path)
static std::shared_ptr< LogHandler > CreateLogHandler(LogHandlerKind log_handler_kind, int fd, bool should_close, size_t buffer_size)
static void AddBoolConfigEntry(StructuredData::Dictionary &dict, llvm::StringRef name, bool value, llvm::StringRef description)
static void AddLLVMTargets(StructuredData::Dictionary &dict)
#define LLDB_LOG(log,...)
The LLDB_LOG* macros defined below are the way to emit log messages.
#define LLDB_LOG_OPTION_APPEND
#define LLDB_LOG_ERROR(log, error,...)
#define LLDB_LOG_OPTION_PREPEND_TIMESTAMP
#define LLDB_LOG_OPTION_PREPEND_THREAD_NAME
A section + offset based address class.
An architecture specification class.
bool IsValid() const
Tests if this ArchSpec is valid.
static lldb::BreakpointEventType GetBreakpointEventTypeFromEvent(const lldb::EventSP &event_sp)
static lldb::BreakpointSP GetBreakpointFromEvent(const lldb::EventSP &event_sp)
static const BreakpointEventData * GetEventDataFromEvent(const Event *event_sp)
static size_t GetNumBreakpointLocationsFromEvent(const lldb::EventSP &event_sp)
An event broadcasting class.
bool EventTypeHasListeners(uint32_t event_type)
virtual llvm::StringRef GetBroadcasterClass() const
This needs to be filled in if you are going to register the broadcaster with the broadcaster manager ...
void BroadcastEvent(lldb::EventSP &event_sp)
Broadcast an event which has no associated data.
void UpdatePrompt(llvm::StringRef prompt)
void UpdateUseColor(bool use_color)
@ eBroadcastBitAsynchronousOutputData
@ eBroadcastBitQuitCommandReceived
@ eBroadcastBitAsynchronousErrorData
@ eBroadcastBitResetPrompt
bool WasInterrupted() const
bool SaveTranscript(CommandReturnObject &result, std::optional< std::string > output_file=std::nullopt)
Save the current debugger session transcript to a file on disk.
bool GetSaveSessionOnQuit() const
std::string GetErrorString(bool with_diagnostics=true) const
Return the errors as a string.
llvm::StringRef GetOutputString() const
static void ForceUpdate()
std::string m_function_name
const std::chrono::time_point< std::chrono::system_clock > m_interrupt_time
const uint64_t m_thread_id
InterruptionReport(std::string function_name, std::string description)
std::string m_description
A class to manage flag bits.
static void AssertCallback(llvm::StringRef message, llvm::StringRef backtrace, llvm::StringRef prompt)
llvm::StringRef GetAutosuggestionAnsiPrefix() const
bool SetUseExternalEditor(bool use_external_editor_p)
PlatformList m_platform_list
HostThread m_event_handler_thread
FormatEntity::Entry GetDisassemblyFormat() const
uint64_t GetDisassemblyLineCount() const
llvm::StringRef GetDisabledAnsiSuffix() const
uint64_t GetTerminalHeight() const
lldb::LockableStreamFileSP m_output_stream_sp
bool SetExternalEditor(llvm::StringRef editor)
void RequestInterrupt()
Interruption in LLDB:
void ReportInterruption(const InterruptionReport &report)
const std::string m_instance_name
lldb::ThreadSP HandleThreadEvent(const lldb::EventSP &event_sp)
void HandleProgressEvent(const lldb::EventSP &event_sp)
SourceManager & GetSourceManager()
bool SetTerminalDimensions(uint64_t term_width, uint64_t term_height)
Set the terminal width and height together, so observers are notified once with both dimensions curre...
bool SetShowProgress(bool show_progress)
bool StartEventHandlerThread()
Manually start the global event handler thread.
bool SetUseSourceCache(bool use_source_cache)
static const FileSpecList & GetDefaultSafeAutoLoadPaths()
void StopEventHandlerThread()
Manually stop the debugger's default event handler.
static void ReportInfo(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report info events.
void SetAsyncExecution(bool async)
ExecutionContext GetSelectedExecutionContext(bool adopt_dummy_target)
Get the execution context representing the selected entities in the selected target.
HostThread SetIOHandlerThread(HostThread &new_thread)
void CancelForwardEvents(const lldb::ListenerSP &listener_sp)
bool GetPrintDecls() const
lldb::FileSP GetInputFileSP()
void StopIOHandlerThread()
bool GetHighlightSource() const
llvm::StringMap< std::weak_ptr< LogHandler > > m_stream_handlers
bool IsEscapeCodeCapableTTY()
llvm::StringRef GetLabelAnsiSuffix() const
CommandInterpreter & GetCommandInterpreter()
FormatEntity::Entry GetStatuslineFormat() const
void SaveInputTerminalState()
llvm::StringRef GetDividerAnsiPrefix() const
LoadedPluginsList m_loaded_plugins
bool GetShowInlineDiagnostics() const
void InstanceInitialize()
bool SetTabSize(uint64_t tab_size)
void HandleDiagnosticEvent(const lldb::EventSP &event_sp)
bool StartIOHandlerThread()
static lldb::DebuggerSP GetDebuggerAtIndex(size_t index)
llvm::StringRef GetAutosuggestionAnsiSuffix() const
lldb::ListenerSP m_listener_sp
void PushIOHandler(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
std::mutex m_destroy_callback_mutex
lldb::callback_token_t AddDestroyCallback(lldb_private::DebuggerDestroyCallback destroy_callback, void *baton)
Add a callback for when the debugger is destroyed.
lldb::thread_result_t IOHandlerThread()
FormatEntity::Entry GetFrameFormatUnique() const
std::optional< ProgressReport > GetCurrentProgressReport() const
llvm::StringRef GetDisabledAnsiPrefix() const
bool GetUseExternalEditor() const
TerminalState m_terminal_state
lldb::StreamUP GetAsyncErrorStream()
bool InterruptRequested()
bool GetEscapeNonPrintables() const
lldb::TargetSP m_dummy_target_sp
llvm::SmallVector< DestroyCallbackInfo, 2 > m_destroy_callbacks
std::unique_ptr< CommandInterpreter > m_command_interpreter_up
static void ReportWarning(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report warning events.
static bool FormatDisassemblerAddress(const FormatEntity::Entry *format, const SymbolContext *sc, const SymbolContext *prev_sc, const ExecutionContext *exe_ctx, const Address *addr, Stream &s)
static void SettingsInitialize()
LockableStreamFile::Mutex m_output_mutex
static llvm::ThreadPoolInterface & GetThreadPool()
Shared thread pool. Use only with ThreadPoolTaskGroup.
llvm::StringRef GetShowProgressAnsiSuffix() const
bool IsTopIOHandler(const lldb::IOHandlerSP &reader_sp)
bool HasIOHandlerThread() const
void DispatchInputEndOfFile()
llvm::SmallVector< ProgressReport, 4 > m_progress_reports
Bookkeeping for command line progress events.
bool IsIOHandlerThreadCurrentThread() const
ExecutionContextRef GetSelectedExecutionContextRef(bool adopt_dummy_target)
Like GetSelectedExecutionContext but returns an ExecutionContextRef.
void DispatchClientTelemetry(const lldb_private::StructuredDataImpl &entry)
std::mutex m_progress_reports_mutex
lldb::ProcessSP HandleProcessEvent(const lldb::EventSP &event_sp)
lldb::ListenerSP m_forward_listener_sp
std::array< lldb::ScriptInterpreterSP, lldb::eScriptLanguageUnknown > m_script_interpreters
std::shared_ptr< CallbackLogHandler > m_callback_handler_sp
void SetDestroyCallback(lldb_private::DebuggerDestroyCallback destroy_callback, void *baton)
DEPRECATED: We used to only support one Destroy callback.
lldb::FileSP GetOutputFileSP()
Broadcaster m_broadcaster
Public Debugger event broadcaster.
void DispatchInputInterrupt()
static void Initialize(LoadPluginCallbackType load_plugin_callback)
static lldb::DebuggerSP FindDebuggerWithInstanceName(llvm::StringRef instance_name)
uint64_t GetTerminalWidth() const
std::mutex m_interrupt_mutex
std::recursive_mutex m_io_handler_synchronous_mutex
bool RemoveIOHandler(const lldb::IOHandlerSP &reader_sp)
Remove the given IO handler if it's currently active.
bool GetAutoOneLineSummaries() const
const char * GetIOHandlerCommandPrefix()
std::optional< Statusline > m_statusline
llvm::StringRef GetDividerAnsiSuffix() const
llvm::StringRef GetTitleAnsiPrefix() const
lldb::BroadcasterManagerSP m_broadcaster_manager_sp
void FlushStatusLine()
Flush cached state (e.g. stale execution context in the statusline).
Status RunREPL(lldb::LanguageType language, const char *repl_options)
bool PopIOHandler(const lldb::IOHandlerSP &reader_sp)
static StructuredData::DictionarySP GetBuildConfiguration()
Get the build configuration as structured data.
bool RemoveDestroyCallback(lldb::callback_token_t token)
Remove the specified callback. Return true if successful.
static LoadPluginCallbackType g_load_plugin_callback
bool GetShowStatusline() const
std::recursive_mutex m_script_interpreter_mutex
void RunIOHandlerAsync(const lldb::IOHandlerSP &reader_sp, bool cancel_top_handler=true)
Run the given IO handler and return immediately.
void SetInputFile(lldb::FileSP file)
lldb::LockableStreamFileSP GetOutputStreamSP()
Except for Debugger and IOHandler, GetOutputStreamSP and GetErrorStreamSP should not be used directly...
void SetPrompt(llvm::StringRef p)
llvm::StringRef GetSeparator() const
bool StatuslineSupported()
Whether the statusline can be drawn: show-statusline is enabled and the output is an escape-code-capa...
uint64_t GetStopDisassemblyMaxSize() const
bool SetTerminalHeight(uint64_t term_height)
Broadcaster m_sync_broadcaster
Private debugger synchronization.
llvm::StringRef GetTitleAnsiSuffix() const
void RestoreInputTerminalState()
bool GetUseSourceCache() const
HostThread m_io_handler_thread
llvm::StringRef GetRegexMatchAnsiSuffix() const
static llvm::StringRef GetStaticBroadcasterClass()
lldb::FileSP m_input_file_sp
bool SetREPLLanguage(lldb::LanguageType repl_lang)
@ eBroadcastBitEventThreadIsListening
bool GetAutoIndent() const
AutosuggestionMode GetAutosuggestionMode() const
llvm::StringRef GetStopShowColumnAnsiSuffix() const
Status SetPropertyValue(const ExecutionContext *exe_ctx, VarSetOperationType op, llvm::StringRef property_path, llvm::StringRef value) override
llvm::StringRef GetPromptAnsiSuffix() const
FormatEntity::Entry GetThreadStopFormat() const
void SetErrorFile(lldb::FileSP file)
bool GetAutoConfirm() const
lldb::ScriptLanguage GetScriptLanguage() const
lldb::callback_token_t m_destroy_callback_next_token
std::unique_ptr< SourceManager > m_source_manager_up
static lldb::DebuggerSP CreateInstance(lldb::LogOutputCallback log_callback=nullptr, void *baton=nullptr)
lldb::StopShowColumn GetStopShowColumn() const
static void ReportSymbolChange(const ModuleSpec &module_spec)
static void ReportError(std::string message, std::optional< lldb::user_id_t > debugger_id=std::nullopt, std::once_flag *once=nullptr)
Report error events.
bool SetPrintDecls(bool b)
bool SetScriptLanguage(lldb::ScriptLanguage script_lang)
lldb::LockableStreamFileSP m_error_stream_sp
bool SetShowInlineDiagnostics(bool)
bool LoadPlugin(const FileSpec &spec, Status &error)
void SetOutputFile(lldb::FileSP file)
uint64_t GetStopSourceLineCount(bool before) const
bool SetStatuslineFormat(const FormatEntity::Entry &format)
void EnableForwardEvents(const lldb::ListenerSP &listener_sp)
static lldb::DebuggerSP FindDebuggerWithID(lldb::user_id_t id)
void HandleBreakpointEvent(const lldb::EventSP &event_sp)
void JoinIOHandlerThread()
bool CheckTopIOHandlerTypes(IOHandler::Type top_type, IOHandler::Type second_top_type)
Target & GetDummyTarget()
lldb::ListenerSP GetListener()
static void Destroy(lldb::DebuggerSP &debugger_sp)
SourceManager::SourceFileCache m_source_file_cache
llvm::StringRef GetPromptAnsiPrefix() const
lldb::StreamUP GetAsyncOutputStream()
void RedrawStatusline(std::optional< ExecutionContextRef > exe_ctx_ref)
Redraw the statusline if enabled.
void RunIOHandlerSync(const lldb::IOHandlerSP &reader_sp)
Run the given IO handler and block until it's complete.
Broadcaster & GetBroadcaster()
Get the public broadcaster for this debugger.
llvm::StringRef GetStopShowLineMarkerAnsiPrefix() const
bool GetShowDontUsePoHint() const
uint64_t GetTabSize() const
bool GetShowProgress() const
llvm::StringRef GetRegexMatchAnsiPrefix() const
void HandleDestroyCallback()
std::mutex m_output_flush_mutex
llvm::StringRef GetStopShowLineMarkerAnsiSuffix() const
bool SetSeparator(llvm::StringRef s)
bool SetUseColor(bool use_color)
std::mutex m_statusline_mutex
Mutex protecting the m_statusline member.
const char * GetIOHandlerHelpPrologue()
Status SetInputString(const char *data)
llvm::StringRef GetLabelAnsiPrefix() const
Target & GetSelectedOrDummyTarget(bool prefer_dummy=false)
std::vector< std::string > CopyLogFilesToDirectory(const FileSpec &dir)
Copy this debugger's file-backed log files into the given directory, for inclusion in a diagnostics b...
IOHandlerStack m_io_handler_stack
llvm::once_flag m_clear_once
static void SettingsTerminate()
static void ReportProgress(uint64_t progress_id, std::string title, std::string details, uint64_t completed, uint64_t total, std::optional< lldb::user_id_t > debugger_id, uint32_t progress_category_bit=lldb::eBroadcastBitProgress)
Report progress events.
lldb::LanguageType GetREPLLanguage() const
ScriptInterpreter * GetScriptInterpreter(bool can_create=true, std::optional< lldb::ScriptLanguage > language={})
void SetLoggingCallback(lldb::LogOutputCallback log_callback, void *baton)
bool SetTerminalWidth(uint64_t term_width)
Debugger(lldb::LogOutputCallback m_log_callback, void *baton)
llvm::StringRef GetExternalEditor() const
static size_t GetNumDebuggers()
FormatEntity::Entry GetThreadFormat() const
uint32_t m_interrupt_requested
Tracks interrupt requests.
lldb::DWIMPrintVerbosity GetDWIMPrintVerbosity() const
bool GetMarkHiddenFrames() const
lldb::thread_result_t DefaultEventHandler()
void PrintAsync(const char *s, size_t len, bool is_stdout)
lldb::LockableStreamFileSP GetErrorStreamSP()
llvm::Error EnableLog(llvm::StringRef channel, llvm::ArrayRef< const char * > categories, llvm::StringRef log_file, uint32_t log_options, size_t buffer_size, LogHandlerKind log_handler_kind)
bool IsForwardingEvents()
llvm::StringRef GetPrompt() const
bool GetNotifyVoid() const
llvm::StringRef GetShowProgressAnsiPrefix() const
void AdoptTopIOHandlerFilesIfInvalid(lldb::FileSP &in, lldb::LockableStreamFileSP &out, lldb::LockableStreamFileSP &err)
FormatEntity::Entry GetFrameFormat() const
lldb::StopDisassemblyType GetStopDisassemblyDisplay() const
llvm::StringRef GetTopIOHandlerControlSequence(char ch)
void FlushProcessOutput(Process &process, bool flush_stdout, bool flush_stderr)
Force flushing the process's pending stdout and stderr to the debugger's asynchronous stdout and stde...
void CancelInterruptRequest()
Decrement the "interrupt requested" counter.
static void ReportDiagnosticImpl(lldb::Severity severity, std::string message, std::optional< lldb::user_id_t > debugger_id, std::once_flag *once)
std::vector< lldb::DebuggerSP > DebuggerList
bool SetAutoIndent(bool b)
friend class CommandInterpreter
llvm::StringRef GetStopShowColumnAnsiPrefix() const
static DebuggerList DebuggersRequestingInterruption()
void Dump(Stream *s) const override
static const DiagnosticEventData * GetEventDataFromEvent(const Event *event_ptr)
static DiagnosticsProperties & GetGlobalProperties()
void Record(llvm::StringRef message)
Record a diagnostic message into the always-on, in-memory log.
static Diagnostics & Instance()
static const void * GetBytesFromEvent(const Event *event_ptr)
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
static lldb::StructuredDataPluginSP GetPluginFromEvent(const Event *event_ptr)
static StructuredData::ObjectSP GetObjectFromEvent(const Event *event_ptr)
Execution context objects refer to objects in the execution of the program that is being debugged.
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
const lldb::TargetSP & GetTargetSP() const
Get accessor to get the target shared pointer.
bool HasTargetScope() const
Returns true the ExecutionContext object contains a valid target.
Target & GetTargetRef() const
Returns a reference to the target object.
void EmplaceBack(Args &&...args)
Inserts a new FileSpec into the FileSpecList constructed in-place with the given arguments.
FileSpec CopyByAppendingPathComponent(llvm::StringRef component) const
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
llvm::StringRef GetFileNameExtension() const
Extract the extension of the file.
void EnumerateDirectory(llvm::Twine path, bool find_directories, bool find_files, bool find_other, EnumerateDirectoryCallbackType callback, void *callback_baton)
@ eEnumerateDirectoryResultEnter
Recurse into the current entry if it is a directory or symlink, or next if not.
@ eEnumerateDirectoryResultNext
Enumerate next entry in the current directory.
@ eEnumerateDirectoryResultQuit
Stop directory enumerations at any level.
int Open(const char *path, int flags, int mode=0600)
Wraps open in a platform-independent way.
static FileSystem & Instance()
void Resolve(llvm::SmallVectorImpl< char > &path, bool force_make_absolute=false)
Resolve path to make it canonical.
An abstract base class for files.
bool GetIsRealTerminal()
Return true if this file from a real terminal.
static int kInvalidDescriptor
virtual int GetDescriptor() const
Get underlying OS file descriptor for this file, or kInvalidDescriptor.
bool GetIsTerminalWithColors()
Return true if this file is a terminal which supports colors.
Status Close() override
Flush any buffers and release any resources owned by the file.
bool GetIsInteractive()
Return true if this file is interactive.
const Mangled & GetMangled() const
static void SystemLog(lldb::Severity severity, llvm::StringRef message)
Emit the given message to the operating system log.
static lldb::thread_t GetCurrentThread()
Get the thread token (the one returned by ThreadCreate when the thread was created) for the calling t...
static llvm::StringRef GetSettingName()
static LanguageSet GetLanguagesSupportingREPLs()
static const char * GetNameForLanguageType(lldb::LanguageType language)
Returns the internal LLDB name for the specified language.
static LanguageProperties & GetGlobalLanguageProperties()
static lldb::ListenerSP MakeListener(llvm::StringRef name)
static llvm::Error EnableLogChannel(const std::shared_ptr< LogHandler > &log_handler_sp, uint32_t log_options, llvm::StringRef channel, llvm::ArrayRef< const char * > categories)
static ModuleListProperties & GetGlobalModuleListProperties()
void AppendCurrentValue(const FileSpec &value)
void SetCurrentValue(const FileSpecList &value)
void SetMinimumValue(uint64_t v)
static lldb::ScriptInterpreterSP GetScriptInterpreterForLanguage(lldb::ScriptLanguage script_lang, Debugger &debugger)
static void DebuggerInitialize(Debugger &debugger)
FollowForkMode GetFollowForkMode() const
static bool GetRestartedFromEvent(const Event *event_ptr)
static lldb::ProcessSP GetProcessFromEvent(const Event *event_ptr)
static lldb::StateType GetStateFromEvent(const Event *event_ptr)
A plug-in interface definition class for debugging a process.
static bool HandleProcessStateChangedEvent(const lldb::EventSP &event_sp, Stream *stream, SelectMostRelevant select_most_relevant, bool &pop_process_io_handler)
Centralize the code that handles and prints descriptions for process state changes.
static llvm::StringRef GetStaticBroadcasterClass()
@ eBroadcastBitStructuredData
@ eBroadcastBitStateChanged
virtual size_t GetSTDERR(char *buf, size_t buf_size, Status &error)
Get any available STDERR.
virtual size_t GetSTDOUT(char *buf, size_t buf_size, Status &error)
Get any available STDOUT.
static const ProgressEventData * GetEventDataFromEvent(const Event *event_ptr)
lldb::OptionValuePropertiesSP m_collection_sp
virtual Status SetPropertyValue(const ExecutionContext *exe_ctx, VarSetOperationType op, llvm::StringRef property_path, llvm::StringRef value)
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
lldb::OptionValuePropertiesSP GetValueProperties() const
static lldb::REPLSP Create(Status &Status, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options)
Get a REPL with an existing target (or, failing that, a debugger to use), and (optional) extra argume...
static Status FromErrorStringWithFormat(const char *format,...) __attribute__((format(printf
static Status FromErrorString(const char *str)
bool Success() const
Test for success condition.
void Flush() override
Flush the stream.
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.
virtual void Flush()=0
Flush the stream.
void AddItem(llvm::StringRef key, ObjectSP value_sp)
std::shared_ptr< Dictionary > DictionarySP
Defines a symbol context baton that can be handed other debug core functions.
Function * function
The Function for a given query.
Symbol * symbol
The Symbol for a given query.
bool Compare(ConstString name, lldb::SymbolType type) const
ConstString GetName() const
lldb::SymbolType GetType() const
Debugger & GetDebugger() const
static void SettingsTerminate()
static llvm::StringRef GetStaticBroadcasterClass()
static TargetProperties & GetGlobalProperties()
static ArchSpec GetDefaultArchitecture()
@ eBroadcastBitBreakpointChanged
static void SettingsInitialize()
static llvm::Expected< HostThread > LaunchThread(llvm::StringRef name, std::function< lldb::thread_result_t()> thread_function, size_t min_stack_byte_size=0)
static lldb::ThreadSP GetThreadFromEvent(const Event *event_ptr)
@ eBroadcastBitThreadSelected
@ eBroadcastBitStackChanged
static llvm::StringRef GetStaticBroadcasterClass()
virtual void DispatchClientTelemetry(const lldb_private::StructuredDataImpl &entry, Debugger *debugger)
static TelemetryManager * GetInstance()
@ SelectMostRelevantFrame
#define LLDB_INVALID_HOST_THREAD
std::string FormatAnsiTerminalCodes(llvm::StringRef format, bool do_color=true)
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.
@ eLoadScriptFromSymFileTrue
@ eLoadScriptFromSymFileFalse
@ eLoadScriptFromSymFileWarn
const char * GetVersion()
Retrieves a string representing the complete LLDB version, which includes the lldb version number,...
void(* DebuggerDestroyCallback)(lldb::user_id_t debugger_id, void *baton)
bool StateIsStoppedState(lldb::StateType state, bool must_exist)
Check if a state represents a state where the process or thread is stopped.
NativeFilePosix NativeFile
llvm::sys::DynamicLibrary(* LoadPluginCallbackType)(const lldb::DebuggerSP &debugger_sp, const FileSpec &spec, Status &error)
VarSetOperationType
Settable state variable types.
AutosuggestionMode
Controls how the show-autosuggestion setting drives inline suggestions in the interactive command lin...
@ eAutosuggestionTabMode
Show the prefix that tab completion would insert for the current line.
@ eAutosuggestionOn
Show a suggestion sourced from previously entered commands.
@ eAutosuggestionOff
Do not show any autosuggestion.
ScriptLanguage
Script interpreter types.
Severity
Used for expressing severity in logs and diagnostics.
@ eBroadcastBitExternalProgress
std::shared_ptr< lldb_private::IOHandler > IOHandlerSP
std::shared_ptr< lldb_private::Thread > ThreadSP
std::shared_ptr< lldb_private::Platform > PlatformSP
DWIMPrintVerbosity
Enum to control the verbosity level of dwim-print execution.
@ eDWIMPrintVerbosityFull
Always print a message indicating how dwim-print is evaluating its expression.
@ eDWIMPrintVerbosityNone
Run dwim-print with no verbosity.
@ eDWIMPrintVerbosityExpression
Print a message when dwim-print uses expression evaluation.
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.
std::shared_ptr< lldb_private::Breakpoint > BreakpointSP
std::shared_ptr< lldb_private::StructuredDataPlugin > StructuredDataPluginSP
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::Debugger > DebuggerSP
StopDisassemblyType
Used to determine when to show disassembly.
@ eStopDisassemblyTypeNever
@ eStopDisassemblyTypeNoSource
@ eStopDisassemblyTypeAlways
@ eStopDisassemblyTypeNoDebugInfo
@ eStopShowColumnAnsiOrCaret
std::shared_ptr< lldb_private::Event > EventSP
std::shared_ptr< lldb_private::Listener > ListenerSP
std::shared_ptr< lldb_private::LockableStreamFile > LockableStreamFileSP
void(* LogOutputCallback)(const char *, void *baton)
std::shared_ptr< lldb_private::Target > TargetSP
std::unique_ptr< lldb_private::Stream > StreamUP
std::shared_ptr< lldb_private::File > FileSP
std::shared_ptr< lldb_private::REPL > REPLSP
lldb_private::DebuggerDestroyCallback callback
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.
void AppendSafeAutoLoadPaths(FileSpec path)
Appends a path to the testing.safe-auto-load-paths setting.
static TestingProperties & GetGlobalTestingProperties()
FileSpecList GetSafeAutoLoadPaths() const
Callers should use Debugger::GetSafeAutoLoadPaths since it accounts for default paths configured via ...
void SetSafeAutoLoadPaths(FileSpecList paths)
Overwrites the testing.safe-auto-load-paths settings.
bool GetInjectVarLocListError() const
UserID(lldb::user_id_t uid=LLDB_INVALID_UID)
Construct with optional user ID.
lldb::user_id_t GetID() const
Get accessor for the user ID.
Helper RAII class for collecting telemetry.