~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/crash.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-02-11 06:15:33 UTC
  • mfrom: (5025.1.6 331095-malloc)
  • Revision ID: pqm@pqm.ubuntu.com-20100211061533-5glf4faoutadhql9
(mbp) avoid malloc(0)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2009-2011 Canonical Ltd
 
1
# Copyright (C) 2009, 2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
A crash is an exception propagated up almost to the top level of Bazaar.
21
21
 
22
22
If we have apport <https://launchpad.net/apport/>, we store a report of the
23
 
crash using apport into its /var/crash spool directory, from where the user
 
23
crash using apport into it's /var/crash spool directory, from where the user
24
24
can either manually send it to Launchpad.  In some cases (at least Ubuntu
25
25
development releases), Apport may pop up a window asking if they want
26
26
to send it.
33
33
In principle apport can run on any platform though as of Feb 2010 there seem
34
34
to be some portability bugs.
35
35
 
36
 
To force this off in bzr turn set APPORT_DISABLE in the environment or 
 
36
To force this off in bzr turn set APPORT_DISBLE in the environment or 
37
37
-Dno_apport.
38
38
"""
39
39
 
84
84
    """Report a bug by just printing a message to the user."""
85
85
    trace.print_exception(exc_info, err_file)
86
86
    err_file.write('\n')
87
 
    import textwrap
88
 
    def print_wrapped(l):
89
 
        err_file.write(textwrap.fill(l,
90
 
            width=78, subsequent_indent='    ') + '\n')
91
 
    print_wrapped('bzr %s on python %s (%s)\n' % \
92
 
        (bzrlib.__version__,
93
 
        bzrlib._format_version_tuple(sys.version_info),
94
 
        platform.platform(aliased=1)))
95
 
    print_wrapped('arguments: %r\n' % sys.argv)
96
 
    print_wrapped(textwrap.fill(
97
 
        'plugins: ' + plugin.format_concise_plugin_list(),
98
 
        width=78,
99
 
        subsequent_indent='    ',
100
 
        ) + '\n')
101
 
    print_wrapped(
 
87
    err_file.write('bzr %s on python %s (%s)\n' % \
 
88
                       (bzrlib.__version__,
 
89
                        bzrlib._format_version_tuple(sys.version_info),
 
90
                        platform.platform(aliased=1)))
 
91
    err_file.write('arguments: %r\n' % sys.argv)
 
92
    err_file.write(
102
93
        'encoding: %r, fsenc: %r, lang: %r\n' % (
103
94
            osutils.get_user_encoding(), sys.getfilesystemencoding(),
104
95
            os.environ.get('LANG')))
105
 
    # We used to show all the plugins here, but it's too verbose.
 
96
    err_file.write("plugins:\n")
 
97
    err_file.write(_format_plugin_list())
106
98
    err_file.write(
107
 
        "\n"
 
99
        "\n\n"
108
100
        "*** Bazaar has encountered an internal error.  This probably indicates a\n"
109
101
        "    bug in Bazaar.  You can help us fix it by filing a bug report at\n"
110
102
        "        https://bugs.launchpad.net/bzr/+filebug\n"
120
112
    # this function is based on apport_package_hook.py, but omitting some of the
121
113
    # Ubuntu-specific policy about what to report and when
122
114
 
123
 
    # This import is apparently not used, but we're doing it so that if the
124
 
    # import fails, the exception will be caught at a higher level and we'll
125
 
    # report the error by other means.
 
115
    # if the import fails, the exception will be caught at a higher level and
 
116
    # we'll report the error by other means
126
117
    import apport
127
118
 
128
119
    crash_filename = _write_apport_report_to_file(exc_info)
152
143
    exc_type, exc_object, exc_tb = exc_info
153
144
 
154
145
    pr = Report()
155
 
    # add_proc_info sets the ExecutablePath, InterpreterPath, etc.
 
146
    # add_proc_info gets the executable and interpreter path, which is needed,
 
147
    # plus some less useful stuff like the memory map
156
148
    pr.add_proc_info()
157
 
    # It also adds ProcMaps which for us is rarely useful and mostly noise, so
158
 
    # let's remove it.
159
 
    del pr['ProcMaps']
160
149
    pr.add_user_info()
161
150
 
162
151
    # Package and SourcePackage are needed so that apport will report about even
176
165
    pr['PythonLoadedModules'] = _format_module_list()
177
166
    pr['BzrDebugFlags'] = pprint.pformat(debug.debug_flags)
178
167
 
179
 
    # actually we'd rather file directly against the upstream product, but
180
 
    # apport does seem to count on there being one in there; we might need to
181
 
    # redirect it elsewhere anyhow
182
 
    pr['SourcePackage'] = 'bzr'
183
 
    pr['Package'] = 'bzr'
184
 
 
185
 
    # tell apport to file directly against the bzr package using 
186
 
    # <https://bugs.launchpad.net/bzr/+bug/391015>
187
 
    #
188
 
    # XXX: unfortunately apport may crash later if the crashdb definition
189
 
    # file isn't present
190
 
    pr['CrashDb'] = 'bzr'
191
 
 
192
168
    tb_file = StringIO()
193
169
    traceback.print_exception(exc_type, exc_object, exc_tb, file=tb_file)
194
170
    pr['Traceback'] = tb_file.getvalue()
264
240
 
265
241
 
266
242
def _format_plugin_list():
267
 
    return ''.join(plugin.describe_plugins(show_paths=True))
 
243
    plugin_lines = []
 
244
    for name, a_plugin in sorted(plugin.plugins().items()):
 
245
        plugin_lines.append("  %-20s %s [%s]" %
 
246
            (name, a_plugin.path(), a_plugin.__version__))
 
247
    return '\n'.join(plugin_lines)
268
248
 
269
249
 
270
250
def _format_module_list():