summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2017-03-22 18:19:00 -0400
committerEddie Louie <eddie.louie@mongodb.com>2017-05-02 15:44:34 -0400
commit95e74f808a49c064d39d9d6cce6e4aca47239038 (patch)
tree26b32b033b477ff74dc224abd843012fa49fd5cc
parentb1f79e14f1a0f0a4b48600c54cd977668322169d (diff)
downloadmongo-95e74f808a49c064d39d9d6cce6e4aca47239038.tar.gz
SERVER-27727 Dump raw stacks to a file so we have them if we need them
(cherry picked from commit 65fa51f459d54f31fdb30d44d5c17c700b9ff4b2)
-rwxr-xr-xbuildscripts/hang_analyzer.py23
1 files changed, 20 insertions, 3 deletions
diff --git a/buildscripts/hang_analyzer.py b/buildscripts/hang_analyzer.py
index b85442da742..edc0550609b 100755
--- a/buildscripts/hang_analyzer.py
+++ b/buildscripts/hang_analyzer.py
@@ -115,6 +115,7 @@ def find_program(prog, paths):
def get_process_logger(debugger_output, pid, process_name):
"""Returns the process logger from options specified."""
process_logger = logging.Logger("process", level=logging.DEBUG)
+ process_logger.mongo_process_filename = None
if 'stdout' in debugger_output:
handler = logging.StreamHandler(sys.stdout)
@@ -122,9 +123,9 @@ def get_process_logger(debugger_output, pid, process_name):
process_logger.addHandler(handler)
if 'file' in debugger_output:
- handler = logging.FileHandler(
- filename="debugger_%s_%d.log" % (os.path.splitext(process_name)[0], pid),
- mode="w")
+ filename = "debugger_%s_%d.log" % (os.path.splitext(process_name)[0], pid)
+ process_logger.mongo_process_filename = filename
+ handler = logging.FileHandler(filename=filename, mode="w")
handler.setFormatter(logging.Formatter(fmt="%(message)s"))
process_logger.addHandler(handler)
@@ -371,6 +372,21 @@ class GDBDumper(object):
mongodb_waitsfor_graph = ""
mongodb_javascript_stack = ""
+ if not logger.mongo_process_filename:
+ raw_stacks_commands = []
+ else:
+ base, ext = os.path.splitext(logger.mongo_process_filename)
+ raw_stacks_filename = base + '_raw_stacks' + ext
+ raw_stacks_commands = [
+ 'echo \\nWriting raw stacks to %s.\\n' % raw_stacks_filename,
+ # This sends output to log file rather than stdout until we turn logging off.
+ 'set logging redirect on',
+ 'set logging file ' + raw_stacks_filename,
+ 'set logging on',
+ 'thread apply all bt',
+ 'set logging off',
+ ]
+
cmds = [
"set interactive-mode off",
"set print thread-events off", # Python calls to gdb.parse_and_eval may cause threads
@@ -381,6 +397,7 @@ class GDBDumper(object):
"info sharedlibrary",
"info threads", # Dump a simple list of commands to get the thread name
"set python print-stack full",
+ ] + raw_stacks_commands + [
stack_bt,
"source %s" % printers_script,
source_mongo_lock,