~ubuntu-core-dev/ubuntu/hirsute/apport/ubuntu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/python3

'''Receive details from ApportUncaughtExceptionHandler.

This generates and saves a problem report.
'''

# Copyright 2010 Canonical Ltd.
# Author: Matt Zimmerman <mdz@ubuntu.com>
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.  See http://www.gnu.org/copyleft/gpl.html for
# the full text of the license.

import sys

if sys.version_info.major < 3:
    from urlparse import urlparse
    urlparse  # pyflakes
else:
    from urllib.parse import urlparse


def make_title(report):
    lines = report['StackTrace'].split('\n')
    message = lines[0].strip()
    stackframe = lines[1].strip()
    return '%s in %s' % (message, stackframe)


def main():
    from apport.packaging_impl import impl as packaging
    if not packaging.enabled():
        return -1

    # read from the JVM process a sequence of key, value delimited by null
    # bytes
    items = sys.stdin.read().split('\0')
    d = dict()
    while items:
        key = items.pop(0)
        if not items:
            break
        value = items.pop(0)
        d[key] = value

    # create report
    import apport.report
    import os

    report = apport.report.Report(type='Crash')
    # assume our parent is the JVM process
    report.pid = os.getppid()

    report.add_os_info()
    report.add_proc_info()
    # these aren't relevant because the crash was in bytecode
    del report['ProcMaps']
    del report['ProcStatus']
    report.add_user_info()

    # add in data which was fed to us from the JVM process
    for key, value in d.items():
        report[key] = value

    # Add an ExecutablePath pointing to the file where the main class resides
    if 'MainClassUrl' in report:
        url = report['MainClassUrl']

        scheme, netloc, path, params, query, fragment = urlparse(url)

        if scheme == 'jar':
            # path is then a URL to the jar file
            scheme, netloc, path, params, query, fragment = urlparse(path)
            if '!/' in path:
                path = path.split('!/', 1)[0]

        if scheme == 'file':
            report['ExecutablePath'] = path
        else:
            # Program at some non-file URL crashed. Give up.
            return

    report['Title'] = make_title(report)

    try:
        with apport.fileutils.make_report_file(report) as f:
            report.write(f)
    except (IOError, OSError) as e:
        apport.fatal('Cannot create report: ' + str(e))


if __name__ == '__main__':
    main()