Merge lp:~mbp/bzr/integration into lp:bzr

Proposed by Martin Pool
Status: Merged
Approved by: Martin Pool
Approved revision: no longer in the revision history of the source branch.
Merged at revision: 5484
Proposed branch: lp:~mbp/bzr/integration
Merge into: lp:bzr
Diff against target: 127 lines (+45/-2)
5 files modified
NEWS (+4/-0)
bzrlib/help_topics/en/debug-flags.txt (+1/-0)
bzrlib/tests/features.py (+3/-1)
bzrlib/tests/test_trace.py (+13/-1)
bzrlib/trace.py (+24/-0)
To merge this branch: bzr merge lp:~mbp/bzr/integration
Reviewer Review Type Date Requested Status
bzr-core Pending
Review via email: mp+38166@code.launchpad.net

Commit message

add -Dmem_dump

Description of the change

Integrate vila and Karl's work on -Dmem_dump.

To post a comment you must log in.
Revision history for this message
Martin Pool (mbp) wrote :

sent to pqm by email

lp:~mbp/bzr/integration updated
5484. By Canonical.com Patch Queue Manager <email address hidden>

(mbp) add -Dmem_dump (Martin Pool)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'NEWS'
2--- NEWS 2010-10-11 23:21:22 +0000
3+++ NEWS 2010-10-11 23:57:06 +0000
4@@ -70,6 +70,10 @@
5 * Add ``annotate`` revision specifier, which selects the revision that
6 introduced a specified line of a file. (Aaron Bentley)
7
8+* Add ``-Dmem_dump`` debug flag, which uses meliae to dump memory to
9+ a file upon an out of memory error.
10+ (Karl Bielefeldt, #551391)
11+
12 * ``bzr status`` now displays a summary of existing shelves after
13 the other status information. This is done using a ``post_status``
14 hook.
15
16=== modified file 'bzrlib/help_topics/en/debug-flags.txt'
17--- bzrlib/help_topics/en/debug-flags.txt 2010-01-05 04:30:07 +0000
18+++ bzrlib/help_topics/en/debug-flags.txt 2010-10-11 23:57:06 +0000
19@@ -25,6 +25,7 @@
20 -Dknit Trace knit operations.
21 -Dlock Trace when lockdir locks are taken or released.
22 -Dprogress Trace progress bar operations.
23+-Dmem_dump Dump memory to a file upon an out of memory error.
24 -Dmerge Emit information for debugging merges.
25 -Dno_apport Don't use apport to report crashes.
26 -Dno_activity Don't show transport activity indicator in progress bar.
27
28=== modified file 'bzrlib/tests/features.py'
29--- bzrlib/tests/features.py 2010-09-27 19:31:45 +0000
30+++ bzrlib/tests/features.py 2010-10-11 23:57:06 +0000
31@@ -38,12 +38,14 @@
32
33
34 not_running_as_root = _NotRunningAsRoot()
35+
36 apport = tests.ModuleAvailableFeature('apport')
37+meliae = tests.ModuleAvailableFeature('meliae')
38 paramiko = tests.ModuleAvailableFeature('paramiko')
39 pycurl = tests.ModuleAvailableFeature('pycurl')
40 pywintypes = tests.ModuleAvailableFeature('pywintypes')
41+sphinx = tests.ModuleAvailableFeature('sphinx')
42 subunit = tests.ModuleAvailableFeature('subunit')
43-sphinx = tests.ModuleAvailableFeature('sphinx')
44
45
46 class _BackslashDirSeparatorFeature(tests.Feature):
47
48=== modified file 'bzrlib/tests/test_trace.py'
49--- bzrlib/tests/test_trace.py 2010-06-26 01:07:16 +0000
50+++ bzrlib/tests/test_trace.py 2010-10-11 23:57:06 +0000
51@@ -26,6 +26,7 @@
52 import tempfile
53
54 from bzrlib import (
55+ debug,
56 errors,
57 trace,
58 )
59@@ -81,7 +82,18 @@
60 pass
61 msg = _format_exception()
62 self.assertEquals(msg,
63- "bzr: out of memory\n")
64+ "bzr: out of memory\nUse -Dmem_dump to dump memory to a file.\n")
65+
66+ def test_format_mem_dump(self):
67+ self.requireFeature(features.meliae)
68+ debug.debug_flags.add('mem_dump')
69+ try:
70+ raise MemoryError()
71+ except MemoryError:
72+ pass
73+ msg = _format_exception()
74+ self.assertStartsWith(msg,
75+ "bzr: out of memory\nMemory dumped to ")
76
77 def test_format_os_error(self):
78 try:
79
80=== modified file 'bzrlib/trace.py'
81--- bzrlib/trace.py 2010-06-28 02:41:22 +0000
82+++ bzrlib/trace.py 2010-10-11 23:57:06 +0000
83@@ -59,6 +59,7 @@
84 import os
85 import sys
86 import time
87+import tempfile
88
89 from bzrlib.lazy_import import lazy_import
90 lazy_import(globals(), """
91@@ -469,6 +470,25 @@
92 note(line)
93 break
94
95+def _dump_memory_usage(err_file):
96+ try:
97+ try:
98+ fd, name = tempfile.mkstemp(prefix="bzr_memdump", suffix=".json")
99+ dump_file = os.fdopen(fd, 'w')
100+ from meliae import scanner
101+ scanner.dump_gc_objects(dump_file)
102+ err_file.write("Memory dumped to %s\n" % name)
103+ except ImportError:
104+ err_file.write("Dumping memory requires meliae module.\n")
105+ log_exception_quietly()
106+ except:
107+ err_file.write("Exception while dumping memory.\n")
108+ log_exception_quietly()
109+ finally:
110+ if dump_file is not None:
111+ dump_file.close()
112+ elif fd is not None:
113+ os.close(fd)
114
115 def report_exception(exc_info, err_file):
116 """Report an exception to err_file (typically stderr) and to .bzr.log.
117@@ -492,6 +512,10 @@
118 return errors.EXIT_ERROR
119 elif isinstance(exc_object, MemoryError):
120 err_file.write("bzr: out of memory\n")
121+ if 'mem_dump' in debug.debug_flags:
122+ _dump_memory_usage(err_file)
123+ else:
124+ err_file.write("Use -Dmem_dump to dump memory to a file.\n")
125 return errors.EXIT_ERROR
126 elif isinstance(exc_object, ImportError) \
127 and str(exc_object).startswith("No module named "):