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