Your IP : 172.28.240.42


Current Path : /usr/share/apport/
Upload File :
Current File : //usr/share/apport/java_uncaught_exception

#!/usr/bin/python

'''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

#from apport import unicode_gettext as _

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:
		import urlparse
		url = report['MainClassUrl']

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

		if scheme == 'jar':
			# path is then a URL to the jar file
			scheme, netloc, path, params, query, fragment = urlparse.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()