summaryrefslogtreecommitdiffstats
path: root/lldb/tools/lldb-server/lldb-gdbserver.cpp
diff options
context:
space:
mode:
authorVince Harron <vince@nethacker.com>2015-05-10 15:22:09 +0000
committerVince Harron <vince@nethacker.com>2015-05-10 15:22:09 +0000
commit9753dd98b367b0918d04a64c174783513166e978 (patch)
tree0568fac41cc26d3c4d6eaa4d461212baea3303b9 /lldb/tools/lldb-server/lldb-gdbserver.cpp
parentf40342d6a25952e0c43f51556c48ecbb1b2003f1 (diff)
downloadbcm5719-llvm-9753dd98b367b0918d04a64c174783513166e978.tar.gz
bcm5719-llvm-9753dd98b367b0918d04a64c174783513166e978.zip
Add support for ./dotest.py --channel and --log-success
Summary: New dotest options that allow arbitrary log channels and categories to be enabled. Also enables logging for locally run debug servers. Log messages are separated into separate files per test case. (this makes it possible to log in dosep runs) These new log files are stored side-by-side with trace files in the session directory. These files are deleted by default if the test run is successful. If --log-success is specified, even successful logs are retained. --log-success is useful for creating reference log files. Test Plan: add '--channel "lldb all" --channel "gdb-remote packets" --log-success' to your dotest options Tested on OSX and Linux Differential Revision: http://reviews.llvm.org/D9594 llvm-svn: 236956
Diffstat (limited to 'lldb/tools/lldb-server/lldb-gdbserver.cpp')
-rw-r--r--lldb/tools/lldb-server/lldb-gdbserver.cpp87
1 files changed, 30 insertions, 57 deletions
diff --git a/lldb/tools/lldb-server/lldb-gdbserver.cpp b/lldb/tools/lldb-server/lldb-gdbserver.cpp
index a691337f1a9..fbec4386351 100644
--- a/lldb/tools/lldb-server/lldb-gdbserver.cpp
+++ b/lldb/tools/lldb-server/lldb-gdbserver.cpp
@@ -23,6 +23,8 @@
// C++ Includes
// Other libraries and framework includes
+#include "llvm/ADT/StringRef.h"
+
#include "lldb/Core/Error.h"
#include "lldb/Core/ConnectionMachPort.h"
#include "lldb/Core/Debugger.h"
@@ -48,6 +50,7 @@
#define LLGS_VERSION_STR "local_build"
#endif
+using namespace llvm;
using namespace lldb;
using namespace lldb_private;
using namespace lldb_private::process_gdb_remote;
@@ -73,9 +76,8 @@ static struct option g_long_options[] =
{ "debug", no_argument, &g_debug, 1 },
{ "platform", required_argument, NULL, 'p' },
{ "verbose", no_argument, &g_verbose, 1 },
- { "lldb-command", required_argument, NULL, 'c' },
{ "log-file", required_argument, NULL, 'l' },
- { "log-flags", required_argument, NULL, 'f' },
+ { "log-channels", required_argument, NULL, 'c' },
{ "attach", required_argument, NULL, 'a' },
{ "named-pipe", required_argument, NULL, 'N' },
{ "pipe", required_argument, NULL, 'U' },
@@ -161,21 +163,6 @@ dump_available_platforms (FILE *output_file)
}
}
-static void
-run_lldb_commands (const lldb::DebuggerSP &debugger_sp, const std::vector<std::string> &lldb_commands)
-{
- for (const auto &lldb_command : lldb_commands)
- {
- printf("(lldb) %s\n", lldb_command.c_str ());
-
- lldb_private::CommandReturnObject result;
- debugger_sp->GetCommandInterpreter ().HandleCommand (lldb_command.c_str (), eLazyBoolNo, result);
- const char *output = result.GetOutputData ();
- if (output && output[0])
- puts (output);
- }
-}
-
static lldb::PlatformSP
setup_platform (const std::string &platform_name)
{
@@ -554,13 +541,14 @@ main_gdbserver (int argc, char *argv[])
argc--;
argv++;
int long_option_index = 0;
- StreamSP log_stream_sp;
Args log_args;
Error error;
int ch;
std::string platform_name;
std::string attach_target;
std::string named_pipe_path;
+ std::string log_file;
+ StringRef log_channels; // e.g. "lldb process threads:gdb-remote default:linux all"
int unnamed_pipe_fd = -1;
bool reverse_connect = false;
@@ -595,41 +583,12 @@ main_gdbserver (int argc, char *argv[])
case 'l': // Set Log File
if (optarg && optarg[0])
- {
- if ((strcasecmp(optarg, "stdout") == 0) || (strcmp(optarg, "/dev/stdout") == 0))
- {
- log_stream_sp.reset (new StreamFile (stdout, false));
- }
- else if ((strcasecmp(optarg, "stderr") == 0) || (strcmp(optarg, "/dev/stderr") == 0))
- {
- log_stream_sp.reset (new StreamFile (stderr, false));
- }
- else
- {
- FILE *log_file = fopen(optarg, "w");
- if (log_file)
- {
- setlinebuf(log_file);
- log_stream_sp.reset (new StreamFile (log_file, true));
- }
- else
- {
- const char *errno_str = strerror(errno);
- fprintf (stderr, "Failed to open log file '%s' for writing: errno = %i (%s)", optarg, errno, errno_str ? errno_str : "unknown error");
- }
-
- }
- }
+ log_file.assign(optarg);
break;
- case 'f': // Log Flags
+ case 'c': // Log Channels
if (optarg && optarg[0])
- log_args.AppendArgument(optarg);
- break;
-
- case 'c': // lldb commands
- if (optarg && optarg[0])
- lldb_commands.push_back(optarg);
+ log_channels = StringRef(optarg);
break;
case 'p': // platform name
@@ -696,12 +655,29 @@ main_gdbserver (int argc, char *argv[])
exit(option_error);
}
- if (log_stream_sp)
+ SmallVector<StringRef, 32> channel_array;
+ log_channels.split(channel_array, ":");
+ uint32_t log_options = 0;
+ for (auto channel_with_categories : channel_array)
{
- if (log_args.GetArgumentCount() == 0)
- log_args.AppendArgument("default");
- ProcessGDBRemoteLog::EnableLog (log_stream_sp, 0,log_args.GetConstArgumentVector(), log_stream_sp.get());
+ StreamString error_stream;
+ Args channel_then_categories(channel_with_categories);
+ std::string channel(channel_then_categories.GetArgumentAtIndex(0));
+ channel_then_categories.Shift (); // Shift off the channel
+ bool success = debugger_sp->EnableLog (channel.c_str(),
+ channel_then_categories.GetConstArgumentVector(),
+ log_file.c_str(),
+ log_options,
+ error_stream);
+ if (!success)
+ {
+ fprintf(stderr, "Unable to open log file '%s' for channel \"%s\"",
+ log_file.c_str(),
+ channel_with_categories.str().c_str());
+ return -1;
+ }
}
+
Log *log(lldb_private::GetLogIfAnyCategoriesSet (GDBR_LOG_VERBOSE));
if (log)
{
@@ -722,9 +698,6 @@ main_gdbserver (int argc, char *argv[])
exit(255);
}
- // Run any commands requested.
- run_lldb_commands (debugger_sp, lldb_commands);
-
// Setup the platform that GDBRemoteCommunicationServerLLGS will use.
lldb::PlatformSP platform_sp = setup_platform (platform_name);
OpenPOWER on IntegriCloud