forked from OSchip/llvm-project
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:
parent
4d29099f7f
commit
7aa4d977ea
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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() &&
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue