| OLD | NEW |
| 1 # Copyright (C) 2011 Google Inc. All rights reserved. | 1 # Copyright (C) 2011 Google Inc. All rights reserved. |
| 2 # | 2 # |
| 3 # Redistribution and use in source and binary forms, with or without | 3 # Redistribution and use in source and binary forms, with or without |
| 4 # modification, are permitted provided that the following conditions are | 4 # modification, are permitted provided that the following conditions are |
| 5 # met: | 5 # met: |
| 6 # | 6 # |
| 7 # * Redistributions of source code must retain the above copyright | 7 # * Redistributions of source code must retain the above copyright |
| 8 # notice, this list of conditions and the following disclaimer. | 8 # notice, this list of conditions and the following disclaimer. |
| 9 # * Redistributions in binary form must reproduce the above | 9 # * Redistributions in binary form must reproduce the above |
| 10 # copyright notice, this list of conditions and the following disclaimer | 10 # copyright notice, this list of conditions and the following disclaimer |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 stack = _find_thread_stack(thread_id) | 37 stack = _find_thread_stack(thread_id) |
| 38 assert stack is not None | 38 assert stack is not None |
| 39 logger("") | 39 logger("") |
| 40 logger("%s (tid %d) %s" % (name, thread_id, msg)) | 40 logger("%s (tid %d) %s" % (name, thread_id, msg)) |
| 41 _log_stack(logger, stack) | 41 _log_stack(logger, stack) |
| 42 logger("") | 42 logger("") |
| 43 | 43 |
| 44 | 44 |
| 45 def _find_thread_stack(thread_id): | 45 def _find_thread_stack(thread_id): |
| 46 """Returns a stack object that can be used to dump a stack trace for | 46 """Returns a stack object that can be used to dump a stack trace for |
| 47 the given thread id (or None if the id is not found).""" | 47 the given thread id (or None if the id is not found). |
| 48 """ |
| 48 for tid, stack in sys._current_frames().items(): | 49 for tid, stack in sys._current_frames().items(): |
| 49 if tid == thread_id: | 50 if tid == thread_id: |
| 50 return stack | 51 return stack |
| 51 return None | 52 return None |
| 52 | 53 |
| 53 | 54 |
| 54 def _log_stack(logger, stack): | 55 def _log_stack(logger, stack): |
| 55 """Log a stack trace to the logger callback.""" | 56 """Log a stack trace to the logger callback.""" |
| 56 for filename, lineno, name, line in traceback.extract_stack(stack): | 57 for filename, lineno, name, line in traceback.extract_stack(stack): |
| 57 logger('File: "%s", line %d, in %s' % (filename, lineno, name)) | 58 logger('File: "%s", line %d, in %s' % (filename, lineno, name)) |
| 58 if line: | 59 if line: |
| 59 logger(' %s' % line.strip()) | 60 logger(' %s' % line.strip()) |
| 60 | 61 |
| 61 | 62 |
| 62 def log_traceback(logger, tb): | 63 def log_traceback(logger, tb): |
| 63 stack = traceback.extract_tb(tb) | 64 stack = traceback.extract_tb(tb) |
| 64 for frame_str in traceback.format_list(stack): | 65 for frame_str in traceback.format_list(stack): |
| 65 for line in frame_str.split('\n'): | 66 for line in frame_str.split('\n'): |
| 66 if line: | 67 if line: |
| 67 logger(" %s" % line) | 68 logger(" %s" % line) |
| OLD | NEW |