Implement ProcessInfo::Dump(), log gdb-remote stub launch

This change implements dumping the executable, triple,
args and environment when using ProcessInfo::Dump().

It also tweaks the way Args::Dump() works so that it prints
a configurable label rather than argv[{index}]={value}. By
default it behaves the same, but if the Dump() method with
the additional arg is provided, it can be overridden. The
environment variables dumped as part of ProcessInfo::Dump()
make use of that.

lldb-server has been modified to dump the gdb-remote stub's
ProcessInfo before launching if the "gdb-remote process" channel
is logged.

llvm-svn: 271312
This commit is contained in:
Todd Fiala 2016-05-31 18:32:20 +00:00
parent 4d29099f7f
commit 7aa4d977ea
4 changed files with 42 additions and 9 deletions

View File

@ -91,14 +91,20 @@ public:
~Args(); ~Args();
//------------------------------------------------------------------ //------------------------------------------------------------------
/// Dump all arguments to the stream \a s. /// Dump all entries to the stream \a s using label \a label_name.
///
/// If label_name is nullptr, the dump operation is skipped.
/// ///
/// @param[in] s /// @param[in] s
/// The stream to which to dump all arguments in the argument /// The stream to which to dump all arguments in the argument
/// vector. /// vector.
/// @param[in] label_name
/// The label_name to use as the label printed for each
/// entry of the args like so:
/// {label_name}[{index}]={value}
//------------------------------------------------------------------ //------------------------------------------------------------------
void void
Dump (Stream *s); Dump (Stream &s, const char *label_name = "argv") const;
//------------------------------------------------------------------ //------------------------------------------------------------------
/// Sets the command string contained by this object. /// Sets the command string contained by this object.

View File

@ -83,19 +83,22 @@ Args::~Args ()
} }
void void
Args::Dump (Stream *s) Args::Dump (Stream &s, const char *label_name) const
{ {
if (!label_name)
return;
const size_t argc = m_argv.size(); const size_t argc = m_argv.size();
for (size_t i=0; i<argc; ++i) for (size_t i=0; i<argc; ++i)
{ {
s->Indent(); s.Indent();
const char *arg_cstr = m_argv[i]; const char *arg_cstr = m_argv[i];
if (arg_cstr) if (arg_cstr)
s->Printf("argv[%zi]=\"%s\"\n", i, arg_cstr); s.Printf("%s[%zi]=\"%s\"\n", label_name, i, arg_cstr);
else else
s->Printf("argv[%zi]=NULL\n", i); s.Printf("%s[%zi]=NULL\n", label_name, i);
} }
s->EOL(); s.EOL();
} }
bool bool

View File

@ -1120,7 +1120,7 @@ GDBRemoteCommunication::StartDebugserverProcess (const char *url,
{ {
Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS)); Log *log (ProcessGDBRemoteLog::GetLogIfAllCategoriesSet (GDBR_LOG_PROCESS));
if (log) if (log)
log->Printf ("GDBRemoteCommunication::%s(url=%s, port=%" PRIu16, __FUNCTION__, url ? url : "<empty>", port ? *port : uint16_t(0)); log->Printf ("GDBRemoteCommunication::%s(url=%s, port=%" PRIu16 ")", __FUNCTION__, url ? url : "<empty>", port ? *port : uint16_t(0));
Error error; Error error;
// If we locate debugserver, keep that located version around // If we locate debugserver, keep that located version around
@ -1352,7 +1352,14 @@ GDBRemoteCommunication::StartDebugserverProcess (const char *url,
launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false); launch_info.AppendSuppressFileAction (STDIN_FILENO, true, false);
launch_info.AppendSuppressFileAction (STDOUT_FILENO, false, true); launch_info.AppendSuppressFileAction (STDOUT_FILENO, false, true);
launch_info.AppendSuppressFileAction (STDERR_FILENO, false, true); launch_info.AppendSuppressFileAction (STDERR_FILENO, false, true);
if (log)
{
StreamString string_stream;
Platform *const platform = nullptr;
launch_info.Dump(string_stream, platform);
log->Printf("launch info for gdb-remote stub:\n%s", string_stream.GetString().c_str());
}
error = Host::LaunchProcess(launch_info); error = Host::LaunchProcess(launch_info);
if (error.Success() && if (error.Success() &&

View File

@ -15,6 +15,8 @@
// Project includes // Project includes
#include "lldb/Target/ProcessInfo.h" #include "lldb/Target/ProcessInfo.h"
#include "lldb/Core/Stream.h"
using namespace lldb; using namespace lldb;
using namespace lldb_private; using namespace lldb_private;
@ -64,6 +66,21 @@ ProcessInfo::GetNameLength() const
return m_executable.GetFilename().GetLength(); return m_executable.GetFilename().GetLength();
} }
void
ProcessInfo::Dump (Stream &s, Platform *platform) const
{
s << "Executable: " << GetName() << "\n";
s << "Triple: ";
m_arch.DumpTriple(s);
s << "\n";
s << "Arguments:\n";
m_arguments.Dump(s);
s << "Environment:\n";
m_environment.Dump(s, "env");
}
void void
ProcessInfo::SetExecutableFile (const FileSpec &exe_file, bool add_exe_file_as_first_arg) ProcessInfo::SetExecutableFile (const FileSpec &exe_file, bool add_exe_file_as_first_arg)
{ {