Rev 5481: Merge lp:~vila/bzr/551391-log-memory-usage fixing NEWS entry in http://bazaar.launchpad.net/~vila/bzr/integration/

Vincent Ladeuil v.ladeuil+lp at free.fr
Mon Oct 11 15:18:33 BST 2010


At http://bazaar.launchpad.net/~vila/bzr/integration/

------------------------------------------------------------
revno: 5481 [merge]
revision-id: v.ladeuil+lp at free.fr-20101011141833-v2iqkdnafk2tioxb
parent: pqm at pqm.ubuntu.com-20101011114147-eunz0zgx5yjftom0
parent: v.ladeuil+lp at free.fr-20101011095316-grl1yn3o5j7uo419
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: trunk
timestamp: Mon 2010-10-11 16:18:33 +0200
message:
  Merge lp:~vila/bzr/551391-log-memory-usage fixing NEWS entry
modified:
  NEWS                           NEWS-20050323055033-4e00b5db738777ff
  bzrlib/help_topics/en/debug-flags.txt debugflags.txt-20090312050229-rdspqbqq4fzbjtpe-1
  bzrlib/tests/features.py       features.py-20090820042958-jglgza3wrn03ha9e-1
  bzrlib/tests/test_trace.py     testtrace.py-20051110225523-a21117fc7a07eeff
  bzrlib/trace.py                trace.py-20050309040759-c8ed824bdcd4748a
-------------- next part --------------
=== modified file 'NEWS'
--- a/NEWS	2010-10-11 10:27:23 +0000
+++ b/NEWS	2010-10-11 14:18:33 +0000
@@ -16,6 +16,10 @@
 New Features
 ************
 
+* Add ``-Dmem_dump`` debug flag, which uses meliae to dump memory to 
+  a file upon an out of memory error.
+  (Karl Bielefeldt, #551391)
+
 Bug Fixes
 *********
 

=== modified file 'bzrlib/help_topics/en/debug-flags.txt'
--- a/bzrlib/help_topics/en/debug-flags.txt	2010-01-05 04:30:07 +0000
+++ b/bzrlib/help_topics/en/debug-flags.txt	2010-10-06 03:20:28 +0000
@@ -25,6 +25,7 @@
 -Dknit            Trace knit operations.
 -Dlock            Trace when lockdir locks are taken or released.
 -Dprogress        Trace progress bar operations.
+-Dmem_dump        Dump memory to a file upon an out of memory error.
 -Dmerge           Emit information for debugging merges.
 -Dno_apport       Don't use apport to report crashes.
 -Dno_activity 	  Don't show transport activity indicator in progress bar.

=== modified file 'bzrlib/tests/features.py'
--- a/bzrlib/tests/features.py	2010-09-27 19:31:45 +0000
+++ b/bzrlib/tests/features.py	2010-10-11 09:53:16 +0000
@@ -38,12 +38,14 @@
 
 
 not_running_as_root = _NotRunningAsRoot()
+
 apport = tests.ModuleAvailableFeature('apport')
+meliae = tests.ModuleAvailableFeature('meliae')
 paramiko = tests.ModuleAvailableFeature('paramiko')
 pycurl = tests.ModuleAvailableFeature('pycurl')
 pywintypes = tests.ModuleAvailableFeature('pywintypes')
+sphinx = tests.ModuleAvailableFeature('sphinx')
 subunit = tests.ModuleAvailableFeature('subunit')
-sphinx = tests.ModuleAvailableFeature('sphinx')
 
 
 class _BackslashDirSeparatorFeature(tests.Feature):

=== modified file 'bzrlib/tests/test_trace.py'
--- a/bzrlib/tests/test_trace.py	2010-06-26 01:07:16 +0000
+++ b/bzrlib/tests/test_trace.py	2010-10-11 09:53:16 +0000
@@ -26,6 +26,7 @@
 import tempfile
 
 from bzrlib import (
+    debug,
     errors,
     trace,
     )
@@ -81,7 +82,18 @@
             pass
         msg = _format_exception()
         self.assertEquals(msg,
-            "bzr: out of memory\n")
+            "bzr: out of memory\nUse -Dmem_dump to dump memory to a file.\n")
+
+    def test_format_mem_dump(self):
+        self.requireFeature(features.meliae)
+        debug.debug_flags.add('mem_dump')
+        try:
+            raise MemoryError()
+        except MemoryError:
+            pass
+        msg = _format_exception()
+        self.assertStartsWith(msg,
+            "bzr: out of memory\nMemory dumped to ")
 
     def test_format_os_error(self):
         try:

=== modified file 'bzrlib/trace.py'
--- a/bzrlib/trace.py	2010-06-28 02:41:22 +0000
+++ b/bzrlib/trace.py	2010-10-05 23:30:18 +0000
@@ -59,6 +59,7 @@
 import os
 import sys
 import time
+import tempfile
 
 from bzrlib.lazy_import import lazy_import
 lazy_import(globals(), """
@@ -469,6 +470,25 @@
                     note(line)
                     break
 
+def _dump_memory_usage(err_file):
+    try:
+        try:
+            fd, name = tempfile.mkstemp(prefix="bzr_memdump", suffix=".json")
+            dump_file = os.fdopen(fd, 'w')
+            from meliae import scanner
+            scanner.dump_gc_objects(dump_file)
+            err_file.write("Memory dumped to %s\n" % name)
+        except ImportError:
+            err_file.write("Dumping memory requires meliae module.\n")
+            log_exception_quietly()
+        except:
+            err_file.write("Exception while dumping memory.\n")
+            log_exception_quietly()
+    finally:
+        if dump_file is not None:
+            dump_file.close()
+        elif fd is not None:
+            os.close(fd)
 
 def report_exception(exc_info, err_file):
     """Report an exception to err_file (typically stderr) and to .bzr.log.
@@ -492,6 +512,10 @@
         return errors.EXIT_ERROR
     elif isinstance(exc_object, MemoryError):
         err_file.write("bzr: out of memory\n")
+        if 'mem_dump' in debug.debug_flags:
+            _dump_memory_usage(err_file)
+        else:
+            err_file.write("Use -Dmem_dump to dump memory to a file.\n")
         return errors.EXIT_ERROR
     elif isinstance(exc_object, ImportError) \
         and str(exc_object).startswith("No module named "):



More information about the bazaar-commits mailing list