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 |