mirror of
https://github.com/intel/llvm.git
synced 2026-01-17 06:40:01 +08:00
This adds a "batch mode" to lldb kinda like the gdb batch mode. It will quit the debugger
after all the commands have been executed except if one of the commands was an execution control command that stopped because of a signal or exception. Also adds a variant of SBCommandInterpreter::HandleCommand that takes an SBExecutionContext. That way you can run an lldb command targeted at a particular target, thread or process w/o having to select same before running the command. Also exposes CommandInterpreter::HandleCommandsFromFile to the SBCommandInterpreter API, since that seemed generally useful. llvm-svn: 219654
This commit is contained in:
@@ -20,6 +20,7 @@
|
||||
#include "lldb/API/SBBroadcaster.h"
|
||||
#include "lldb/API/SBCommandReturnObject.h"
|
||||
#include "lldb/API/SBCommandInterpreter.h"
|
||||
#include "lldb/API/SBExecutionContext.h"
|
||||
#include "lldb/API/SBProcess.h"
|
||||
#include "lldb/API/SBTarget.h"
|
||||
#include "lldb/API/SBListener.h"
|
||||
@@ -221,6 +222,13 @@ SBCommandInterpreter::GetIOHandlerControlSequence(char ch)
|
||||
|
||||
lldb::ReturnStatus
|
||||
SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
|
||||
{
|
||||
SBExecutionContext sb_exe_ctx;
|
||||
return HandleCommand (command_line, sb_exe_ctx, result, add_to_history);
|
||||
}
|
||||
|
||||
lldb::ReturnStatus
|
||||
SBCommandInterpreter::HandleCommand (const char *command_line, SBExecutionContext &override_context, SBCommandReturnObject &result, bool add_to_history)
|
||||
{
|
||||
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
||||
|
||||
@@ -229,11 +237,21 @@ SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnOb
|
||||
static_cast<void*>(m_opaque_ptr), command_line,
|
||||
static_cast<void*>(result.get()), add_to_history);
|
||||
|
||||
ExecutionContext ctx, *ctx_ptr;
|
||||
if (override_context.get())
|
||||
{
|
||||
ctx = override_context.get()->Lock(true);
|
||||
ctx_ptr = &ctx;
|
||||
}
|
||||
else
|
||||
ctx_ptr = nullptr;
|
||||
|
||||
|
||||
result.Clear();
|
||||
if (command_line && m_opaque_ptr)
|
||||
{
|
||||
result.ref().SetInteractive(false);
|
||||
m_opaque_ptr->HandleCommand (command_line, add_to_history ? eLazyBoolYes : eLazyBoolNo, result.ref());
|
||||
m_opaque_ptr->HandleCommand (command_line, add_to_history ? eLazyBoolYes : eLazyBoolNo, result.ref(), ctx_ptr);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -256,6 +274,54 @@ SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnOb
|
||||
return result.GetStatus();
|
||||
}
|
||||
|
||||
void
|
||||
SBCommandInterpreter::HandleCommandsFromFile (lldb::SBFileSpec &file,
|
||||
lldb::SBExecutionContext &override_context,
|
||||
lldb::SBCommandInterpreterRunOptions &options,
|
||||
lldb::SBCommandReturnObject result)
|
||||
{
|
||||
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
|
||||
|
||||
if (log)
|
||||
{
|
||||
SBStream s;
|
||||
file.GetDescription (s);
|
||||
log->Printf ("SBCommandInterpreter(%p)::HandleCommandsFromFile (file=\"%s\", SBCommandReturnObject(%p))",
|
||||
static_cast<void*>(m_opaque_ptr), s.GetData(),
|
||||
static_cast<void*>(result.get()));
|
||||
}
|
||||
|
||||
if (!m_opaque_ptr)
|
||||
{
|
||||
result->AppendError ("SBCommandInterpreter is not valid.");
|
||||
result->SetStatus (eReturnStatusFailed);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!file.IsValid())
|
||||
{
|
||||
SBStream s;
|
||||
file.GetDescription (s);
|
||||
result->AppendErrorWithFormat ("File is not valid: %s.", s.GetData());
|
||||
result->SetStatus (eReturnStatusFailed);
|
||||
}
|
||||
|
||||
FileSpec tmp_spec = file.ref();
|
||||
ExecutionContext ctx, *ctx_ptr;
|
||||
if (override_context.get())
|
||||
{
|
||||
ctx = override_context.get()->Lock(true);
|
||||
ctx_ptr = &ctx;
|
||||
}
|
||||
else
|
||||
ctx_ptr = nullptr;
|
||||
|
||||
|
||||
m_opaque_ptr->HandleCommandsFromFile (tmp_spec, ctx_ptr, options.ref(), result.ref());
|
||||
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SBCommandInterpreter::HandleCompletion (const char *current_line,
|
||||
const char *cursor,
|
||||
|
||||
@@ -986,7 +986,8 @@ SBDebugger::RunCommandInterpreter (bool auto_handle_events,
|
||||
bool spawn_thread,
|
||||
SBCommandInterpreterRunOptions &options,
|
||||
int &num_errors,
|
||||
bool &quit_requested)
|
||||
bool &quit_requested,
|
||||
bool &stopped_for_crash)
|
||||
|
||||
{
|
||||
if (m_opaque_sp)
|
||||
@@ -995,6 +996,7 @@ SBDebugger::RunCommandInterpreter (bool auto_handle_events,
|
||||
interp.RunCommandInterpreter(auto_handle_events, spawn_thread, options.ref());
|
||||
num_errors = interp.GetNumErrors();
|
||||
quit_requested = interp.GetQuitRequested();
|
||||
stopped_for_crash = interp.GetStoppedForCrash();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -69,6 +69,12 @@ SBExecutionContext::operator = (const lldb::SBExecutionContext &rhs)
|
||||
return *this;
|
||||
}
|
||||
|
||||
ExecutionContextRef *
|
||||
SBExecutionContext::get () const
|
||||
{
|
||||
return m_exe_ctx_sp.get();
|
||||
}
|
||||
|
||||
SBTarget
|
||||
SBExecutionContext::GetTarget () const
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user