From 2ef59d1ec8dbb9d3d221309f04c71e2a562e771c Mon Sep 17 00:00:00 2001 From: Qin Zhao Date: Wed, 18 Nov 2015 17:21:48 -0500 Subject: Merge to XFA: Add Dr. Memory tool This CL adds DrMemory-Windows-sfx.exe into tools/drmemory. It also adds a set of scripts from chromium/src/tools/valgrind for running Dr. Memory. Now we can run pdfium tests with Dr. Memory: $ .\tools\drmemory\scripts\pdfium_tests.bat -b out\Debug -t pdfium_unittests More update on scripts is required, but this should be a good start. Changes from chromium/src/tools/valgrind - rename chrome_tests.py to pdfium_tests.py - update pdfium_tests.bat - remove chrome tests in pdfium_tests.py - remove memcheck code in valgrind_test.py R=thestig@chromium.org BUG=pdfium:238 Review URL: https://codereview.chromium.org/1452293002 . (cherry picked from commit 4dcf313c46c176e5afa1328f5f07fce4e614366d) Review URL: https://codereview.chromium.org/1452373004 . --- tools/drmemory/scripts/logging_utils.py | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 tools/drmemory/scripts/logging_utils.py (limited to 'tools/drmemory/scripts/logging_utils.py') diff --git a/tools/drmemory/scripts/logging_utils.py b/tools/drmemory/scripts/logging_utils.py new file mode 100644 index 0000000000..ef2d674950 --- /dev/null +++ b/tools/drmemory/scripts/logging_utils.py @@ -0,0 +1,82 @@ +# Copyright (c) 2011 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +''' Utility functions and objects for logging. +''' + +import logging +import sys + +class StdoutStderrHandler(logging.Handler): + ''' Subclass of logging.Handler which outputs to either stdout or stderr + based on a threshold level. + ''' + + def __init__(self, threshold=logging.WARNING, err=sys.stderr, out=sys.stdout): + ''' Args: + threshold: below this logging level messages are sent to stdout, + otherwise they are sent to stderr + err: a stream object that error messages are sent to, defaults to + sys.stderr + out: a stream object that non-error messages are sent to, defaults to + sys.stdout + ''' + logging.Handler.__init__(self) + self._err = logging.StreamHandler(err) + self._out = logging.StreamHandler(out) + self._threshold = threshold + self._last_was_err = False + + def setLevel(self, lvl): + logging.Handler.setLevel(self, lvl) + self._err.setLevel(lvl) + self._out.setLevel(lvl) + + def setFormatter(self, formatter): + logging.Handler.setFormatter(self, formatter) + self._err.setFormatter(formatter) + self._out.setFormatter(formatter) + + def emit(self, record): + if record.levelno < self._threshold: + self._out.emit(record) + self._last_was_err = False + else: + self._err.emit(record) + self._last_was_err = False + + def flush(self): + # preserve order on the flushing, the stalest stream gets flushed first + if self._last_was_err: + self._out.flush() + self._err.flush() + else: + self._err.flush() + self._out.flush() + + +FORMAT = "%(asctime)s %(filename)s [%(levelname)s] %(message)s" +DATEFMT = "%H:%M:%S" + +def config_root(level=logging.INFO, threshold=logging.WARNING, format=FORMAT, + datefmt=DATEFMT): + ''' Configure the root logger to use a StdoutStderrHandler and some default + formatting. + Args: + level: messages below this level are ignored + threshold: below this logging level messages are sent to stdout, + otherwise they are sent to stderr + format: format for log messages, see logger.Format + datefmt: format for date in log messages + + ''' + # to set the handler of the root logging object, we need to do setup + # manually rather than using basicConfig + root = logging.getLogger() + root.setLevel(level) + formatter = logging.Formatter(format, datefmt) + handler = StdoutStderrHandler(threshold=threshold) + handler.setLevel(level) + handler.setFormatter(formatter) + root.addHandler(handler) -- cgit v1.2.3