You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							71 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							71 lines
						
					
					
						
							2.0 KiB
						
					
					
				"""Install exception handler for process crash."""
 | 
						|
import os
 | 
						|
import sys
 | 
						|
import threading
 | 
						|
import capnp
 | 
						|
from selfdrive.version import version, dirty
 | 
						|
 | 
						|
from selfdrive.swaglog import cloudlog
 | 
						|
from common.android import ANDROID
 | 
						|
 | 
						|
if os.getenv("NOLOG") or os.getenv("NOCRASH") or not ANDROID:
 | 
						|
  def capture_exception(*args, **kwargs):
 | 
						|
    pass
 | 
						|
 | 
						|
  def bind_user(**kwargs):
 | 
						|
    pass
 | 
						|
 | 
						|
  def bind_extra(**kwargs):
 | 
						|
    pass
 | 
						|
 | 
						|
  def install():
 | 
						|
    pass
 | 
						|
else:
 | 
						|
  from raven import Client
 | 
						|
  from raven.transport.http import HTTPTransport
 | 
						|
  client = Client('https://1994756b5e6f41cf939a4c65de45f4f2:cefebaf3a8aa40d182609785f7189bd7@app.getsentry.com/77924',
 | 
						|
                  install_sys_hook=False, transport=HTTPTransport, release=version, tags={'dirty': dirty})
 | 
						|
 | 
						|
  def capture_exception(*args, **kwargs):
 | 
						|
    exc_info = sys.exc_info()
 | 
						|
    if not exc_info[0] is capnp.lib.capnp.KjException:
 | 
						|
      client.captureException(*args, **kwargs)
 | 
						|
    cloudlog.error("crash", exc_info=kwargs.get('exc_info', 1))
 | 
						|
 | 
						|
  def bind_user(**kwargs):
 | 
						|
    client.user_context(kwargs)
 | 
						|
 | 
						|
  def bind_extra(**kwargs):
 | 
						|
    client.extra_context(kwargs)
 | 
						|
 | 
						|
  def install():
 | 
						|
    """
 | 
						|
    Workaround for `sys.excepthook` thread bug from:
 | 
						|
    http://bugs.python.org/issue1230540
 | 
						|
    Call once from the main thread before creating any threads.
 | 
						|
    Source: https://stackoverflow.com/a/31622038
 | 
						|
    """
 | 
						|
    # installs a sys.excepthook
 | 
						|
    __excepthook__ = sys.excepthook
 | 
						|
 | 
						|
    def handle_exception(*exc_info):
 | 
						|
      if exc_info[0] not in (KeyboardInterrupt, SystemExit):
 | 
						|
        capture_exception()
 | 
						|
      __excepthook__(*exc_info)
 | 
						|
    sys.excepthook = handle_exception
 | 
						|
 | 
						|
    init_original = threading.Thread.__init__
 | 
						|
 | 
						|
    def init(self, *args, **kwargs):
 | 
						|
      init_original(self, *args, **kwargs)
 | 
						|
      run_original = self.run
 | 
						|
 | 
						|
      def run_with_except_hook(*args2, **kwargs2):
 | 
						|
        try:
 | 
						|
          run_original(*args2, **kwargs2)
 | 
						|
        except Exception:
 | 
						|
          sys.excepthook(*sys.exc_info())
 | 
						|
 | 
						|
      self.run = run_with_except_hook
 | 
						|
 | 
						|
    threading.Thread.__init__ = init
 | 
						|
 |