1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# Copyright 2014 The Chromium Authors. All rights reserved. 2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# Use of this source code is governed by a BSD-style license that can be 3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# found in the LICENSE file. 4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch"""Hooks that apply globally to all scripts that import or use Telemetry.""" 6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport signal 8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport sys 9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochfrom telemetry.util import exception_formatter 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef InstallHooks(): 14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InstallUnhandledExceptionFormatter() 15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InstallStackDumpOnSigusr1() 16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InstallTerminationHook() 17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef InstallUnhandledExceptionFormatter(): 20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch """Print prettier exceptions that also contain the stack frame's locals.""" 21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sys.excepthook = exception_formatter.PrintFormattedException 22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef InstallStackDumpOnSigusr1(): 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch """Catch SIGUSR1 and print a stack trace.""" 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch # Windows doesn't define SIGUSR1. 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if not hasattr(signal, 'SIGUSR1'): 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch return 29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def PrintDiagnostics(_, stack_frame): 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch exception_string = 'SIGUSR1 received, printed stack trace' 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch exception_formatter.PrintFormattedFrame(stack_frame, exception_string) 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch signal.signal(signal.SIGUSR1, PrintDiagnostics) 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochdef InstallTerminationHook(): 37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch """Catch SIGTERM, print a stack trace, and exit.""" 38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch def PrintStackAndExit(sig, stack_frame): 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch exception_string = 'Received signal %s, exiting' % sig 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch exception_formatter.PrintFormattedFrame(stack_frame, exception_string) 41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch sys.exit(-1) 42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch signal.signal(signal.SIGTERM, PrintStackAndExit) 43