aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/API/SBDebugger.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/API/SBDebugger.cpp')
-rw-r--r--lldb/source/API/SBDebugger.cpp99
1 files changed, 65 insertions, 34 deletions
diff --git a/lldb/source/API/SBDebugger.cpp b/lldb/source/API/SBDebugger.cpp
index 8b09d6a8e435..0de934b2a9bd 100644
--- a/lldb/source/API/SBDebugger.cpp
+++ b/lldb/source/API/SBDebugger.cpp
@@ -6,10 +6,10 @@
//
//===----------------------------------------------------------------------===//
+#include "lldb/API/SBDebugger.h"
#include "SystemInitializerFull.h"
#include "lldb/Utility/Instrumentation.h"
-
-#include "lldb/API/SBDebugger.h"
+#include "lldb/Utility/LLDBLog.h"
#include "lldb/API/SBBroadcaster.h"
#include "lldb/API/SBCommandInterpreter.h"
@@ -27,6 +27,7 @@
#include "lldb/API/SBStructuredData.h"
#include "lldb/API/SBTarget.h"
#include "lldb/API/SBThread.h"
+#include "lldb/API/SBTrace.h"
#include "lldb/API/SBTypeCategory.h"
#include "lldb/API/SBTypeFilter.h"
#include "lldb/API/SBTypeFormat.h"
@@ -35,6 +36,7 @@
#include "lldb/API/SBTypeSynthetic.h"
#include "lldb/Core/Debugger.h"
+#include "lldb/Core/DebuggerEvents.h"
#include "lldb/Core/PluginManager.h"
#include "lldb/Core/Progress.h"
#include "lldb/Core/StreamFile.h"
@@ -56,6 +58,8 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/DynamicLibrary.h"
#include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/PrettyStackTrace.h"
+#include "llvm/Support/Signals.h"
using namespace lldb;
using namespace lldb_private;
@@ -151,10 +155,9 @@ const char *SBDebugger::GetProgressFromEvent(const lldb::SBEvent &event,
uint64_t &completed,
uint64_t &total,
bool &is_debugger_specific) {
- LLDB_INSTRUMENT_VA(event, progress_id, completed, total,
- is_debugger_specific);
- const Debugger::ProgressEventData *progress_data =
- Debugger::ProgressEventData::GetEventDataFromEvent(event.get());
+ LLDB_INSTRUMENT_VA(event);
+ const ProgressEventData *progress_data =
+ ProgressEventData::GetEventDataFromEvent(event.get());
if (progress_data == nullptr)
return nullptr;
progress_id = progress_data->GetID();
@@ -164,6 +167,26 @@ const char *SBDebugger::GetProgressFromEvent(const lldb::SBEvent &event,
return progress_data->GetMessage().c_str();
}
+lldb::SBStructuredData
+SBDebugger::GetDiagnosticFromEvent(const lldb::SBEvent &event) {
+ LLDB_INSTRUMENT_VA(event);
+
+ const DiagnosticEventData *diagnostic_data =
+ DiagnosticEventData::GetEventDataFromEvent(event.get());
+ if (!diagnostic_data)
+ return {};
+
+ auto dictionary = std::make_unique<StructuredData::Dictionary>();
+ dictionary->AddStringItem("message", diagnostic_data->GetMessage());
+ dictionary->AddStringItem("type", diagnostic_data->GetPrefix());
+ dictionary->AddBooleanItem("debugger_specific",
+ diagnostic_data->IsDebuggerSpecific());
+
+ SBStructuredData data;
+ data.m_impl_up->SetObjectSP(std::move(dictionary));
+ return data;
+}
+
SBBroadcaster SBDebugger::GetBroadcaster() {
LLDB_INSTRUMENT_VA(this);
SBBroadcaster broadcaster(&m_opaque_sp->GetBroadcaster(), false);
@@ -186,6 +209,15 @@ lldb::SBError SBDebugger::InitializeWithErrorHandling() {
return error;
}
+void SBDebugger::PrintStackTraceOnError() {
+ LLDB_INSTRUMENT();
+
+ llvm::EnablePrettyStackTrace();
+ static std::string executable =
+ llvm::sys::fs::getMainExecutable(nullptr, nullptr);
+ llvm::sys::PrintStackTraceOnErrorSignal(executable);
+}
+
void SBDebugger::Terminate() {
LLDB_INSTRUMENT();
@@ -236,6 +268,7 @@ SBDebugger SBDebugger::Create(bool source_init_files,
interp.get()->SkipLLDBInitFiles(false);
interp.get()->SkipAppInitFiles(false);
SBCommandReturnObject result;
+ interp.SourceInitFileInGlobalDirectory(result);
interp.SourceInitFileInHomeDirectory(result, false);
} else {
interp.get()->SkipLLDBInitFiles(true);
@@ -760,7 +793,7 @@ lldb::SBTarget SBDebugger::CreateTarget(const char *filename,
sb_error.SetErrorString("invalid debugger");
}
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log,
"SBDebugger(%p)::CreateTarget (filename=\"%s\", triple=%s, "
"platform_name=%s, add_dependent_modules=%u, error=%s) => "
@@ -788,7 +821,7 @@ SBDebugger::CreateTargetWithFileAndTargetTriple(const char *filename,
sb_target.SetSP(target_sp);
}
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log,
"SBDebugger(%p)::CreateTargetWithFileAndTargetTriple "
"(filename=\"%s\", triple=%s) => SBTarget(%p)",
@@ -802,7 +835,7 @@ SBTarget SBDebugger::CreateTargetWithFileAndArch(const char *filename,
const char *arch_cstr) {
LLDB_INSTRUMENT_VA(this, filename, arch_cstr);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
SBTarget sb_target;
TargetSP target_sp;
@@ -858,7 +891,7 @@ SBTarget SBDebugger::CreateTarget(const char *filename) {
if (error.Success())
sb_target.SetSP(target_sp);
}
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log,
"SBDebugger(%p)::CreateTarget (filename=\"%s\") => SBTarget(%p)",
static_cast<void *>(m_opaque_sp.get()), filename,
@@ -873,7 +906,7 @@ SBTarget SBDebugger::GetDummyTarget() {
if (m_opaque_sp) {
sb_target.SetSP(m_opaque_sp->GetDummyTarget().shared_from_this());
}
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log, "SBDebugger(%p)::GetDummyTarget() => SBTarget(%p)",
static_cast<void *>(m_opaque_sp.get()),
static_cast<void *>(sb_target.GetSP().get()));
@@ -894,7 +927,7 @@ bool SBDebugger::DeleteTarget(lldb::SBTarget &target) {
}
}
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log, "SBDebugger(%p)::DeleteTarget (SBTarget(%p)) => %i",
static_cast<void *>(m_opaque_sp.get()),
static_cast<void *>(target.m_opaque_sp.get()), result);
@@ -977,7 +1010,7 @@ uint32_t SBDebugger::GetNumTargets() {
SBTarget SBDebugger::GetSelectedTarget() {
LLDB_INSTRUMENT_VA(this);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
SBTarget sb_target;
TargetSP target_sp;
@@ -1001,7 +1034,7 @@ SBTarget SBDebugger::GetSelectedTarget() {
void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
LLDB_INSTRUMENT_VA(this, sb_target);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
TargetSP target_sp(sb_target.GetSP());
if (m_opaque_sp) {
@@ -1019,7 +1052,7 @@ void SBDebugger::SetSelectedTarget(SBTarget &sb_target) {
SBPlatform SBDebugger::GetSelectedPlatform() {
LLDB_INSTRUMENT_VA(this);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
SBPlatform sb_platform;
DebuggerSP debugger_sp(m_opaque_sp);
@@ -1036,7 +1069,7 @@ SBPlatform SBDebugger::GetSelectedPlatform() {
void SBDebugger::SetSelectedPlatform(SBPlatform &sb_platform) {
LLDB_INSTRUMENT_VA(this, sb_platform);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
DebuggerSP debugger_sp(m_opaque_sp);
if (debugger_sp) {
@@ -1123,7 +1156,7 @@ void SBDebugger::DispatchInput(void *baton, const void *data, size_t data_len) {
void SBDebugger::DispatchInput(const void *data, size_t data_len) {
LLDB_INSTRUMENT_VA(this, data, data_len);
- // Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
+ // Log *log(GetLog (LLDBLog::API));
//
// if (log)
// LLDB_LOGF(log, "SBDebugger(%p)::DispatchInput (data=\"%.*s\",
@@ -1312,7 +1345,7 @@ void SBDebugger::SetTerminalWidth(uint32_t term_width) {
const char *SBDebugger::GetPrompt() const {
LLDB_INSTRUMENT_VA(this);
- Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_API));
+ Log *log = GetLog(LLDBLog::API);
LLDB_LOGF(log, "SBDebugger(%p)::GetPrompt () => \"%s\"",
static_cast<void *>(m_opaque_sp.get()),
@@ -1428,21 +1461,11 @@ SBError SBDebugger::SetCurrentPlatform(const char *platform_name_cstr) {
SBError sb_error;
if (m_opaque_sp) {
if (platform_name_cstr && platform_name_cstr[0]) {
- ConstString platform_name(platform_name_cstr);
- PlatformSP platform_sp(Platform::Find(platform_name));
-
- if (platform_sp) {
- // Already have a platform with this name, just select it
- m_opaque_sp->GetPlatformList().SetSelectedPlatform(platform_sp);
- } else {
- // We don't have a platform by this name yet, create one
- platform_sp = Platform::Create(platform_name, sb_error.ref());
- if (platform_sp) {
- // We created the platform, now append and select it
- bool make_selected = true;
- m_opaque_sp->GetPlatformList().Append(platform_sp, make_selected);
- }
- }
+ PlatformList &platforms = m_opaque_sp->GetPlatformList();
+ if (PlatformSP platform_sp = platforms.GetOrCreate(platform_name_cstr))
+ platforms.SetSelectedPlatform(platform_sp);
+ else
+ sb_error.ref().SetErrorString("platform not found");
} else {
sb_error.ref().SetErrorString("invalid platform name");
}
@@ -1598,7 +1621,8 @@ bool SBDebugger::EnableLog(const char *channel, const char **categories) {
std::string error;
llvm::raw_string_ostream error_stream(error);
return m_opaque_sp->EnableLog(channel, GetCategoryArray(categories), "",
- log_options, error_stream);
+ log_options, /*buffer_size=*/0,
+ eLogHandlerStream, error_stream);
} else
return false;
}
@@ -1611,3 +1635,10 @@ void SBDebugger::SetLoggingCallback(lldb::LogOutputCallback log_callback,
return m_opaque_sp->SetLoggingCallback(log_callback, baton);
}
}
+
+SBTrace
+SBDebugger::LoadTraceFromFile(SBError &error,
+ const SBFileSpec &trace_description_file) {
+ LLDB_INSTRUMENT_VA(this, error, trace_description_file);
+ return SBTrace::LoadTraceFromFile(error, *this, trace_description_file);
+}