[Lldb-commits] [lldb] r232801 - Support for truncate/append on log files
Pavel Labath
labath at google.com
Fri Mar 20 02:43:21 PDT 2015
Author: labath
Date: Fri Mar 20 04:43:20 2015
New Revision: 232801
URL: http://llvm.org/viewvc/llvm-project?rev=232801&view=rev
Log:
Support for truncate/append on log files
Summary:
Presently, if a log file already exists, lldb simply starts overwriting bits of it, without
truncating or anything. This patch makes it use eFileOptionFileTruncate by default. It also adds
an --append option, which will append to the file without truncating. A test is included.
Reviewers: clayborg
Subscribers: lldb-commits
Differential Revision: http://reviews.llvm.org/D8450
Modified:
lldb/trunk/include/lldb/Core/Log.h
lldb/trunk/include/lldb/Core/StreamFile.h
lldb/trunk/source/Commands/CommandObjectLog.cpp
lldb/trunk/source/Core/Debugger.cpp
lldb/trunk/source/Core/StreamFile.cpp
lldb/trunk/test/logging/TestLogging.py
Modified: lldb/trunk/include/lldb/Core/Log.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Log.h?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/Log.h (original)
+++ lldb/trunk/include/lldb/Core/Log.h Fri Mar 20 04:43:20 2015
@@ -47,6 +47,7 @@
#define LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD (1u << 5)
#define LLDB_LOG_OPTION_PREPEND_THREAD_NAME (1U << 6)
#define LLDB_LOG_OPTION_BACKTRACE (1U << 7)
+#define LLDB_LOG_OPTION_APPEND (1U << 8)
//----------------------------------------------------------------------
// Logging Functions
Modified: lldb/trunk/include/lldb/Core/StreamFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/StreamFile.h?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Core/StreamFile.h (original)
+++ lldb/trunk/include/lldb/Core/StreamFile.h Fri Mar 20 04:43:20 2015
@@ -37,6 +37,10 @@ public:
StreamFile (const char *path);
+ StreamFile (const char *path,
+ uint32_t options,
+ uint32_t permissions = lldb::eFilePermissionsFileDefault);
+
StreamFile (FILE *fh, bool transfer_ownership);
virtual
Modified: lldb/trunk/source/Commands/CommandObjectLog.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectLog.cpp?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectLog.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectLog.cpp Fri Mar 20 04:43:20 2015
@@ -146,6 +146,7 @@ public:
case 'p': log_options |= LLDB_LOG_OPTION_PREPEND_PROC_AND_THREAD;break;
case 'n': log_options |= LLDB_LOG_OPTION_PREPEND_THREAD_NAME; break;
case 'S': log_options |= LLDB_LOG_OPTION_BACKTRACE; break;
+ case 'a': log_options |= LLDB_LOG_OPTION_APPEND; break;
default:
error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
break;
@@ -223,6 +224,7 @@ CommandObjectLogEnable::CommandOptions::
{ LLDB_OPT_SET_1, false, "pid-tid", 'p', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Prepend all log lines with the process and thread ID that generates the log line." },
{ LLDB_OPT_SET_1, false, "thread-name",'n', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Prepend all log lines with the thread name for the thread that generates the log line." },
{ LLDB_OPT_SET_1, false, "stack", 'S', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Append a stack backtrace to each log line." },
+{ LLDB_OPT_SET_1, false, "append", 'a', OptionParser::eNoArgument, NULL, NULL, 0, eArgTypeNone, "Append to the log file instead of overwriting." },
{ 0, false, NULL, 0, 0, NULL, NULL, 0, eArgTypeNone, NULL }
};
Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Fri Mar 20 04:43:20 2015
@@ -1331,7 +1331,12 @@ Debugger::EnableLog (const char *channel
log_stream_sp = pos->second.lock();
if (!log_stream_sp)
{
- log_stream_sp.reset (new StreamFile (log_file));
+ uint32_t options = File::eOpenOptionWrite | File::eOpenOptionCanCreate
+ | File::eOpenOptionCloseOnExec | File::eOpenOptionAppend;
+ if (! (log_options & LLDB_LOG_OPTION_APPEND))
+ options |= File::eOpenOptionTruncate;
+
+ log_stream_sp.reset (new StreamFile (log_file, options));
m_log_streams[log_file] = log_stream_sp;
}
}
Modified: lldb/trunk/source/Core/StreamFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/StreamFile.cpp?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/source/Core/StreamFile.cpp (original)
+++ lldb/trunk/source/Core/StreamFile.cpp Fri Mar 20 04:43:20 2015
@@ -54,6 +54,13 @@ StreamFile::StreamFile (const char *path
{
}
+StreamFile::StreamFile (const char *path,
+ uint32_t options,
+ uint32_t permissions) :
+ Stream(),
+ m_file(path, options, permissions)
+{
+}
StreamFile::~StreamFile()
{
Modified: lldb/trunk/test/logging/TestLogging.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/logging/TestLogging.py?rev=232801&r1=232800&r2=232801&view=diff
==============================================================================
--- lldb/trunk/test/logging/TestLogging.py (original)
+++ lldb/trunk/test/logging/TestLogging.py Fri Mar 20 04:43:20 2015
@@ -2,7 +2,7 @@
Test lldb logging. This test just makes sure logging doesn't crash, and produces some output.
"""
-import os, time
+import os, time, string
import unittest2
import lldb
from lldbtest import *
@@ -10,6 +10,15 @@ from lldbtest import *
class LogTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
+ append_log_file = "lldb-commands-log-append.txt"
+ truncate_log_file = "lldb-commands-log-truncate.txt"
+
+
+ @classmethod
+ def classCleanup(cls):
+ """Cleanup the test byproducts."""
+ cls.RemoveTempFile(cls.truncate_log_file)
+ cls.RemoveTempFile(cls.append_log_file)
@unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin")
@dsym_test
@@ -56,6 +65,48 @@ class LogTestCase(TestBase):
self.assertTrue(log_lines > 0, "Something was written to the log file.")
+ # Check that lldb truncates its log files
+ def test_log_truncate (self):
+ if (os.path.exists (self.truncate_log_file)):
+ os.remove (self.truncate_log_file)
+
+ # put something in our log file
+ with open(self.truncate_log_file, "w") as f:
+ for i in range(1, 1000):
+ f.write("bacon\n")
+
+ self.runCmd ("log enable -t -f '%s' lldb commands" % (self.truncate_log_file))
+ self.runCmd ("help log")
+ self.runCmd ("log disable lldb")
+
+ self.assertTrue (os.path.isfile (self.truncate_log_file))
+ with open(self.truncate_log_file, "r") as f:
+ contents = f.read ()
+
+ # check that it got removed
+ self.assertTrue(string.find(contents, "bacon") == -1)
+
+ # Check that lldb can append to a log file
+ def test_log_append (self):
+ if (os.path.exists (self.append_log_file)):
+ os.remove (self.append_log_file)
+
+ # put something in our log file
+ with open(self.append_log_file, "w") as f:
+ f.write("bacon\n")
+
+ self.runCmd ("log enable -t -a -f '%s' lldb commands" % (self.append_log_file))
+ self.runCmd ("help log")
+ self.runCmd ("log disable lldb")
+
+ self.assertTrue (os.path.isfile (self.append_log_file))
+ with open(self.append_log_file, "r") as f:
+ contents = f.read ()
+
+ # check that it is still there
+ self.assertTrue(string.find(contents, "bacon") == 0)
+
+
if __name__ == '__main__':
import atexit
lldb.SBDebugger.Initialize()
More information about the lldb-commits
mailing list